题解 【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 题意:给你一棵树,每个节点有一个值,然后任给树上的两点,问这两点的最长连续递增区间是多少 题解: ...
随机推荐
- Redis(1.13)Redis cluster 分布式集群手动配置
[1]试验环境 结构图如下: (这里试验没有那么多机器,就用3台机器搭建试验) redis1是redis集群的一个节点A,上面运行了两个redis实例,7001 7004 redis2是redis集群 ...
- 大数据之Zookeeper概述
Zookeeper概述 Zookeeper是一个开放源码的分布式应用程序协调服务,是 Google的Chubby一个开源的实现,是 Hadoop和 HBASE的重要组件.主要解决分布式应用一致性问题. ...
- 03 Python基础
1.输出和输入 (1)print打印 Python 提供print方法来打印信息 输入: print ("hello python") 调用print方法,用户双引号(" ...
- 项目四:Java秒杀系统方案优化-高性能高并发实战
技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商 ...
- c++学习笔记之函数重载和模板理解
1.函数重载: C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载(其英文是 overload).重载就是装载多种东西的意思,即同一个事物能完成不同功能. 所谓 ...
- pip安装源
目录 介绍 永久配置安装源 Windows MacOS.Linux 配置文件内容 介绍 """ 1.采用国内源,加速下载模块的速度 2.常用pip源: -- 豆瓣:htt ...
- drf框架的模块分析
请求模块 请求模块是个什么鬼 ''' 1.drf的request是在wsgi的request基础上再次封装 2.wsgi的request作为drf的request一个属性:_request 3.新的r ...
- CSS基础布局
目录 css基础布局 1.布局相关的标签 2.盒子模型 2-1 什么是盒子模型 2-2 块级元素和内联元素(行内元素) 2-3 盒子模型之间的关系 盒子模型相关CSS属性 3.浮动 3-1 什么是浮动 ...
- Java异常模块
JAVA异常的捕获与处理 视频链接:https://edu.aliyun.com/lesson_1011_8939#_8939 java语言提供最为强大的支持就在于异常的处理操作上. 1,认识异常对程 ...
- java——ArrayList中contains()方法中的疑问
问题引子: ist<Student> students=new ArrayList<Student>(); students.add(new Student("201 ...