codeforces gym101482 D Digi Comp II 拓朴+规律

2024-03-21 08:40

本文主要是介绍codeforces gym101482 D Digi Comp II 拓朴+规律,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://vjudge.net/problem/Gym-101482D
在这里插入图片描述
题目大意:给出 m m m个开关的初始状态 L 、 R L、R LR,以及这个开关左侧连接的开关编号和右侧连接的开关编号, 1 1 1号开关为起点, 0 0 0号开关为终点, n n n个球依次从起点滚下,当经过一个开关时,会走向其状态对应的开关,同时翻转该状态。请输出最终 m m m个开关的状态。

思路:先找一波规律,显然当有 n n n个球经过开关 u u u时,通过 n n n的奇偶性以及 u u u的初始状态很容易得到最终的状态。而且会有 n / 2 + n & 1 n/2+n\&1 n/2+n&1个球经过它初始状态指向的开关,有 n / 2 n/2 n/2个球经过另一个状态的开关。那么这就给了我们启发,以拓朴序的方式进行递推,就可以得到每个开关的最终状态。注意坑点一,不一定只有起点 1 1 1的入度为 0 0 0。坑点二,有些开关的 L 、 R L、R LR对应的编号是相同的,入队的时候要注意。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-10
#define pr pair<int,int>
using namespace std;
typedef long long ll;const int maxn=5e5+5;ll n;
int m;
int ind[maxn],l[maxn],r[maxn],ans[maxn];
ll val[maxn];
char s[maxn][2];
queue<int> q;int main()
{scanf("%lld%d",&n,&m);for(int i=1;i<=m;i++){scanf("%s%d%d",s[i],&l[i],&r[i]);++ind[l[i]],++ind[r[i]];}for(int i=1;i<=m;i++)if(!ind[i])q.push(i);val[1]=n;int u;while(!q.empty()){u=q.front();q.pop();ans[u]=val[u]&1;if(s[u][0]=='L'){val[l[u]]+=val[u]-(val[u]>>1);val[r[u]]+=val[u]>>1;}else{val[r[u]]+=val[u]-(val[u]>>1);val[l[u]]+=val[u]>>1;}if(--ind[l[u]]==0)q.push(l[u]);if(--ind[r[u]]==0)q.push(r[u]);}for(int i=1;i<=m;i++){if(ans[i])printf("%c",s[i][0]=='L'?'R':'L');elseprintf("%c",s[i][0]);}return 0;
}

这篇关于codeforces gym101482 D Digi Comp II 拓朴+规律的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832237

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图