bzoj 4551[Tjoi2016Heoi2016]树
这题可以用并查集做,一开始统计一下记录每个点被标记了几次,除了被标记过的点外,其他节点都与其父亲所在集合合并,然后倒着做,做的时候如果有节点标记次数变为了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]树相关推荐
- [BZOJ 4551][Tjoi2016Heoi2016]树(并查集)
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...
- bzoj 4551: [Tjoi2016Heoi2016]树【并查集】
看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...
- BZOj #4771. 七彩树(主席树+dfn序+lca)
BZOj #4771. 七彩树 description solution code description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色, ...
- BZOJ 4551树题解
好吧,洛谷的数据比较水暴力就可以过....(而且跑到飞快) 不过(BZ水不过去)还是讲讲正规的做法. 其实一眼可以看出可以树剖,但是,码起来有点麻烦. 其实有一种更简单的离线做法. 我们很容易联想到并 ...
- bzoj4551: [Tjoi2016Heoi2016]树(树链剖分)
4551: [Tjoi2016&Heoi2016]树 题目:传送门 题解: 一道树剖裸题 线段树的c值维护新编号最大的已被标记的节点. 用一个数组转化新编号为旧编号(就是因为这个小细节打错OR ...
- BZOJ 3244: [Noi2013]树的计数
传送门 神仙题... 和树的深度有关,由于 $BFS$ 序的性质,显然可以通过把 $BFS$ 序分成若干段来求出深度,每一段就对应某一深度从左到右的所有节点,那么如果确定了分的段数就确定了树的深度(分 ...
- ●BZOJ 4556 [Tjoi2016Heoi2016]字符串
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...
- 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计
Time limit 10000 ms//另外,BZOJ只算所有点的总时限,所以可能会放过一些原本会TLE的代码 Memory limit 165888 kB OS Linux SourceZJOI2 ...
- BZOJ.4337.[BJOI2015]树的同构(树哈希)
BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...
最新文章
- IT公司100题-4-在二元树中找出和为某一值的所有路径
- JS Array filter()方法
- 体验一下Oracle 11g物理Active Data Guard实时查询(Real-time query)
- 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
- linux下sock_raw和sock_stream读取缓存的区别
- pulsar 卸载数据到aws-s3
- FCFS,SJF,HRRN调度算法
- 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
- 【Prison Break】第二天(3.28)
- libjpeg-turbo 2.1.2 交叉编译
- 笔记本 续航测试软件,续航能力测试
- APEX 压枪练习记录
- .cpp文件转换为.exe文件过程(C++)
- saveFile()方法
- python怎么做表格_零基础小白怎么用Python做表格?
- GitLab安装使用(SSH+Docker两种方式)
- echarts 绘制省份地图 [ 把不同省份的市合并在一起 ]
- matplotlib基础知识(图形绘制坐标轴、标签、刻度字体设置图例脊柱移动风格样式多图布局双轴显示)(1)
- Typora的下载和常用操作
- 4.2 链路聚合:负载均衡
热门文章
- 【Pytorch神经网络理论篇】 18 循环神经网络结构:LSTM结构+双向RNN结构
- 六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离
- 二、前端pink老师的CSS定位学习笔记(超详细,简单易懂)
- jieba分词提取小说人名
- LeetCode MySQL 1549. The Most Recent Orders for Each Product
- LeetCode MySQL 580. 统计各专业学生人数
- 剑指Offer - 面试题10- II. 青蛙跳台阶问题
- python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网
- wpf计算字符大小占像素_LCD作为终端显示字符串的过程
- python中的进程, 线程