Codeforces Round #200 (Div. 1) D:http://codeforces.com/problemset/problem/343/D

题意:给你一颗有根树,树的每个节点有一个装水的东西,然后付亲的水可以流向儿子。一开始树上每个节点都是空的,然后会有两种操作。1 v,表示把v节点为子树的每个点都灌满水,2 v,表示v及v的祖先都清空。3 v是询问 v节点是否为空,为空输出0,否则输出1.

题解:首先,树上操作可以通过DFS,然后转化成数组操作。3操作来说,只要v的子树中有一个0,那么v一定是0,所以把单点查询,转化成了区间查询。2操作来说,我们可以只进行单点更新,即只对v这个节点操作。1操作的时候,就是区间更新,但是这里首先要查询v中是否有0,因为2操作只到了点。加入说,之前 2 v,那么v及其父亲应该是0的,这时候如果1,v的话,那么必须要把v的父亲变为0.这里有两种实现。先说一种好写。set运用。我们一开始把树上的每个节点都放进set,表示每个几点都是0.对于操作1.来说,首先我们要查询是否有0,Q.lower_bound(ll[temp]),如果找到并且这个数的位置不超过rr[temp],那么v的父亲要变成0,即可v的父亲查到set中,同时把那些变成1的元素从set中删除,Q.erase(Q.lower_bound(ll[temp]),Q.upper_bound(rr[temp]));3操作类似。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=5e5+;
int head[N],now;
int fa[N],ll[N],rr[N],cnt;
set<int>Q;
void init(){
memset(head,-,sizeof(head));
memset(rr,,sizeof(rr));
memset(ll,,sizeof(ll));
memset(fa,,sizeof(fa));
now=;
cnt=;
}
struct Node{
int v;
int next;
}edge[N*];
void add(int u,int v){
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void DFS(int u,int f){
ll[u]=rr[u]=++now;
Q.insert(now);
fa[u]=f;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v!=f)
DFS(v,u);
}
rr[u]=now;
}
int n,m,t1,t2;
int main(){
while(~scanf("%d",&n)){
init();
for(int i=;i<n;i++){
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
DFS(,);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&t1,&t2);
if(t1==){
bool flag=false;
set<int>::iterator it=Q.lower_bound(ll[t2]);
if(it==Q.end()||(*it)>rr[t2])
flag=true;
Q.erase(Q.lower_bound(ll[t2]),Q.upper_bound(rr[t2]));
if(!flag&&t2!=)
Q.insert(ll[fa[t2]]);
}
else if(t1==){
Q.insert(ll[t2]);
}
else {
set<int>::iterator it=Q.lower_bound(ll[t2]);
if(it==Q.end()||(*it)>rr[t2])
printf("1\n");
else
printf("0\n");
}
}
}
}

