HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)

描述
There is a company that has N employees(numbered from 1 to N),every employee in the company has a immediate boss (except for the leader of whole company).If you are the immediate boss of someone,that person is your subordinate, and all his subordinates are your subordinates as well. If you are nobody's boss, then you have no subordinates,the employee who has no immediate boss is the leader of whole company.So it means the N employees form a tree.
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

题意

有N个雇员,然后有N-1行每行u,v代表v是u的老板,当老板有任务时,他会让他的下属一起做这个任务

有M个操作,操作C代表询问雇员X当前的任务是什么,没有输出-1,操作T代表给雇员X一个任务Y

题解

首先可以看出一个关系树,我们知道dfs时间戳可以知道每个节点为根开始访问的第一个节点(本身)s和最后一个节点e

然后我们用线段树去维护

对于操作C,我们直接单点s[x]查询

对于操作T,我们通过dfs序,区间[s[x],e[x]]修改延迟标记

代码

1 1 #include<stdio.h> 2 2 #include<string.h> 3 3 #include<vector> 4 4 using namespace std; 5 5 6 6 const int N=5e4+5; 7 7 8 8 int n,ans; 9 9 int s[N],e[N],vis[N],tot; 1010 int lazy[N<<2]; 1111 vector<int>G[N]; 1212 1313 void PushDown(int rt) 1414 { 1515 if(lazy[rt]!=-1) 1616 { 1717 lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt]; 1818 lazy[rt]=-1; 1919 } 2020 } 2121 2222 void Update(int L,int R,int task,int l,int r,int rt) 2323 { 2424 if(L<=l&&r<=R) 2525 { 2626 lazy[rt]=task; 2727 return; 2828 } 2929 int mid=(l+r)>>1; 3030 PushDown(rt); 3131 if(L<=mid)Update(L,R,task,l,mid,rt<<1); 3232 if(R>mid)Update(L,R,task,mid+1,r,rt<<1|1); 3333 } 3434 3535 void Query(int L,int l,int r,int rt) 3636 { 3737 if(L==l&&L==r) 3838 { 3939 ans=lazy[rt]; 4040 return; 4141 } 4242 int mid=(l+r)>>1; 4343 PushDown(rt); 4444 if(L<=mid)Query(L,l,mid,rt<<1); 4545 else Query(L,mid+1,r,rt<<1|1); 4646 } 4747 4848 void dfs(int u) 4949 { 5050 tot++; 5151 s[u]=tot; 5252 for(auto X:G[u])dfs(X); 5353 e[u]=tot; 5454 } 5555 5656 int main() 5757 { 5858 int t,q,u,v,x,y,o=1; 5959 char op[3]; 6060 scanf("%d",&t); 6161 while(t--) 6262 { 6363 printf("Case #%d:\n",o++); 6464 memset(vis,0,sizeof vis); 6565 memset(lazy,-1,sizeof lazy); 6666 scanf("%d",&n); 6767 for(int i=1;i<=n;i++)G[i].clear(); 6868 for(int i=1;i<n;i++) 6969 { 7070 scanf("%d%d",&u,&v); 7171 vis[u]=1; 7272 G[v].push_back(u); 7373 } 7474 ///dfs序 7575 for(int i=1;i<=n;i++) 7676 if(!vis[i]){tot=0;dfs(i);break;} 7777 scanf("%d",&q); 7878 for(int i=0;i<q;i++) 7979 { 8080 scanf("%s",op); 8181 if(op[0]=='C') 8282 { 8383 scanf("%d",&x); 8484 Query(s[x],1,n,1); 8585 printf("%d\n",ans); 8686 } 8787 if(op[0]=='T') 8888 { 8989 scanf("%d%d",&x,&y); 9090 Update(s[x],e[x],y,1,n,1); 9191 } 9292 } 9393 } 9494 return 0; 9595 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改) - HelloWorld