-
J - Assign the task
- HDU - 3974
- 按照dfs序建树,区间更新点查询
-
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; #define maxn 50020 struct edg { int to,v; } edge[maxn]; int head[maxn],tot,t; int cnt,start[maxn]; int n,END[maxn],u,v; bool vis[maxn]; struct node { int l,r,val,lazy; } tree[maxn*4]; void init() { tot=cnt=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); } void addedge(int u,int v) { edge[++tot].v=v; edge[tot].to=head[u]; head[u]=tot; } void dfs(int u) { ++cnt; start[u]=cnt; for(int i=head[u]; i!=-1; i=edge[i].to) dfs(edge[i].v); END[u]=cnt; } void push_up(int root,int v) { tree[root].val=v; tree[root].lazy=1; } void push_down(int root) { if(tree[root].lazy) { push_up(root<<1,tree[root].val); push_up(root<<1|1,tree[root].val); tree[root].lazy = 0; } } void build(int i,int l,int r) { tree[i].l = l; tree[i].r = r; tree[i].val = -1; tree[i].lazy = 0; if(l == r)return; int mid = (l+r)/2; build(i<<1,l,mid); build((i<<1)|1,mid+1,r); } void update(int i,int l,int r,int v) { if(tree[i].l == l && tree[i].r == r) { push_up(i,v); return; } push_down(i); int mid = (tree[i].l + tree[i].r)/2; if(r <= mid)update(i<<1,l,r,v); else if(l > mid)update((i<<1)|1,l,r,v); else { update(i<<1,l,mid,v); update((i<<1)|1,mid+1,r,v); } } int query(int i,int u) { if(tree[i].l == u && tree[i].r == u) return tree[i].val; push_down(i); int mid = (tree[i].l + tree[i].r)/2; if(u <= mid)return query(i<<1,u); else return query((i<<1)|1,u); } int main() { scanf("%d",&t); for(int cas=1; cas<=t; cas++) { printf("Case #%d:\n",cas); init(); scanf("%d",&n); for(int i = 1; i < n; i++) { scanf("%d%d",&u,&v); vis[u] = true; addedge(v,u); } for(int i = 1; i <= n; i++) if(!vis[i]) { dfs(i); break; } build(1,1,cnt); char op[10]; int m; scanf("%d",&m); while(m--) { scanf("%s",op); if(op[0] == 'C') { scanf("%d",&u); printf("%d\n",query(1,start[u])); } else { scanf("%d%d",&u,&v); update(1,start[u],END[u],v); } } } return 0; }