博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj4551】[Tjoi2016&Heoi2016]树 并查集
阅读量:5055 次
发布时间:2019-06-12

本文共 1595 字,大约阅读时间需要 5 分钟。

题目描述

在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记。)2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)你能帮帮他吗?

输入

输入第一行两个正整数N和Q分别表示节点个数和操作次数接下来N-1行,每行两个正整数u,v(1≤u,v≤n)表示u到v有一条有向边接下来Q行,形如“oper num”oper为“C”时表示这是一个标记操作,oper为“Q”时表示这是一个询问操作对于每次询问操作,1 ≤ N, Q ≤ 100000。

输出

输出一个正整数,表示结果

样例输入

5 5

1 2
1 3
2 4
2 5
Q 2
C 2
Q 2
Q 5
Q 3

样例输出

1

2
2
1


题解

在线的话可以树剖,然而我选择了离线并查集。

加标记比较难搞,我们可以换一种思路,先把所有标记加进来,再从后往前删掉。

每个节点的f为最近的有标记的祖先,这可以在dfs中直接实现。

然后从后往前处理,如果是修改则删标记,删为0时直接将该点的f赋为f[fa]。

如果是查询,直接记录find即可。

理论时间复杂度O(αN),然而这么慢也是醉了。

另外听说暴力可过。

#include 
#include
#define N 100010using namespace std;int head[N] , to[N << 1] , next[N << 1] , cnt , fa[N] , t[N] , f[N] , opt[N] , p[N] , ans[N];char str[5];void add(int x , int y){ to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;}void dfs(int x , int last){ if(t[x]) last = x; f[x] = last; int i; for(i = head[x] ; i ; i = next[i]) if(to[i] != fa[x]) fa[to[i]] = x , dfs(to[i] , last);}int find(int x){ return x == f[x] ? x : f[x] = find(f[x]);}int main(){ int n , m , i , x , y; scanf("%d%d" , &n , &m); for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x); t[1] = 1; for(i = 1 ; i <= m ; i ++ ) { scanf("%s%d" , str , &p[i]); if(str[0] == 'C') opt[i] = 1 , t[p[i]] ++ ; } dfs(1 , 0); for(i = m ; i >= 1 ; i -- ) { if(opt[i]) { t[p[i]] -- ; if(!t[p[i]]) f[p[i]] = f[fa[p[i]]]; } else ans[i] = find(p[i]); } for(i = 1 ; i <= m ; i ++ ) if(!opt[i]) printf("%d\n" , ans[i]); return 0;}

 

转载于:https://www.cnblogs.com/GXZlegend/p/6670292.html

你可能感兴趣的文章
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
(转)跟我一起写MAKEFILE
查看>>
Linux内存段的分析
查看>>
网卡启动问题
查看>>
Ruby元编程:单元测试框架如何找到测试用例
查看>>
[FJOI2016]神秘数(脑洞+可持久化)
查看>>
android配置开发环境
查看>>
PhpStorm本地断点调试
查看>>