[Assign the task][dfs序+线段树]
作者:互联网
http://acm.hdu.edu.cn/showproblem.php?pid=3974
Assign the task
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7144 Accepted Submission(s): 2708
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.
Input The 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 题意:给一棵树,有单点查询和区间更新两种操作 题解:通过dfs序转化为区间问题,使用线段树维护即可
1 #include<iostream> 2 #include<cstdio> 3 #include<stack> 4 using namespace std; 5 #define debug(x) cout<<"["<<#x<<"]"<<" is "<<x<<endl; 6 typedef long long ll; 7 const int maxn=5e4+5; 8 int n,head[maxn],in[maxn],out[maxn],cnt,tim; 9 bool f[maxn]; 10 struct node{ 11 int l; 12 int r; 13 int val; 14 int lazy; 15 }N[maxn<<2]; 16 struct edge{ 17 int q; 18 int w; 19 int nex; 20 }e[maxn<<1]; 21 void pushup(int rt){ 22 N[rt].val=N[rt<<1].val+N[(rt<<1)|1].val; 23 return; 24 } 25 void build(int L,int R,int rt){ 26 N[rt].l=L; 27 N[rt].r=R; 28 N[rt].lazy=0; 29 if(L==R){ 30 N[rt].val=-1; 31 return; 32 } 33 build(L,(L+R)/2,rt<<1); 34 build((L+R)/2+1,R,(rt<<1)|1); 35 } 36 void pushdown(int rt){ 37 if(N[rt].lazy){ 38 N[rt<<1].lazy=N[rt].lazy; 39 N[(rt<<1)|1].lazy=N[rt].lazy; 40 N[rt<<1].val=N[(rt<<1)|1].val=N[rt<<1].lazy; 41 N[rt].lazy=0; 42 } 43 } 44 void update(int L,int R,int rt,int L1,int R1,int c){ 45 if(L1<=L&&R1>=R){ 46 N[rt].val=c; 47 N[rt].lazy=c; 48 return; 49 } 50 int mid=(L+R)/2; 51 pushdown(rt); 52 if(L1<=mid)update(L,mid,rt<<1,L1,R1,c); 53 if(R1>mid)update(mid+1,R,(rt<<1)|1,L1,R1,c); 54 } 55 int query(int L,int R,int rt,int id){ 56 if(L==R){ 57 return N[rt].val; 58 } 59 int mid=(L+R)/2; 60 pushdown(rt); 61 if(id<=mid)return query(L,mid,rt<<1,id); 62 else return query(mid+1,R,(rt<<1)|1,id); 63 } 64 void adde(int x,int y){ 65 e[cnt].q=y; 66 e[cnt].w=x; 67 e[cnt].nex=head[y]; 68 head[y]=cnt++; 69 } 70 void dfs(int u){ 71 in[u]=++tim; 72 for(int i=head[u];i!=-1;i=e[i].nex){ 73 int v=e[i].w; 74 dfs(v); 75 } 76 out[u]=tim; 77 } 78 int main(){ 79 int t; 80 int case1=0; 81 scanf("%d",&t); 82 while(t--){ 83 scanf("%d",&n); 84 tim=0; 85 cnt=0; 86 for(int i=1;i<=n;i++){f[i]=0;head[i]=-1;} 87 build(1,n,1); 88 for(int i=1;i<n;i++){ 89 int a,b; 90 scanf("%d%d",&a,&b); 91 adde(a,b); 92 f[a]=1; 93 } 94 for(int i=1;i<=n;i++){if(!f[i])dfs(i);} 95 int k; 96 scanf("%d",&k); 97 printf("Case #%d:\n",++case1); 98 while(k--){ 99 char ch[10]; 100 scanf("%s",ch); 101 if(ch[0]=='T'){ 102 int x,xx; 103 scanf("%d%d",&x,&xx); 104 update(1,n,1,in[x],out[x],xx); 105 } 106 else{ 107 int x; 108 scanf("%d",&x); 109 printf("%d\n",query(1,n,1,in[x])); 110 } 111 } 112 } 113 return 0; 114 }View Code
标签:task,subordinates,company,some,dfs,employee,line,Assign 来源: https://www.cnblogs.com/MekakuCityActor/p/10802310.html