http://www.lydsy.com/JudgeOnline/problem.php?id=4551

题目描述

给定一棵有根树(根为 1),有以下两种操作:
1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记。)
2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)。

输入格式

输入第一行两个正整数 分别表示节点个数和操作次数
接下来 行,每行两个正整数   表示 有一条有向边
接下来 行,“ ”时表示这是一个标记操作,为“ ”时表示这是一个询问操作,

输出格式

对于每一个询问操作,输出一个正整数,表示结果。

输入样例

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

输出样例

1
2
2
1

数据范围

题解

初始时打好所有标记,逆序处理,用并查集维护,当遇到一个询问操作时,把标记 ,若此时标记变为 ,则将该点与父亲节点合并。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 1500005
#define depth 32
using namespace std;
int n,q,tot;
struct hh
{int to,next;}e[N<<1];
int fa[N],dep[N],col[N],last[N],f[N],opt[N],x[N],ans[N];
void add(int a,int b)
{
e[++tot].to=b;
e[tot].next=last[a];
last[a]=tot;
}
void dfs(int now)
{
int i;
for(i=last[now];i;i=e[i].next)
if(!dep[e[i].to])
{
dep[e[i].to]=dep[now]+1;
fa[e[i].to]=now;
dfs(e[i].to);
}
}
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;
}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
int i,j,u,v,fx,fy;
char flag;
n=read();q=read();
for(i=1;i<=n-1;i++)
{
u=read();v=read();
add(u,v); add(v,u);
}
dfs(1);
for(i=1;i<=q;i++)
{
scanf("\n%c",&flag);
if(flag=='C') opt[i]=1;
else opt[i]=2;
x[i]=read();
}
dep[1]=1;col[1]=1;
for(i=1;i<=q;i++)
if(opt[i]==1) col[x[i]]++;
for(i=1;i<=n;i++) f[i]=i;
for(i=2;i<=n;i++)
if(!col[i]) f[find(i)]=find(fa[i]);
for(i=q;i>=1;i--)
if(opt[i]==2) ans[++ans[0]]=find(x[i]);
else
{
col[x[i]]--;
if(!col[x[i]]) f[find(x[i])]=find(fa[x[i]]);
}
for(i=ans[0];i>=1;i--)
printf("%d\n",ans[i]);
return 0;
}

【BZOJ 4551】【TJOI2016】【HEOI2016】树的更多相关文章

  1. BZOJ 4551: [Tjoi2016&Heoi2016]树

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 394[Subm ...

  2. BZOJ 4551[Tjoi2016&Heoi2016]树(树链剖分+二分)

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记 ...

  3. BZOJ 4551 [Tjoi2016&Heoi2016]树 ——并查集

    树剖显然可以做. 然而有一种更神奇的方法,并查集+时光倒流. 每个节点指向它上面最近的标记节点,标记节点指向自己,然后删除标记,就可以用并查集查询了. #include <map> #in ...

  4. BZOJ 4551: [Tjoi2016&Heoi2016]树 并查集(&&图论?)

    反向操作,先把所有的标记都打上(记得统计标记的数目),然后依次撤销,合并到自己的上一个点pre,即fa[u]=getf(pre[u]) #include<cstdio> #include& ...

  5. bzoj 4551: [Tjoi2016&Heoi2016]树【并查集】

    看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...

  6. [BZOJ4551][TJOI2016&&HEOI2016]树(并查集)

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1746  Solved: 800[Sub ...

  7. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

  8. 【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集

    [BZOJ4551][Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两 ...

  9. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  10. Bzoj 4556: [Tjoi2016&Heoi2016]字符串

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 92[Sub ...

随机推荐

  1. spring mvc jsp运行不起来的问题

    spring mvc已经处理成让jsp运行,即: <bean class="org.springframework.web.servlet.view.InternalResourceV ...

  2. EF: Returns multi table from procedure

    原文:https://msdn.microsoft.com/en-us/data/jj691402.aspx

  3. win7中安装redis

    1.下载redis安装版本 https://github.com/rgl/redis/downloads 2.设置环境变量 将redies的安装目录设置为环境变量 参考: http://www.cnb ...

  4. [PaPaPa][需求说明书][V0.1]

    PaPaPa软件需求说明书V0.1 前   言 我觉得我们废话不能多,废话一多的话大家就找不到重点了,其实本项目是出于技术研究的目的来开发的,大家讨论了半天决定要做社(yue)交(pao)类的项目. ...

  5. mysql日期类型默认值'0000-00-00'容错处理

    mysql日期默认值'0000-00-00'惹的祸 .net连mysql数据库时,如果表里有字段是日期型且值是‘0000-00-00’时,会报错.在C#里面日期不可能是那样的.或许是最小日期定义的差别 ...

  6. CCF推荐国际学术期刊

    中国计算机学会推荐国际学术期刊 (计算机系统与高性能计算) 一.A类 序号 刊物简称 刊物全称 出版社 网址 1 TOCS ACM Transactions on Computer Systems A ...

  7. Gson解析数组多类型元素

    本文的出现是为了解决以下需求:使用Gson对json数组进行解析,但是数组里面元素的类型是多种的.数据如下: {"list":[{ "type":0, &quo ...

  8. php随机密码函数的实例代码

    php随机密码函数的入门例子 时间:2015-12-16 20:42:48来源:网络 导读:php生成随机密码的函数实例,php生成随机密码的函数,生成数字.大小写字母与特殊字符组合的随机密码.   ...

  9. java---Swing界面开发总结

    一.java的图形界面 1.awt    java.awt jdk1.4之前推出的图形界面,用c/c++编写,跨平台性不好 2.swing  javax.swing jdk1.4时推出的图形界面,跨平 ...

  10. 解决访问StackOverFlow太慢的问题

    Stackoverflow加载时访问了被屏蔽的站点ajax.googleapis.com,导致加载缓慢,把这个站点加到Hosts里,指向127.0.0.1即可