[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年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
随机推荐
- Docker容器概念讲解
Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源. Docker是通过内核虚 ...
- script和href
src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素. < ...
- DBA应用技巧:如何升级InnoDB Plugin
DBA应用技巧:如何升级InnoDB Plugin 2011-03-23 10:09 康凯 ITPUB 字号:T | T 本文中,我们将向读者详细介绍如何升级动态InnoDB Plugin和升级静态编 ...
- 【转】【MySql】Waiting for table metadata lock原因分析
MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Wa ...
- [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅
比较关心微软平台技术的朋友应该都知道,微软云服务(Microsoft Azure)以下简称Azure分为全球版和中国版,由于政府法规问题中国版的服务是由二十一世纪互联运营,整体来看中国版Azure和全 ...
- Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- Linux 网络编程详解三(p2p点对点聊天)
//p2p点对点聊天多进程版--服务器(信号的使用) #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- MVC3.0 上传图片并生成缩略图
转自:http://mikelai.blog.163.com/blog/static/18411126620118771732675/ Controller: public ActionResult ...
- matlab取整 四舍五入
Matlab取整函数有: fix, floor, ceil, round.取整函数在编程时有很大用处.一.取整函数1.向零取整(截尾取整)fix-向零取整(Round towards zero):&g ...
- Oracle 常用操作【01】修改、更新数据
1. oracle 修改表名.列名.字段类型.添加表列.删除表列 alert table scott.test rename to test1--修改表名 alter table scott.tes ...