HDU3974 Assign the task
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)
5
4 3
3 2
1 3
5 2
5
C 3
T 2 1
C 3
T 3 2
C 3
-1
1
2
#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的更多相关文章
- HDU3974 Assign the task —— dfs时间戳 + 线段树
题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- HDU-3974 Assign the task(多叉树DFS时间戳建线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=3974 Time Limit: 15000/5000 MS (Java/Others) Memory Lim ...
- HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树).当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工 ...
- hdu3974 Assign the task线段树 dfs序
题意: 无序的给编号为1-n的员工安排上下级, 操作一:给一个员工任务C,则该员工以及他的下级任务都更换为任务C 操作二:询问一个员工,返回他的任务 题解: 给一个员工任务,则他所在组都要改变,联 ...
- HDU 3974 Assign the task 暴力/线段树
题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- jquery和js的几种页面加载函数的方法以及执行顺序
参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html https://www.cnblogs.com/james641/p/783837 ...
- Lodop生成文档式模版
Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍文档式模版的生成方法.两种模版都可以存入一下地方进行调用,比 ...
- Tembin
1:组织机构和用户之间是多对一的关系,一个组织结构可以有多个成员,一个成员只能属于一个组织机构. 2:app里面的邀请成员:是邀请发送短信通知用户注册tembin账户,当用户去注册的时候下面就会显示所 ...
- web.xml中三种通配符及匹配规则
一.url-pattern的三种写法 1.精确匹配.以”/”开头,加上servlet名称: /ad ; 2.路径匹配.以”/”开头,加上通配符”*” : /* ; 3.扩展名匹配.以通 ...
- linux固定IP
在新安装的Linux系统命令行下, 敲入:ifconfig,显示如下界面. 上面这张图显示网卡没有启动,那么我们敲入代码:ifup eth0启动网卡. 网卡启动后,我们可以看出,IP地址和网关等其他信 ...
- bzoj-1191(二分图最大匹配)
解题思路:比较裸的一道题,直接跑匈牙利就行了,但是要注意一点,这个兔崽子是在闯关,一道题回答不出来就没了,直接在题目循环那里加一个else break;就行了!!!; #include<iost ...
- Jquery根据滚动条显示返回按钮
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 读取jar文件的sha1码,请求maven官方的solrsearch接口查询该jar文件所对应的maven坐标信息
版权声明:本文为博主原创文章,未经博主允许不得转载. import com.google.gson.JsonObject; import com.google.gson.JsonParser; imp ...
- Java虚拟机构建对象过程小记
Java对象的内存分布 Java对象的构建 Java程序中,新建对象,除了常见的new语句之外,还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstan ...
- Codeforces Round #514 (Div. 2) C. Sequence Transformation 思维构造
题意 给出一个1-n的集合 gcd 集合里面的所有数 得到的 一个 数 然后自己选择删去一个数 要使得到的数 构成的数列 的字典序最大 思路: gcd所有数 那gcd得到的数肯定要小于数 ...