题面

解析

其实这题可以考虑离线做法,用并查集解决。

因为仔细想,添加标记并不方便,

但如果用并查集记录下祖先,

再一一删除,就会方便很多。

先把每次操作记录下来,

同时记录下每个点被标记的次数(因为有多次标记,所以不能只用bool)。

然后dfs遍历,记录祖先。

再倒序处理,

当一个点的标记被删完时,就把它的并查集指向它的父亲,

并统计答案。

最后输出就行了!

具体看代码:

#include<bits/stdc++.h>
using namespace std; inline int read(){
int sum=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){sum=sum*+ch-'';ch=getchar();}
return f*sum;
} struct node{
int to,next;
}e[];
struct hh{
int fa/*爸爸*/,tag/*标记*/;
int col/*并查集*/;
}a[];
struct que{
int id/*节点*/,opt/*操作*/;
int ans;
}qe[];
int head[],cnt=;
int n,q; inline void add(int x,int y){
a[y].fa=x;
e[++cnt].to=head[x];
e[cnt].next=y;
head[x]=cnt;
} int find(int x){
return a[x].col==x? x:find(a[x].col);
} void dfs(int x,int fa){
a[x].fa=fa;
if(a[x].tag) a[x].col=x;
else a[x].col=a[fa].col;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(k==fa) continue;
dfs(k,x);
}
} int main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
n=read();q=read();
a[].tag=;
for(int i=;i<n;i++){
int x=read(),y=read();
add(x,y);
}
for(int i=;i<=q;i++){
char opt;
cin>>opt;
qe[i].id=read();
if(opt=='C'){
qe[i].opt=;
a[qe[i].id].tag++;
}
else if(opt=='Q'){
qe[i].opt=;
}
}
dfs(,);
for(int i=q;i>=;i--){
if(!qe[i].opt){
a[qe[i].id].tag--;
if(!a[qe[i].id].tag) a[qe[i].id].col=a[a[qe[i].id].fa].col;
}
else{
qe[i].ans=find(a[qe[i].id].col);
}
}
for(int i=;i<=q;i++){
if(qe[i].opt){
printf("%d\n",qe[i].ans);
}
}
return ;
}

题解 【HEOI2016】tree树的更多相关文章

  1. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  2. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  3. POJ3237 Tree 树链剖分 边权

    POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...

  4. Tree( 树) 组件[4]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...

  5. Tree( 树) 组件[3]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...

  6. Tree( 树) 组件[2]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...

  7. Tree( 树) 组件[1]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...

  8. JQuery Easy Ui (Tree树)详解(转)

    第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...

  9. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

  10. hdu_4718_The LCIS on the Tree(树链剖分+线段树合并)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4718 题意:给你一棵树,每个节点有一个值,然后任给树上的两点,问这两点的最长连续递增区间是多少 题解: ...

随机推荐

  1. 关于Oracle MAX()KEEP(DENSE_RANK LAST/FIRST ORDER BY ) 函数的使用分析

    MAX()/MIN() KEEP(DENSE_RANK LAST/FIRST) 函数 解释: 1. max()  获取最大值: 2.min() 获取最小值; 3. keep 保持满足括号内条件的内容; ...

  2. C++ 包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解(转)

    最近因为接触机器学习,所有涉猎到C++方面的开发.在c++中有几个概念很迷糊. VS项目中的包含目录.库目录.附加包含目录.附加库目录.附加依赖项均在"项目->属性->配置属性& ...

  3. 关于python中的包,模块导入的问题详解(二)

    from import导入 紧接着的是from xx import xx  语法 1 ################ 2 from my_moudule import name 3 print(na ...

  4. MyBatis学习存档(2)——核心配置文件

    一.xml节点结构 configuration为根节点 properties 可以配置在Java 属性配置文件中 settings 修改 MyBatis 在运行时的行为方式 typeAliases 为 ...

  5. hashMap,hashTable,TreeMap,concurrentHashMap区别

    hashMap: 基于哈希表实现 treeMap: 基于二叉树实现,适用于排序 hashTable: 底层还是HashMap,在方法上加了同步 concurrentHashMap: java7底层通过 ...

  6. 大数据学习(3)- redis集群

    安装方法摘自 http://www.redis.cn/topics/cluster-tutorial.html 这个方法为简单版的方法,在原文的基础上,我加了一点参数,其他参数配置可以请教其他大神 搭 ...

  7. 手把手教你搭建FastDFS集群(上)

    手把手教你搭建FastDFS集群(上) 本文链接:https://blog.csdn.net/u012453843/article/details/68957209        FastDFS是一个 ...

  8. 浅读vue-router源码,了解vue-router基本原理

    项目中使用vue-router的时候,会进行以下操作(可能具体不是这么写的,但是原理一样): 定义映射关系routes: 定义router实例的时候传入vue和参数{routes...}: 定义vue ...

  9. [转载]Pytorch中nn.Linear module的理解

    [转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...

  10. 关于spring中AOP的几件小事

    0.AOP简介 AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是穿透OOP的补充. AOP的主要编程对象是切面(aspect),而切面模块化横切关注 ...