CH MFOI day2男树
2016-01-13 20:51
211 查看
权值线段树合并+打标记差分
打标记后往上合并线段树。。记得判空
打标记后往上合并线段树。。记得判空
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> using namespace std; #define N 1000010 int n,m,tot,d; struct Node{ int L,R,num; bool ok; }t[N*20]; int Stack ,root ,cnt; struct Edge{ int to,next; }edge ; int head ,S_tot; int Sg ; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f; } void Addedge(int u,int v) { S_tot++;edge[S_tot].to=v;edge[S_tot].next=head[u];head[u]=S_tot; } void Updata(int &i,int l,int r,int pos,int val) { if(!i)i=++tot; if(l==r) { t[i].num+=val; t[i].ok=(t[i].num>0); return; } int mid=(l+r)/2; if(pos<=mid) Updata(t[i].L,l,mid,pos,val); else Updata(t[i].R,mid+1,r,pos,val); t[i].ok=(t[t[i].L].ok&&t[t[i].R].ok); } int Query(int i,int l,int r) { if(l==r||!i) return l; int mid=(l+r)/2; if(!t[t[i].L].ok) return Query(t[i].L,l,mid); else return Query(t[i].R,mid+1,r); } int Merge(int x,int y,int l,int r) { if(!x||!y) return x+y; if(l==r) { t[x].num+=t[y].num; t[x].ok=(t[x].num>0); return x; } int mid=(l+r)/2; t[x].L=Merge(t[x].L,t[y].L,l,mid); t[x].R=Merge(t[x].R,t[y].R,mid+1,r); t[x].ok=(t[t[x].L].ok&&t[t[x].R].ok); return x; } void DFS(int k) { Stack[++cnt]=k;root[k]=++tot; for(int i=head[k];i;i=edge[i].next) { int v=edge[i].to; DFS(v); } for(int i=head[k];i;i=edge[i].next) { int v=edge[i].to; root[k]=Merge(root[k],root[v],0,n); } Sg[k]=Query(root[k],0,n); Updata(root[k],0,n,Sg[k],1); if(cnt-d-1>0) Updata(root[Stack[cnt-d-1]],0,n,Sg[k],-1); cnt--; } int main() { n=read();d=read(); for(int i=2;i<=n;i++) { int x=read(); Addedge(x,i); } DFS(1); m=read(); while(m--) { int c=read(),Ans=0; for(int i=1;i<=c;i++) { int x=read(); Ans^=Sg[x]; } if(Ans) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 工程师之路点滴心得
- js的闭包--匿名函数的使用
- org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
- Caching-缓存架构与源码分析
- SpringMVC知识2:配置
- 在技术博客中添加Gi技术实现f效果图
- Android MVC MVP
- Touch
- VGG_19 train_vali.prototxt file
- python基础知识-列表,元组,字典
- 使用XCODE 的SOURCE CONTROL 做版本控制 (1)
- Filemanager 的使用
- leetcode234---Palindrome Linked List(回文链表)
- 【HDU】 1671 Phone List
- zh-cn 和zh的意思
- 使用逐帧动画实现一个忐忑的精灵动画
- 身份验证
- 全局通知Notification
- 延时方式整理
- 《慷慨篇》 --汪精卫