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

Problem Description
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.

 
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
 
思路:
对给定的树,做某个节点下的整点修改。
竟然是用dfs序,作为更新的区间,这实在是太可怕了,虽然除此之外的东西比较简单,我还是wa了不少,是在是太菜了。
得到一个教训,可以push_down的,就一定要及时push_down!
#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的更多相关文章

  1. HDU3974 Assign the task —— dfs时间戳 + 线段树

    题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...

  2. hdu3974 Assign the task dfs序+线段树

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  3. hdu3974 Assign the task【线段树】

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  4. 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 im ...

  5. kuangbin专题七 HDU3974 Assign the task (dfs时间戳建树)

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  6. HDU-3974 Assign the task(多叉树DFS时间戳建线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3974 Time Limit: 15000/5000 MS (Java/Others)    Memory Lim ...

  7. HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)

    题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树).当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工 ...

  8. hdu3974 Assign the task线段树 dfs序

    题意: 无序的给编号为1-n的员工安排上下级, 操作一:给一个员工任务C,则该员工以及他的下级任务都更换为任务C 操作二:询问一个员工,返回他的任务   题解: 给一个员工任务,则他所在组都要改变,联 ...

  9. HDU 3974 Assign the task 暴力/线段树

    题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

随机推荐

  1. Python——进程队列

    队列 先进先出 from multiprocessing import Queue q = Queue(5) #队列的大小 q.put(1) #放入内容 q.put(2) #放入内容 q.put(3) ...

  2. 学习 Spring (八) 注解之 Bean 的定义及作用域

    Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...

  3. Vivado安装、生成bit文件及烧录FPGA的简要流程

    https://wenku.baidu.com/view/0294cbb3bb4cf7ec4bfed01a.html

  4. Nginx grpc反向代理

    L111 首先Grpc 默认编译进Nginx 但是依赖http_v2模块 需要编译进nginx 具体指令可以参考Nginx http 反向代理 指令都类似 分布式反向代理 server { serve ...

  5. 实验吧 WEB 貌似有点难

    错误!你的IP不在允许列表之内! 提示:代码审计 这个提示可谓是非常良心了,一看源代码是一个识别ip地址的东西,如果IP为1.1.1.1那么就会得到KEY. 第一个if是判断是否有client-ip ...

  6. kubernetes 容器挂载 ceph rbd 卷的平滑扩容方法

    https://blog.csdn.net/aixiaoyang168/article/details/79120095

  7. eclipse中无法查看引用的jar包源码

    本文来源:http://blog.csdn.NET/zljjava/article/details/7545270(这篇博客也是转载的,向最原始的作者致敬) 1.下载JAD jad官方地址的官方下载地 ...

  8. BZOJ3133[ballmachine]——倍增+优先队列

    题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...

  9. webpack——快速入门【一】

    学习webpack https://github.com/webproblem/learning-article#webpack https://github.com/lengziyu/learn-w ...

  10. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...