[bzoj4551][Tjoi2016][Heoi2016]树
Description
在2016年,佳媛姐姐刚刚学习了树,非常开心。
现在她想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:
1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记);
2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖
先).
你能帮帮她吗?
Input
输入第一行两个正整数和
,分别表示节点个数和操作次数.
接下来行,每行两个正整数
,表示
到
有一条有向边.
接下来行,形如“
”.
为“
”时,表示这是一个标记操作;
为“
”时,表示这是一个询问操作.
Output
输出一个正整数,表示结果.
Sample Input
5 5
1 2
1 3
2 4
2 5
Q 2
C 2
Q 2
Q 5
Q 3
Sample Output
1
2
2
1
HINT
Solution
正难则反,对于所有操作逆序离线处理.
先记录每个节点被打过几次标记,预处理出每个节点最后时刻最近的打了标记的祖先.
从后往前消除标记,如果当前点的标记被消除完,则这个点最近的打了标记的祖先为它父亲最近的打了标记的祖先,并查集可实现.
- #include<cmath>
- #include<ctime>
- #include<stack>
- #include<queue>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- #define N 100005
- using namespace std;
- struct graph{
- int nxt,to;
- }e[N<<1];
- struct quest{
- int t,x;
- }b[N];
- int a[N],f[N],g[N],fa[N],ans[N],n,m,q,t,x,cnt;
- stack<int> s;
- inline int read(){
- int ret=0;char c=getchar();
- while(!isdigit(c)) c=getchar();
- while(isdigit(c)){
- ret=(ret<<1)+(ret<<3)+c-'0';
- c=getchar();
- }
- return ret;
- }
- inline int rc(){
- char c=getchar();
- while(c!='Q'&&c!='C') c=getchar();
- if(c=='C') return 1;
- return 2;
- }
- inline void addedge(int x,int y){
- e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
- }
- inline void dfs(int u){
- fa[u]=f[u]=1;s.push(u);
- while(!s.empty()){
- u=s.top();s.pop();
- for(int i=g[u];i;i=e[i].nxt)
- if(fa[u]!=e[i].to){
- fa[e[i].to]=u;s.push(e[i].to);
- if(!a[e[i].to]) f[e[i].to]=f[u];
- else f[e[i].to]=e[i].to;
- }
- }
- }
- inline int gf(int k){
- if(f[k]==k) return k;
- return f[k]=gf(f[k]);
- }
- inline void init(){
- n=read();q=read();
- for(int i=1,j,k;i<n;++i){
- j=read();k=read();
- addedge(j,k);addedge(k,j);
- }
- for(int i=1;i<=q;++i){
- b[i].t=rc();b[i].x=read();
- if(b[i].t&1) ++a[b[i].x];
- }
- ++a[1];dfs(1);cnt=0;
- for(int i=q,j,k;i;--i){
- if(b[i].t&1){
- if(!(--a[b[i].x])){
- f[b[i].x]=gf(f[fa[b[i].x]]);
- }
- }
- else ans[++cnt]=gf(f[b[i].x]);
- }
- for(int i=cnt;i;--i)
- printf("%d\n",ans[i]);
- }
- int main(){
- freopen("tree.in","r",stdin);
- freopen("tree.out","w",stdout);
- init();
- fclose(stdin);
- fclose(stdout);
- return 0;
- }
[bzoj4551][Tjoi2016][Heoi2016]树的更多相关文章
- [BZOJ4551][TJOI2016&&HEOI2016]树(并查集)
4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1746 Solved: 800[Sub ...
- BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)
似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...
- BZOJ4551——[Tjoi2016&Heoi2016]树
1.题意: 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.)2. 询问操作:询问某个 ...
- BZOJ4551: [Tjoi2016&Heoi2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...
- [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分
Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...
- BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...
- 【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集
[BZOJ4551][Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两 ...
- BZOJ 4551: [Tjoi2016&Heoi2016]树
4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 748 Solved: 394[Subm ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
随机推荐
- 安装ESXi5.5遇到Relocating modules and starting up the kernel的处理
在一些Dell较旧的服务器上安装ESXi 5.x时, 会遇到卡在Relocating modules and starting up the kernel过不去的问题. 比如我装的这台CS24VSS. ...
- 正在编译转换: 未能找到元数据文件 EntityFramework.dll
错误 1 正在编译转换: 未能找到元数据文件“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\..\IDE\Enti ...
- Splay整理
伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.(来自百科) 伸展树的操作主要是
- COGS 2. 旅行计划
2. 旅行计划 ★☆ 输入文件:djs.in 输出文件:djs.out 简单对比时间限制:3 s 内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...
- MVC控制器总结
1.特性 [AuthorizeFilter] 用于权限过滤 [HttpGet] [HttpPost] 2.参数 获取方法 public ActionResult void Get(int id){} ...
- 表单验证——JavaScript和Jquery版
1.轻量级的JavaScript表单验证 在应用中引用 validator.min.js 文件 <script type="text/javascript" src=&quo ...
- Vue系列: 如何通过组件的属性props设置样式
比如我们要在vue中显示百度地图,然后将相关的代码包装成组件,然后需要由外部来设置组件的高度,关于props的介绍,可以参考: http://cn.vuejs.org/guide/components ...
- Bootstrap系列 -- 12. 水平表单
Bootstrap框架默认的表单是垂直显示风格,但很多时候我们需要的水平表单风格(标签居左,表单控件居右) 在Bootstrap框架中要实现水平表单效果,必须满足以下两个条件: 1.在<form ...
- Windows Azure 云服务角色架构
当我们使用VS发布一个Cloud Service或者在Portal上上传发布包后,就能启动和运行一个云服务,可以保护WebRole,WorkerRole的一个或者多个实例. Windows Azure ...
- centos7.2安装phpmyadmin
首先服务器要有web 环境 yum install phpmyadmin 修改/etc/http.conf/conf.d/phpMyadmin.conf 将 #Require ip 127.0.0. ...