[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年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
随机推荐
- django复习笔记3:实战
1.初始化 2.配置后台,增加测试数据 3.测试urls/views/templates 4.增加静态资源 5.修改样式 6.模版继承 7.增加博文主页 8.增加表单 9.完善新增页面和编辑页面的表单 ...
- BZOJ 1026 【SCOI2009】 windy数
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...
- C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)
原文地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-into-Jirigala-GPM-DotNet-B ...
- web一周
学习web有一周了,老师进度有点小快,但是我还是感觉挺不错的. 对于一开始什么都不认识到能看懂是什么意思,并且可以写一些内容,我感觉还是比较欣慰,老师还是比较负责的,我每次都去找更远的代码学习 ...
- Python快速教程目录(转)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...
- Caffe学习系列(7):solver及其配置
solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --solver=*_slover ...
- 关于lazyload插件的一些笔记
Lazy Load Plugin for jQuery 需要引入 jQuery,兼容各种 IE,适合 PC 端使用.详细 API 可以参考 http://www.appelsiini.net/proj ...
- 快速备份和还原 MySQL 数据库的另一种方法
一直使用 SQL Server 作为公司产品的数据库来存储系统数据,所以备份还原一直都不是问题,因为 SQL Server 的备份还原非常迅速和易用.但今年公司改变策略,使用起 MySQL 数据库作为 ...
- Bootstrap系列 -- 10. 网格布局
一. 实现原理 网格布局是通过容器的大小,平均分为12份(可以修改),再调整内外边距,和表格布局有点类似但是也存在区别. 实现步骤如下: (1) 数据行.row 必须包含在容器.container 中 ...
- 【技巧】“Plugin execution not covered by lifecycle configuration...“异常的处理
问题现象: 在Eclipse(JEE mars)中新建maven project,选择archetype为:maven-archetype-plugin,结果生成的project存在错误:“Plugi ...