题解 【HEOI2016】tree树
题面
解析
其实这题可以考虑离线做法,用并查集解决。
因为仔细想,添加标记并不方便,
但如果用并查集记录下祖先,
再一一删除,就会方便很多。
先把每次操作记录下来,
同时记录下每个点被标记的次数(因为有多次标记,所以不能只用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树的更多相关文章
- POJ3237 Tree 树链剖分 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...
- loj#2054. 「TJOI / HEOI2016」树
题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
- Tree( 树) 组件[4]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...
- Tree( 树) 组件[3]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 事件列表很多事件的回调函数都包含'node'参数, ...
- Tree( 树) 组件[2]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一. 异步加载如果想从数据库里获取导航内容, 那么就必须 ...
- Tree( 树) 组件[1]
本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...
- JQuery Easy Ui (Tree树)详解(转)
第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...
- hdu_4718_The LCIS on the Tree(树链剖分+线段树合并)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4718 题意:给你一棵树,每个节点有一个值,然后任给树上的两点,问这两点的最长连续递增区间是多少 题解: ...
随机推荐
- python+requests 请求响应文本出错返回“登录超时”
Python+requests请求响应:"msg":"登录过时" 1.出错原代码: import requests import json#页面按条件搜索返回相 ...
- VC++2017关于项目出现"const char *" 类型的实参与 "char *" 类型的形参不兼容错误的解决方法
C++项目中经常会定义如下形式的字符串: char *texts[] = { "1. Open Account", "2. To Deposit Money", ...
- xml 表格
设置单元格样式 <Style ss:ID="唯一id字符" ss:Name="单元格样式"> [内部通常用来设置 Alignment对齐.Font字 ...
- paramiko模块(远程操作服务器)
paramiko模块(远程操作服务器) django+paramkio实现远程某些服务器执行命令+上传文件 用于帮助开发者通过代码远程连接服务器,并对服务器进行操作. pip3 install par ...
- 【POI】使用POI 创建生成XLS,打开xls文件提示【此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。】
使用POI 创建生成XLS,打开xls文件提示[此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数.] 原因: 是因为在POI处理xls的过程中,太多次调用了: HSSFFont fon ...
- 3-Perl 基础语法
Perl 基础语法Perl借用了C.sed.awk.shell脚本以及很多其他编程语言的特性,语法与这些语言有些类似,也有自己的特点.Perl 程序有声明与语句组成,程序自上而下执行,包含了循环,条件 ...
- 进阶Java编程(13)反射与Annotation
1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...
- vue中keep-alive路由缓存
<keep-alive> <component v-bind:is="view"></component> </keep-alive> ...
- shiro权限控制配置
shiro配置流程 web.xml中配置shiro的filter spring中配置shiro的过滤器工厂,指定对不同地址权限控制 , 传入安全管理器 配置安全管理器,传入realm,realm中定义 ...
- parseInt()、Number()区别
parseInt从头解析string为整数,在遇到不能解析的字符时就返回已经解析的整数部分,如果第一个字符就不能解析,就直接返回NaN. Number如果无法转换为数字,就返回NaN.像“123a”, ...