ZOJ 3686 A Simple Tree Problem

2014-11-24 01:41:28 · 作者: · 浏览: 1
这个题大一的时候做过,当时感觉好 ,题目这么简洁,但是暴力都不会写。
现在重写,其实算是个比较经典的做法了吧,利用dfs到的时间戳构建一个线段树,
然后就是不难想的基本操作改改了。
注意:懒惰标记不要搞错,如果对一个点有2个懒惰标记这个点懒惰标记取0.
/* 
    author:ray007great 
    version:1.0 
*/  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
using namespace std;  
typedef long long ll;  
/*  define */  
  
#define sf(a) scanf("%d",&a)  
#define sfs(a) scanf("%s",a)  
#define sfI(a) scanf("%I64d",&a)  
#define pf(a) printf("%d\n",a)  
#define pfI(a) printf("%I64d\n",a)  
#define rep(i,a,b) for(int i=(a);i<=(b);i++)  
#define repd(i,a,b) for(int i=(a);i>=(b);i--)  
#define rep1(i,a,b) for(int i=(a);i<(b);i++)  
#define clr(a) memset(a,0,sizeof(a))  
#define pfk  printf("fuck\n")  
  
/*  define */  
  
const int N = 310000;  
int clock1;  
int lleft[N],rright[N];  
int val[4*N],lazy[4*N];  
vector g[N];  
void dfs(int x){  
    if(lleft[x]) return ;  
    lleft[x]=++clock1;  
    int sz=g[x].size();  
    for(int i=0;i
>1; if(lazy[o]){ Cov(l,m,o<<1);Cov(m+1,r,o<<1|1); lazy[o]=0; } } int ql,qr;//query range int query(int l,int r,int o){ if(l>=ql && r<=qr) return val[o]; release(l,r,o); int m=(l+r)>>1,res=0; if(ql<=m) res+=query(l,m,o<<1); if(m=ul && r<=ur){ Cov(l,r,o);return ; } release(l,r,o); int m=(l+r)>>1; if(ul<=m) update(l,m,o<<1); if(m