HDU 3974 Assign the task
Assign the task
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.
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)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio> using namespace std;
const int maxn = ;
struct node{
int to,next;
}e[maxn];
int a[maxn<<],add[maxn<<];
int f[maxn],head[maxn];
int ls[maxn],rs[maxn];
int n,m,T,cnt,num;
void ade(int u,int v)//加边 便于dfs搜索
{
e[cnt].to = u;
e[cnt].next = head[v];
head[v] = cnt++;
}
int Find(int x){//并查集
if(x!=f[x])
f[x] = Find(f[x]);
return f[x];
}
void dfs(int rt)//求出当前节点覆盖的区间左值和右值
{
int x = head[rt];
ls[rt] = ++num;
while(x!=-){
dfs(e[x].to);
x = e[x].next;
}
rs[rt] = num;
}
void pushdown(int rt)
{
if(add[rt]){
a[rt<<] = a[rt];
a[rt<<|] = a[rt];
add[rt<<] = add[rt];
add[rt<<|] = add[rt];
add[rt] = ;
}
}
void build(int l,int r,int rt)
{
a[rt] = -;//
add[rt] = ;//此处初始化所有点线段树节点都为-1和0;
if(l==r)return;
int mid = (l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
void update(int L,int R,int C,int l,int r,int rt)
{
if(L<=l&&r<=R){
a[rt] = C;
add[rt] = C;
return;
}
pushdown(rt);//下推懒惰标记
int mid = (l+r)>>;
if(L<=mid)update(L,R,C,l,mid,rt<<);
if(R>mid)update(L,R,C,mid+,r,rt<<|);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return a[rt];
pushdown(rt);//下推懒惰标记
int mid = (l+r)>>;
int ans = ;
if(L<=mid) ans += query(L,R,l,mid,rt<<);
if(R>mid) ans += query(L,R,mid+,r,rt<<|);
return ans;
}
int main()
{
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&n);
cnt = ,num = ;
for(int i=;i<=n;i++){
f[i]=i;head[i]=-;
ls[i]=,rs[i]=;
}
for(int l,r,i=;i<n;i++){
scanf("%d%d",&l,&r);
f[l]=r;
ade(l,r);
}
int root = Find();//利用并查集的思想求出根节点
dfs(root);//根据根节点 求出每个节点覆盖的区间 区间左值在ls中,右值在rs中
// cout<<ls[root]<<" "<<rs[root]<<endl;
// for(int i=1;i<=n;i++)
// cout<<ls[i]<<" "<<rs[i]<<endl;
// getchar();
build(,n,);
scanf("%d",&m);
char op;int x,y;
printf("Case #%d:\n",t);
while(m--){
scanf(" %c",&op);
if(op=='C'){
scanf("%d",&x);
printf("%d\n",query(ls[x],ls[x],,n,));//区间的单点查询
}else if(op=='T'){
scanf("%d%d",&x,&y);
update(ls[x],rs[x],y,,n,);//区间更新当前的任务
}
}
}
return ;
}
HDU 3974 Assign the task的更多相关文章
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- HDU 3974 Assign the task 暴力/线段树
题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 3974 Assign the task(简单线段树)
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3974 Assign the task (DFS序 + 线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 给你T组数据,n个节点,n-1对关系,右边的是左边的父节点,所有的值初始化为-1,然后给你q个操 ...
- 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 ...
- HDU 3974 Assign the task 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=3974 题目大意: 一个公司有N个员工,对于每个员工,如果他们有下属,那么他们下属的下属也是他的下属. 公司会给员 ...
- hdu 3974 Assign the task(线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意:给定一棵树,50000个节点,50000个操作,C x表示查询x节点的值,T x y表示更 ...
- hdu 3974 Assign the task (线段树+树的遍历)
Description There is a company that has N employees(numbered from 1 to N),every employee in the comp ...
- hdu 3974 Assign the task(dfs序上线段树)
Problem Description There is a company that has N employees(numbered from 1 to N),every employee in ...
随机推荐
- 【水滴石穿】AB-B-Clone
地址: 源码 运行效果 无别的效果,代码如下 //index.js /** * @format * @lint-ignore-every XPLATJSCOPYRIGHT1 */ import {Ap ...
- 【JZOJ4882】【NOIP2016提高A组集训第12场11.10】多段线性函数
题目描述 数据范围 解法 三分找出极值,两个二分找出极值的范围. 代码 #include<iostream> #include<stdio.h> #include<str ...
- ActiveX控件的消息处理函数
首先切换到类视图 然后鼠标单击选中类(如果你要给ClockCtrl类添加事件,你就选中ClockCtrl类) PS:顺便多说一句,如果不用这种方法,而是手动添加,即使你的代码跟MFC添加的一模一样,那 ...
- 使用 Markdown Flow 画流程图
使用 Markdown Flow 画流程图 好处是可以方便的使用 Git 管理版本 st=>start: 开始 e=>end: 结束 c1=>condition: A c2=> ...
- 在 Linux Mint 19 上安装 zsh 和设置小键盘一步到位
在 Linux Mint 19 上安装 zsh 和设置小键盘 安装 zsh 并设置 zsh 为默认 shell 安装 sudo apt install zsh 设置 zsh 为默认 shell,注意没 ...
- iOS开发周报-- 第一期
从Java转iOS第一个项目总结 http://www.cocoachina.com/ios/20150417/11595.html icon设计探讨:图标,文字,还是图标加文字? http://ww ...
- Oracle错误——引发ORA-01843:无效的月份。
问题 引发ORA-01843:无效的月份. 解决 改动client会话日期的语言: ALTER SESSION SET nls_date_language='american';
- LeetCode93 Restore IP Addresses
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- 括号序列问题 uva 1626 poj 1141【区间dp】
首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...
- Mysql Command
数据库备份: mysqldump -uroot -p -h 192.168.1.190 --default-character-set=utf8 $dbname > backup_db.sql ...