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. jquery和js的几种页面加载函数的方法以及执行顺序

    参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html    https://www.cnblogs.com/james641/p/783837 ...

  2. Lodop生成文档式模版

    Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍文档式模版的生成方法.两种模版都可以存入一下地方进行调用,比 ...

  3. Tembin

    1:组织机构和用户之间是多对一的关系,一个组织结构可以有多个成员,一个成员只能属于一个组织机构. 2:app里面的邀请成员:是邀请发送短信通知用户注册tembin账户,当用户去注册的时候下面就会显示所 ...

  4. web.xml中三种通配符及匹配规则

    一.url-pattern的三种写法 1.精确匹配.以”/”开头,加上servlet名称:    /ad  ; 2.路径匹配.以”/”开头,加上通配符”*” :    /*  ; 3.扩展名匹配.以通 ...

  5. linux固定IP

    在新安装的Linux系统命令行下, 敲入:ifconfig,显示如下界面. 上面这张图显示网卡没有启动,那么我们敲入代码:ifup eth0启动网卡. 网卡启动后,我们可以看出,IP地址和网关等其他信 ...

  6. bzoj-1191(二分图最大匹配)

    解题思路:比较裸的一道题,直接跑匈牙利就行了,但是要注意一点,这个兔崽子是在闯关,一道题回答不出来就没了,直接在题目循环那里加一个else break;就行了!!!; #include<iost ...

  7. Jquery根据滚动条显示返回按钮

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  8. 读取jar文件的sha1码,请求maven官方的solrsearch接口查询该jar文件所对应的maven坐标信息

    版权声明:本文为博主原创文章,未经博主允许不得转载. import com.google.gson.JsonObject; import com.google.gson.JsonParser; imp ...

  9. Java虚拟机构建对象过程小记

    Java对象的内存分布 Java对象的构建 Java程序中,新建对象,除了常见的new语句之外,还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstan ...

  10. Codeforces Round #514 (Div. 2) C. Sequence Transformation 思维构造

    题意 给出一个1-n的集合   gcd 集合里面的所有数  得到的 一个 数   然后自己选择删去一个数   要使得到的数 构成的数列 的字典序最大 思路: gcd所有数 那gcd得到的数肯定要小于数 ...