【BZOJ 4551】【TJOI2016】【HEOI2016】树
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; }
转载于:https://www.cnblogs.com/yljiang/p/6034090.html
【BZOJ 4551】【TJOI2016】【HEOI2016】树相关推荐
- Luogu P1198 BZOJ 1012 最大数 (线段树)
Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- [BZOJ 4551][Tjoi2016Heoi2016]树(并查集)
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...
- BZOJ 4551树题解
好吧,洛谷的数据比较水暴力就可以过....(而且跑到飞快) 不过(BZ水不过去)还是讲讲正规的做法. 其实一眼可以看出可以树剖,但是,码起来有点麻烦. 其实有一种更简单的离线做法. 我们很容易联想到并 ...
- bzoj 4551: [Tjoi2016Heoi2016]树【并查集】
看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...
- bzoj 4551[Tjoi2016Heoi2016]树
这题可以用并查集做,一开始统计一下记录每个点被标记了几次,除了被标记过的点外,其他节点都与其父亲所在集合合并,然后倒着做,做的时候如果有节点标记次数变为了0,则将其与其父亲合并. 代码 1 #incl ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec Memory Limit: 512 MB Submit: 53 Solved: 9 [Su ...
- BZOJ 2243 染色(树链剖分好题)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 7971 Solved: 2990 [Submit][Stat ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- [TJOI2016][HEOI2016]排序
题目大意: 给定一个$1\sim n(n\leq10^5)$的全排列,有$m(m\leq10^5)$次操作,每次把区间$[l,r]$按照升序或降序排序.最后询问所有操作完成后,位置为$q$的数是多少. ...
最新文章
- java me sdk_Java ME SDK 3.0不运行的问题及解决
- 实验进行中:.NET WebAssembly支持
- MATLAB报错“Integers can only be raised to positive integral powers.“
- 秀尔算法:破解RSA加密的“不灭神话” --zz
- Aizu 0525 Osenbei(状压+贪心)
- 网页获取服务器时间,通过AFNetworking获取服务器时间
- bootstrap signin将邮件改成用户名_了解电子邮件传递背后的流程
- MyEclipse8.5默认工作区间修改
- 如果一个国家是一种颜色,中国的颜色美哭了!
- wiki——Isogeometric_analysis
- CYQ.Data 正式支持 DotNET Core 版本发布
- android+开发平板应用,Android平板应用开发教程
- 1到20的阶乘和是多少 php,20的阶乘(1到20的阶乘和结果)
- 自动布局神器 -- ZXPAutoLayout框架的使用
- C语言练习①一英寸是多少厘米?
- 你有必要不沾计算机一段时间英语,八年级英语下册unit 1必背词组及句子(新人教版).docx...
- https配置CA证书安装教程
- PyCharm配置Virtual Environment
- 方向传感器新的替代方法详解
- 开关电源模块 遥控开/关电路