BZOJ 4551 HEOI 2016 树 (并查集)
思路:
考虑时光倒流
这不就是并查集裸题了…………….
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 500500
int n,q,xx,yy,v[N],first[N],next[N],tot,fa[N],f[N],ask[N],vis[N],ans[N];char op[N][5];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x])fa[v[i]]=x,dfs(v[i]);}
int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
dfs(1);
for(int i=1;i<=q;i++){
scanf("%s%d",op[i],&ask[i]);
if(op[i][0]=='C')vis[ask[i]]++;
}
f[1]=fa[1]=1;
for(int i=2;i<=n;i++)if(!vis[i])f[i]=fa[i];else f[i]=i;
for(int i=q;i;i--){
if(op[i][0]=='C'&&!--vis[ask[i]])f[ask[i]]=fa[ask[i]];
else ans[i]=find(ask[i]);
}
for(int i=1;i<=q;i++)
if(op[i][0]=='Q')printf("%d\n",ans[i]);
}
BZOJ 4551 HEOI 2016 树 (并查集)的更多相关文章
- BZOJ 4551 [Tjoi2016&Heoi2016]树 ——并查集
树剖显然可以做. 然而有一种更神奇的方法,并查集+时光倒流. 每个节点指向它上面最近的标记节点,标记节点指向自己,然后删除标记,就可以用并查集查询了. #include <map> #in ...
- BZOJ 4551: [Tjoi2016&Heoi2016]树 并查集(&&图论?)
反向操作,先把所有的标记都打上(记得统计标记的数目),然后依次撤销,合并到自己的上一个点pre,即fa[u]=getf(pre[u]) #include<cstdio> #include& ...
- BZOJ 1453 (线段树+并查集)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...
- BZOJ.2054.疯狂的馒头(并查集)
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...
- [WC2005]双面棋盘(线段树+并查集)
线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...
- 洛谷 - P1552 - 派遣 - 左偏树 - 并查集
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...
- 洛谷 - P3377 - 【模板】左偏树(可并堆) - 左偏树 - 并查集
https://www.luogu.org/problemnew/show/P3377 左偏树+并查集 左偏树维护两个可合并的堆,并查集维护两个堆元素合并后可以找到正确的树根. 关键点在于删除一个堆的 ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- 2021.08.03 BZOJ 疯狂的馒头(并查集)
2021.08.03 BZOJ 疯狂的馒头(并查集) 疯狂的馒头 - 题目 - 黑暗爆炸OJ (darkbzoj.tk) 重点: 1.并查集的神奇运用 2.离线化 题意: 给一个长为n的序列,进行m次 ...
随机推荐
- 110_leetcode_Best Time to Buy and sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- Okio简化处理I/O操作原理
转载:http://blog.csdn.net/sbsujjbcy/article/details/50523623 Okio库是一个由square公司开发的,它补充了java.io和java.nio ...
- silverlight wpf DataTemplate Command binding
<Grid x:Name="LayoutRoot" Background="White"> <CommonControl:NoapDataGr ...
- HD-ACM算法专攻系列(10)——大明A+B
题目描述: 源码: 需要注意的一点是输出是最简形式,需要去除小数的后导0,而调用stripTrailingZeros()函数后,数会以科学计数法输出,所以需要调用toPlainString(). im ...
- Appserv 2.5.10 升级PHP from version 5.2 to 5.3
解决方案查看 该文章:http://blog.csdn.net/dull_boy2/article/details/43927363
- JavaScript学习——BOM对象
1.BOM 对象:浏览器对象模型(操作与浏览器相关的内容) 2.Window 对象 Window 对象表示浏览器中打开的窗口 setInterval():它有一个返回值,主要是提供给 clearInt ...
- Uva 1605 Building for UN【构造法】
题意:给出n个国家,给它们分配办公室,使得任意两个国家都有一对相邻的格子 看的紫书,最开始看的时候不理解 后来还是搜了题解--- 发现是这样的 比如说5个国家 应该输出 AAAA BBBB CCCC ...
- 2,HTTP请求应答返回码
200 OK 请求成功,一般用于Get和Post请求 300 多种选择.请求的资源可包括多个位置,响应的返回一个资源特征与地址的列表用于浏览器(client)选择 Multiple Choices 3 ...
- n阶方阵,数字从1~n^2,顺时针增大
运行结果如下图: 解题思路:可以将这个问题分解成x个外围正方形所围成的图形,外围的正方形又可以分为4个步骤,向右依次增大.向下依次增大.向左依次增大.向上依次增大.基本思路就是如此,最关键的就是什么时 ...
- Cause of 400 Bad Request Errors
The 400 Bad Request error displays inside the Internet browser window, just as web pages do. Cause o ...