HDU3974 Assign the task
阿新 • • 發佈:2018-07-25
dia pac print more key size class bottom problem
The company usually assigns some tasks to some employees to finish.When a task is assigned to someone,He/She will assigned it to all his/her subordinates.In other words,the person and all his/her subordinates received a task in the same time. Furthermore,whenever a employee received a task,he/she will stop the current task(if he/she has) and start the new one.
Write a program that will help in figuring out some employee’s current task after the company assign some tasks to some employee.
InThe first line contains a single positive integer T( T <= 10 ), indicates the number of test cases.
For each test case:
The first line contains an integer N (N ≤ 50,000) , which is the number of the employees.
The following N - 1 lines each contain two integers u and v, which means the employee v is the immediate boss of employee u(1<=u,v<=N).
The next line contains an integer M (M ≤ 50,000).
The following M lines each contain a message which is either
"C x" which means an inquiry for the current task of employee x
or
"T x y"which means the company assign task y to employee x.
(1<=x<=N,0<=y<=10^9)
Output
For each test case, print the test case number (beginning with 1) in the first line and then for every inquiry, output the correspond answer per line.
Sample Input
1
5
4 3
3 2
1 3
5 2
5
C 3
T 2 1
C 3
T 3 2
C 3
Sample Output
Case #1:
-1
1
2
Source
2011 Multi-University Training Contest 14 - Host by FZU
思路:
竟然是用dfs序,作為更新的區間,這實在是太可怕了,雖然除此之外的東西比較簡單,我還是wa了不少,是在是太菜了。
得到一個教訓,可以push_down的,就一定要及時push_down!
Assign the task
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5032 Accepted Submission(s): 1966
The company usually assigns some tasks to some employees to finish.When a task is assigned to someone,He/She will assigned it to all his/her subordinates.In other words,the person and all his/her subordinates received a task in the same time. Furthermore,whenever a employee received a task,he/she will stop the current task(if he/she has) and start the new one.
Write a program that will help in figuring out some employee’s current task after the company assign some tasks to some employee.
The first line contains an integer N (N ≤ 50,000) , which is the number of the employees.
The following N - 1 lines each contain two integers u and v, which means the employee v is the immediate boss of employee u(1<=u,v<=N).
The next line contains an integer M (M ≤ 50,000).
The following M lines each contain a message which is either
"C x" which means an inquiry for the current task of employee x
or
"T x y"which means the company assign task y to employee x.
(1<=x<=N,0<=y<=10^9)
#include<iostream> #include<vector> #include<cstdio> #include<cstring> using namespace std; const int maxn = 5e5+8; int First[maxn<<1],LAST[maxn<<1],wa; vector<int>u[maxn]; bool book[maxn]; struct node { int l,r; int num; bool lazy; }tree[maxn<<2]; void dfs(int t) { int siz=u[t].size(); First[t]=++wa; for(int i=0;i<siz;i++){ dfs(u[t][i]); } LAST[t]=++wa; } void build(int t,int l,int r) { tree[t].l=l;tree[t].r=r; tree[t].num=-1;tree[t].lazy=false; if(l==r){return;} int mid=(l+r)>>1; build(t<<1,l,mid); build((t<<1)|1,mid+1,r); } void push_down(int t) { tree[t<<1].num=tree[t].num; if(tree[t<<1].l!=tree[t<<1].r){tree[t<<1].lazy=true;} tree[(t<<1)|1].num=tree[t].num; if(tree[(t<<1)|1].l!=tree[(t<<1)|1].r){tree[(t<<1)|1].lazy=true;} tree[t].lazy=false; } void update(int t,int l,int r,int x) { if(tree[t].lazy)push_down(t); if(tree[t].l==l&&tree[t].r==r){ if(l!=r)tree[t].lazy=true; tree[t].num=x;return ; } int mid=(tree[t].l+tree[t].r)>>1; if(r<=mid){update(t<<1,l,r,x);} else if(l>mid){update((t<<1)|1,l,r,x);} else { update((t<<1),l,mid,x); update((t<<1)|1,mid+1,r,x); } } int query(int t,int x) { // cout<<t<<" "<<x<<" "<<tree[t].lazy<<endl; if(tree[t].lazy)push_down(t); if(tree[t].l==tree[t].r){ if(tree[t].l!=x){return -1;} return tree[t].num; } int mid=(tree[t].l+tree[t].r)>>1; if(x<=mid){return query(t<<1,x);} else if(x>mid){return query((t<<1)|1,x);} } int main() { int T,n; scanf("%d",&T); int re=0; while(T--){ re++; printf("Case #%d:\n",re); wa=0; memset(book,0,sizeof(book)); memset(First,0,sizeof(First)); memset(LAST,0,sizeof(LAST)); scanf("%d",&n); for(int i=0;i<=n+1;i++){ u[i].clear(); } int x,y; for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); u[y].push_back(x); book[x]++; } for(int i=1;i<=n;i++){ if(!book[i]){dfs(i);} } build(1,1,n*2); scanf("%d",&n); char p[5]; for(int i=1;i<=n;i++){ getchar(); scanf("%s",p); if(p[0]==‘C‘){ scanf("%d",&x); printf("%d\n",query(1,First[x])); } else if(p[0]==‘T‘){ scanf("%d%d",&x,&y); update(1,First[x],LAST[x],y); } } } return 0; }
HDU3974 Assign the task