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 ...
随机推荐
- qtp 自动化测试---点滴 获取属性性/修改窗体标题
1 GetROProperty获取对应属性值 value url (这里出错了) If Window("新增").WinObject("TRzDBEdit_10" ...
- 在delphi中生成GUID/自动获取临时表名......
什么是 GUID ? 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID. GUID 的格式为 ...
- Java反射交换两个整型变量的值
在一次面试中,做了这么一道题"交换两个整型变量的值",当时看到这个题目之后,会心一笑,这也太简单了--直接使用中间变量交换不就可以了吗?但是,面试官却说不需要返回值,在调用的地方, ...
- cookie的域,路径
Cookie 的路径以及 Cookie 域 cookie 路径 cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie.在默认情况下,出 ...
- 工厂类,配置文件,静态方法,反射构成编译器解耦;ioc的一个概念 ;通过xml创建容器里面存储对象
工厂类,配置文件,静态,反射方法构成编译器解耦;ioc的一个概念
- ftell 的使用
ftell一般用于读取文件的长度,下面补充一个例子,读取文本文件中的内容: #include <stdio.h> #include <stdlib.h> int main() ...
- EasyUI-datebox设置开始日期小于结束日期,并且结束日期小于当前日期
datebox设置开始日期小于结束日期,并且结束日期小于当前日期 //日期控制扩展选择日期小于等于当前日期,开始日期小于等于结束日期 $("#datebox1").datebox( ...
- python的图形模块PIL小记
前言: 跟我一块住的室友是个搞通信,每天下班后基本必须做的事情是,第一P图,将那些不合格的图片上的数据,p成合格的.第二就是将做好的P图以及产生的日志文件按照固定的名字重新命名.我为了他能够早点睡觉, ...
- HDU 1556-Color the ball-树状数组
树状数组的成段更新. 首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和. 更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1.这时,query(a) ...
- 自学华为IoT物联网_04 车联网常见问题及解决方案
点击返回自学华为IoT物流网 自学华为IoT物联网_04 车联网常见问题及解决方案 1.1 可以预见的车联网未来 车辆对车辆.车辆对道路.车辆对网络通信 车辆对外发送车辆状态信息 周边环境信息发送给车 ...