ZOJ 3686 A Simple Tree Problem
来源:互联网 发布:js隐藏img标签 编辑:程序博客网 时间:2024/06/06 03:41
这个题大一的时候做过,当时感觉好屌,题目这么简洁,但是暴力都不会写。
现在重写,其实算是个比较经典的做法了吧,利用dfs到的时间戳构建一个线段树,
然后就是不难想的基本操作改改了。
注意:懒惰标记不要搞错,如果对一个点有2个懒惰标记这个点懒惰标记取0.
/* author:ray007great version:1.0*/#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<queue>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<int> g[N];void dfs(int x){ if(lleft[x]) return ; lleft[x]=++clock1; int sz=g[x].size(); for(int i=0;i<sz;i++) dfs(g[x][i]); rright[x]=clock1;}void Up(int o){ val[o]=val[o<<1]+val[o<<1|1];}void Cov(int l,int r,int o){ val[o]=(r-l+1)-val[o];lazy[o]=!lazy[o];}void release(int l,int r,int o){ int m=(l+r)>>1; if(lazy[o]){ Cov(l,m,o<<1);Cov(m+1,r,o<<1|1); lazy[o]=0; }}int ql,qr;//query rangeint 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<qr) res+=query(m+1,r,o<<1|1); return res;}int ul,ur;//update rangevoid update(int l,int r,int o){ if(l>=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<ur) update(m+1,r,o<<1|1); Up(o);}void build(int l,int r,int o){ clr(val);clr(lazy);}int main(){ int n,q,x; while(~scanf("%d%d",&n,&q)){ clock1=0; for(int i=1;i<=n;i++) g[i].clear(); clr(lleft);clr(rright); for(int i=2;i<=n;i++){ scanf("%d",&x); g[x].push_back(i);g[i].push_back(x); } dfs(1);build(1,n,1); char op[10]; for(int i=1;i<=q;i++){ scanf("%s%d",op,&x); if(op[0]=='q'){ ql=lleft[x];qr=rright[x]; printf("%d\n",query(1,n,1)); } else if(op[0]=='o'){ ul=lleft[x];ur=rright[x]; update(1,n,1); } } printf("\n"); } return 0;}
- ZOJ 3686 A A Simple Tree Problem
- zoj 3686 A Simple Tree Problem
- ZOJ 3686 : A Simple Tree Problem
- zoj 3686 (a simple tree problem)
- ZOJ 3686 A Simple Tree Problem
- ZOJ 3686 A Simple Tree Problem
- ZOJ 3686 A Simple Tree Problem (线段树)
- ZOJ 3686 A Simple Tree Problem (线段树)
- zoj 3686 A Simple Tree Problem(dfs+线段树)
- ZOJ 3686-A Simple Tree Problem (DFS+线段树)
- ZOJ 3686 A Simple Tree Problem(线段树)
- ZOJ 3686 A Simple Tree Problem DFS+线段树(区间取反)
- zoj 3686 A Simple Tree Problem (经典,利用dfs序维护树)
- ZOJ 3686 A Simple Tree Problem(树转线段树+线段树区间更新)
- ZOJ 3686 A Simple Tree Problem(将对树的操作转化成区间=>线段树)
- ZOJ Monthly, March 2013 A题 A Simple Tree Problem(线段树)#zh
- BNU A Simple Tree Problem 线段树
- ZOJ3696-A Simple Tree Problem 线段树
- Android 漫游之路------直接拿来用!最火的Android开源项目(1)
- java 中 16 进制 HEX 转换成字节码形式的 UTF-8
- GTK+扫雷,目标达成,前来汇报,顺带一说按钮上色的疑惑
- 探索并发编程(七)------分布式环境中并发问题
- 获取当前程序,activity是否在运行
- ZOJ 3686 A Simple Tree Problem
- sql优化_sql server
- overlapped重叠IO
- 线程池ThreadPoolExecutor使用简介
- 2.22 Displaying Images with UIImageView
- 遍历 HashMap简单的方式
- SharePoint 2013 安装图解
- 初涉JDBC
- IOS 调用拨打电话