Codeforces 343D Water Tree
题意简述
维护一棵树,支持以下操作:
- 0 v:将以v为跟的子树赋值为1
 - 1 v:将v到根节点的路径赋值为0
 - 2 v:询问v的值
 
题解思路
树剖+珂朵莉树
代码
#include <set>
#include <cstdio>
#define IT std::set<Node>::iterator
const int N=500005;
int n,q,u,v,opt,x,cnt;
int h[N],to[N<<1],nxt[N<<1];
int fa[N],sz[N],hvs[N],id[N],top[N];
struct Node {
	int l,r; bool v;
	Node(const int& L,const int& R=-1,const bool& V=0):l(L),r(R),v(V) {}
	bool operator <(const Node& x) const { return l<x.l; }
};
inline void add_edge(const int& u,const int& v) {
	to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt;
}
void dfs1(const int& u) {
	sz[u]=1;
	for (register int i=h[u];i;i=nxt[i])
		if (to[i]^fa[u]) {
			fa[to[i]]=u;
			dfs1(to[i]);
			sz[u]+=sz[to[i]];
			if (sz[to[i]]>sz[hvs[u]]) hvs[u]=to[i];
		}
}
void dfs2(const int& u) {
	id[u]=++cnt;
	if (hvs[u]) { top[hvs[u]]=top[u]; dfs2(hvs[u]); }
	for (register int i=h[u];i;i=nxt[i])
		if (to[i]!=hvs[u]&&to[i]!=fa[u]) {
			top[to[i]]=to[i]; dfs2(to[i]);
		}
}
std::set<Node> s;
inline IT split(const int& pos) {
	IT it=s.lower_bound(Node(pos,0,0));
	if (it!=s.end()&&it->l==pos) return it;
	--it;
	const int L=it->l,R=it->r; const bool V=it->v;
	s.erase(it);
	s.insert(Node(L,pos-1,V)); return s.insert(Node(pos,R,V)).first;
}
inline void assign(const int& l,const int& r,const bool& va) {
	IT itr=split(r+1),itl=split(l); s.erase(itl,itr); s.insert(Node(l,r,va));
}
inline void modify(int u) {
	for (;top[u]!=1;u=fa[top[u]]) assign(id[top[u]],id[u],0); assign(1,id[u],0);
}
inline int query(int x) { IT it=split(x); return it->v; }
int main() {
	scanf("%d",&n); s.insert(Node(1,n,0));
	for (register int i=1;i<n;++i)
		scanf("%d%d",&u,&v),add_edge(u,v),add_edge(v,u);
	cnt=0; fa[1]=top[1]=1; dfs1(1); dfs2(1);
	scanf("%d",&q);
	for (register int i=1;i<=q;++i) {
		scanf("%d%d",&opt,&x);
		if (opt==1) assign(id[x],id[x]+sz[x]-1,1);
		else if (opt==2) modify(x);
		else printf("%d\n",query(id[x]));
	}
}
												
											Codeforces 343D Water Tree的更多相关文章
- Codeforces 343D Water Tree                                                    分类:            Brush Mode             2014-10-05 14:38    98人阅读    评论(0)    收藏
		
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
 - CodeForces 343D water tree(树链剖分)
		
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
 - Codeforces 343D Water Tree(DFS序 + 线段树)
		
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
 - Codeforces 343D Water Tree & 树链剖分教程
		
原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...
 - Water Tree CodeForces 343D 树链剖分+线段树
		
Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...
 - 343D/Codeforces Round #200 (Div. 1) D. Water Tree  dfs序+数据结构
		
D. Water Tree Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each ...
 - Codeforces Round #200 (Div. 1)D. Water Tree dfs序
		
D. Water Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343/problem/ ...
 - Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
		
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
 - Codeforces Round #200 (Div. 1)  D. Water Tree 树链剖分+线段树
		
D. Water Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...
 
随机推荐
- 【tf.keras】在 cifar 上训练 AlexNet,数据集过大导致 OOM
			
cifar-10 每张图片的大小为 32×32,而 AlexNet 要求图片的输入是 224×224(也有说 227×227 的,这是 224×224 的图片进行大小为 2 的 zero paddin ...
 - JavaScript捕获与冒泡与委托
			
事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件. 相反的,事件冒泡是自下而上的去触发事件. 并不是所有的事件都能冒泡,以下事件不冒泡:blur.focus.load.un ...
 - JSP之BBS论坛网站的创建
			
游戏论坛 工具:myeclipse10.0版本 Tomacat是在外部导入的apache-tomcat-7.0.93 JDK版本为1.6.0_13 字符编码统一为utf-8 一.建立数据库(chat) ...
 - windows中实现python,redis服务自动重启(任务计划程序+bat脚本)
			
需求:银行电脑无法自动开机,只能 通过 应用相关服务每天自动重启的方式实现 服务更新并且防止服务假死,内存过大 等情况 相关工具:win10系统中,使用windows自带的任务计划程序 和 bat脚本 ...
 - python菜鸟基础知识(一)
			
第三章 基础 3.1程控制语句 3.1.1if语句 1.单if  if 关键字 空格 条件 冒号  缩进 结果 print(1) if 3 > 2: print(9) print(8) 2 ...
 - 【CYH-01】小奔的国庆练习赛:赛后标程
			
前排鸣谢@找寻 大佬 emm-由于头一次举办公开赛所以--准备不是很充分,所以说题解也没有备好,在这里表示歉意. 欢迎大家来发布题解,在此我们可以提供AC代码,供大家参考. T1 解析:这一题可能栈溢 ...
 - Baozi Leetcode Solution 290: Word Pattern
			
Problem Statement Given a pattern and a string str, find if str follows the same pattern. Here follo ...
 - [分享] 一款极简单的 BaseEntity CRUD 方法
			
前言 尝试过 ado.net.dapper.ef,以及Repository仓储,甚至自己还写过生成器工具,以便做常规CRUD操作. 它们日常操作不方便之处: 每次使用前需要声明,再操作: 很多人一个实 ...
 - TencentTbs腾讯浏览服务 x5内核使用
			
Tencent TBS (下简称TBS) 腾讯浏览服务 What is it? 百度百科解释: 腾讯浏览服务(Tencent Browsing Service,以下简称TBS),由腾讯X5浏览服务升级 ...
 - 《VR入门系列教程》之16---第一个OculusVR应用
			
第一个VR应用 之前我们已经将Oculus的开发包导入到空工程中了,现在我们来构建第一个桌面VR的示例.开发包中已经有一个示例场景,只需要几步就可以让这个场景运行起来.我们将要构建的这个Demo ...