第二种实现:线段树版本。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=5e5+;
int head[N],now;
int fa[N],ll[N],rr[N],cnt;
int n,m,t1,t2;
int lazy[N*],seg[N*];
void init(){
memset(head,-,sizeof(head));
memset(rr,,sizeof(rr));
memset(ll,,sizeof(ll));
memset(fa,,sizeof(fa));
memset(lazy,,sizeof(lazy));
memset(seg,,sizeof(seg));
now=;
cnt=;
}
struct Node{
int v;
int next;
}edge[N*];
void add(int u,int v){
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void DFS(int u,int f){
ll[u]=rr[u]=++now;
fa[u]=f;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v!=f)
DFS(v,u);
}
rr[u]=now;
}
void push_up(int rt){
seg[rt]=min(seg[rt<<],seg[rt<<|]);
}
void pushdown(int rt){
if(lazy[rt]>){
lazy[rt<<]=lazy[rt<<|]=lazy[rt];
seg[rt<<]=seg[rt<<|]=seg[rt];
lazy[rt]=-;
}
}
void update(int l,int r,int rt,int x,int y){
if(l==x&&y==r){
lazy[rt]=seg[rt]=;
return;
}
pushdown(rt);
int mid=(l+r)/;
if(mid>=y)update(l,mid,rt<<,x,y);
else if(mid<x)update(mid+,r,rt<<|,x,y);
else {
update(l,mid,rt<<,x,mid);
update(mid+,r,rt<<|,mid+,y);
}
push_up(rt);
}
void update1(int l,int r,int rt,int x){
if(l==r){
lazy[rt]=seg[rt]=;
return;
}
pushdown(rt);
int mid=(l+r)/;
if(mid>=x)update1(l,mid,rt<<,x);
else update1(mid+,r,rt<<|,x);
push_up(rt);
}
int query(int l,int r,int rt,int x,int y){
if(l==x&&r==y){
return seg[rt];
}
pushdown(rt);
int mid=(l+r)/;
if(mid>=y)return query(l,mid,rt<<,x,y);
else if(mid<x) return query(mid+,r,rt<<|,x,y);
else {
return min(query(l,mid,rt<<,x,mid),query(mid+,r,rt<<|,mid+,y));
}
} int main(){
while(~scanf("%d",&n)){
init();
for(int i=;i<n;i++){
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
DFS(,);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&t1,&t2);
if(t1==){
int temp=query(,now,,ll[t2],rr[t2]);
update(,now,,ll[t2],rr[t2]);
if(temp==&&t2!=)
update1(,now,,ll[fa[t2]]);
}
else if(t1==){
update1(,now,,ll[t2]);
}
else {
printf("%d\n",query(,now,,ll[t2],rr[t2]));
}
}
}
}

Water Tree的更多相关文章

  1. Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序

    Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...

  2. 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/ ...

  3. 【题解】Luogu CF343D Water Tree

    原题传送门:CF343D Water Tree 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 这明显是弱智题 树剖套珂朵莉树多简单啊 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自 ...

  4. 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 ...

  5. Water Tree(树链剖分+dfs时间戳)

    Water Tree http://codeforces.com/problemset/problem/343/D time limit per test 4 seconds memory limit ...

  6. xtu summer individual 6 F - Water Tree

    Water Tree Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Orig ...

  7. 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 ...

  8. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  9. D. Water Tree

    D. Water Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...

  10. 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 ...

随机推荐

  1. SQL多行拼接为一行

    使用简单T-SQL,拼接一列多行为一行.按SQL SERVER的说法叫做自拼接(PS:区分自连接) 还有一种方法是for xml path的方式,感觉不实用. declare @Result varc ...

  2. 《转载》CSS中的三种样式来源:创作人员、读者和用户代理

    CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...

  3. win7下配置apache和php

    1.软件装备 PHP:http://php.net/downloads.php non-thread-safe是非安全线程主要与IIS搭配环境. thread-safe安全线程与Apache搭配环境. ...

  4. SQL语句一之建库

    USE master --转到系统表goIF EXISTS(SELECT *  FROM sysdatabases WHERE name ='Test') --查询是否存在Test数据库DROP DA ...

  5. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  6. Java SE Java EE Java ME 的区别

    Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...

  7. Android学习笔记(SQLite的简单使用)

    1.SQLite介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且 ...

  8. ios 设置label的高度随着内容的变化而变化

    好吧 步骤1:创建label _GeRenJianJie = [[UILabel alloc]init]; 步骤2:设置label _GeRenJianJie.textColor = RGBAColo ...

  9. 2014年10月30日-----SQL的基础知识

    数据库的概念 结构化查询语言:structured query language 简称:SQL 数据库管理系统:database management system 简称:DBMS 数据库管理员:da ...

  10. 2D动态光照

    对场景内所有点发出射线, 如果射线被某条边阻挡, 则射线停留在阻挡的边上, 如果射线顺利抵达终点, 则对射线偏移-0.001, +0.001角度, 再射出2条射线, 停留在后续的阻挡边上. 把最终的射 ...