这题可以用并查集做,一开始统计一下记录每个点被标记了几次,除了被标记过的点外,其他节点都与其父亲所在集合合并,然后倒着做,做的时候如果有节点标记次数变为了0,则将其与其父亲合并。

  代码

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 500100
 6 using namespace std;
 7 typedef long long ll;
 8 int n,m,i,a,b,dp,p[N],pre[N],tt[N];
 9 int F[N],v[N],sum[N],f[N],ans[N],tot;
10 char typ[N];
11 void link(int x,int y)
12 {
13     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
14 }
15 void dfs(int x,int fa)
16 {
17     int i=p[x];
18     F[x]=fa;
19     while (i)
20     {
21         if (tt[i]!=fa)
22             dfs(tt[i],x);
23         i=pre[i];
24     }
25 }
26 int gf(int x)
27 {
28     int p=x,t;
29     while (p!=f[p]) p=f[p];
30     while (x!=p)
31     {
32         t=f[x];f[x]=p;x=t;
33     }
34     return p;
35 }
36 int main()
37 {
38     scanf("%d%d",&n,&m);
39     for (i=1;i<n;i++)
40     {
41         scanf("%d%d",&a,&b);
42         link(a,b);link(b,a);
43     }
44     dfs(1,0);
45     sum[1]=1;
46     for (i=1;i<=m;i++)
47     {
48         scanf(" %c%d",&typ[i],&v[i]);
49         if (typ[i]=='C')
50         sum[v[i]]++;
51     }
52     for (i=1;i<=n;i++) f[i]=i;
53     for (i=1;i<=n;i++) if (!sum[i]) f[gf(i)]=gf(F[i]);
54     for (i=m;i>=1;i--)
55     {
56         if (typ[i]=='Q')
57         {
58             tot++;ans[tot]=gf(v[i]);
59         }
60         else
61         {
62             sum[v[i]]--;
63             if (sum[v[i]]==0) f[gf(v[i])]=gf(F[v[i]]);
64         }
65     }
66     for (i=tot;i>=1;i--)
67     printf("%d\n",ans[i]);
68
69 }

转载于:https://www.cnblogs.com/fzmh/p/5444958.html

bzoj 4551[Tjoi2016Heoi2016]树相关推荐

  1. [BZOJ 4551][Tjoi2016Heoi2016]树(并查集)

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

  2. bzoj 4551: [Tjoi2016Heoi2016]树【并查集】

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

  3. BZOj #4771. 七彩树(主席树+dfn序+lca)

    BZOj #4771. 七彩树 description solution code description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色, ...

  4. BZOJ 4551树题解

    好吧,洛谷的数据比较水暴力就可以过....(而且跑到飞快) 不过(BZ水不过去)还是讲讲正规的做法. 其实一眼可以看出可以树剖,但是,码起来有点麻烦. 其实有一种更简单的离线做法. 我们很容易联想到并 ...

  5. bzoj4551: [Tjoi2016Heoi2016]树(树链剖分)

    4551: [Tjoi2016&Heoi2016]树 题目:传送门 题解: 一道树剖裸题 线段树的c值维护新编号最大的已被标记的节点. 用一个数组转化新编号为旧编号(就是因为这个小细节打错OR ...

  6. BZOJ 3244: [Noi2013]树的计数

    传送门 神仙题... 和树的深度有关,由于 $BFS$ 序的性质,显然可以通过把 $BFS$ 序分成若干段来求出深度,每一段就对应某一深度从左到右的所有节点,那么如果确定了分的段数就确定了树的深度(分 ...

  7. ●BZOJ 4556 [Tjoi2016Heoi2016]字符串

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...

  8. 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计

    Time limit 10000 ms//另外,BZOJ只算所有点的总时限,所以可能会放过一些原本会TLE的代码 Memory limit 165888 kB OS Linux SourceZJOI2 ...

  9. BZOJ.4337.[BJOI2015]树的同构(树哈希)

    BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...

最新文章

  1. IT公司100题-4-在二元树中找出和为某一值的所有路径
  2. JS Array filter()方法
  3. 体验一下Oracle 11g物理Active Data Guard实时查询(Real-time query)
  4. 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
  5. linux下sock_raw和sock_stream读取缓存的区别
  6. pulsar 卸载数据到aws-s3
  7. FCFS,SJF,HRRN调度算法
  8. 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
  9. 【Prison Break】第二天(3.28)
  10. libjpeg-turbo 2.1.2 交叉编译
  11. 笔记本 续航测试软件,续航能力测试
  12. APEX 压枪练习记录
  13. .cpp文件转换为.exe文件过程(C++)
  14. saveFile()方法
  15. python怎么做表格_零基础小白怎么用Python做表格?
  16. GitLab安装使用(SSH+Docker两种方式)
  17. echarts 绘制省份地图 [ 把不同省份的市合并在一起 ]
  18. matplotlib基础知识(图形绘制坐标轴、标签、刻度字体设置图例脊柱移动风格样式多图布局双轴显示)(1)
  19. Typora的下载和常用操作
  20. 4.2 链路聚合:负载均衡

热门文章

  1. 【Pytorch神经网络理论篇】 18 循环神经网络结构:LSTM结构+双向RNN结构
  2. 六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离
  3. 二、前端pink老师的CSS定位学习笔记(超详细,简单易懂)
  4. jieba分词提取小说人名
  5. LeetCode MySQL 1549. The Most Recent Orders for Each Product
  6. LeetCode MySQL 580. 统计各专业学生人数
  7. 剑指Offer - 面试题10- II. 青蛙跳台阶问题
  8. python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网
  9. wpf计算字符大小占像素_LCD作为终端显示字符串的过程
  10. python中的进程, 线程