1. 程式人生 > >J - Assign the task

J - Assign the task

printf .net con std query ram borde size style

J - Assign the task

HDU - 3974 思路:一眼秒思路<(* ̄▽ ̄*)/ dfs序+線段樹。 通過dfs序把樹上問題轉化成線段上的問題。然後用線段樹解決。 錯因:都是些zz的錯誤就不說了技術分享圖片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 50010
using namespace std;
int t,n,m;
int sz,tot,sum,root;
int to[MAXN*2],net[MAXN*2],head[MAXN]; int dad[MAXN],idl[MAXN],idr[MAXN],edge[MAXN]; struct nond{ int l,r,flag; }tree[MAXN*4]; void add(int u,int v){ to[++tot]=v;net[tot]=head[u];head[u]=tot; } void build(int now,int l,int r){ tree[now].l=l;tree[now].r=r; tree[now].flag=-1;
if(tree[now].l==tree[now].r) return ; int mid=(tree[now].l+tree[now].r)/2; build(now*2,l,mid); build(now*2+1,mid+1,r); } void down(int now){ tree[now*2].flag=tree[now*2+1].flag=tree[now].flag; tree[now].flag=-1; return ; } void change(int now,int l,int r,int pos){
if(tree[now].l==l&&tree[now].r==r){ tree[now].flag=pos; return ; } if(tree[now].flag!=-1) down(now); int mid=(tree[now].l+tree[now].r)/2; if(r<=mid) change(now*2,l,r,pos); else if(l>mid) change(now*2+1,l,r,pos); else { change(now*2,l,mid,pos);change(now*2+1,mid+1,r,pos); } } int query(int now,int x){ if(tree[now].l==tree[now].r) return tree[now].flag; if(tree[now].flag!=-1) down(now); int mid=(tree[now].l+tree[now].r)/2; if(x<=mid) return query(now*2,x); else return query(now*2+1,x); } void dfs(int now){ idl[now]=++sz; for(int i=head[now];i;i=net[i]) if(dad[now]!=to[i]){ dad[to[i]]=now; dfs(to[i]); } idr[now]=++sz; } int main(){ scanf("%d",&t); while(t--){ sum++;printf("Case #%d:\n",sum); scanf("%d",&n);tot=0; for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); add(v,u);edge[u]++; } for(int i=1;i<=n;i++) if(edge[i]==0){ root=i;break; } dfs(root);build(1,1,sz); scanf("%d",&m); for(int i=1;i<=m;i++){ char c;int x,y; scanf("\n%c%d",&c,&x); if(c==T){ scanf("%d",&y); change(1,idl[x],idr[x],y); } else printf("%d\n",query(1,idl[x])); } root=0;sz=0; memset(to,0,sizeof(to)); memset(idl,0,sizeof(idl)); memset(idr,0,sizeof(idr)); memset(net,0,sizeof(net)); memset(dad,0,sizeof(dad)); memset(edge,0,sizeof(head)); memset(head,0,sizeof(head)); } } /* 1 5 4 3 3 2 1 3 5 2 5 C 3 T 2 1 C 3 T 3 2 C 3 */

J - Assign the task