http://acm.hdu.edu.cn/showproblem.php?pid=3974

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.

 
Input
The 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

代码:

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + 10;
int T, N;
int head[maxn];
int cnt, tot;
int st[maxn], en[maxn];
bool used[maxn]; struct Edge {
int to, nx;
}edge[maxn]; struct Node {
int val;
int l, r;
int lazy;
}node[maxn * 4]; void init() {
cnt = 0;
tot = 0;
memset(head, -1, sizeof(head));
} void addedge(int u, int v) {
edge[tot].to = v;
edge[tot].nx = head[u];
head[u] = tot ++;
} void dfs(int u) {
cnt ++;
st[u] = cnt;
for(int i = head[u]; i != -1; i = edge[i].nx)
dfs(edge[i].to);
en[u] = cnt;
} void Update_Same (int r, int v) {
if(r) {
node[r].val = v;
node[r].lazy = 1;
}
} void push_down(int r) {
if(node[r].lazy) {
Update_Same(r * 2, node[r].val);
Update_Same(r * 2 + 1, node[r].val);
node[r].lazy = 0;
}
} void Build(int i, int l, int r) {
node[i].l = l;
node[i].r = r;
node[i].val = -1;
node[i].lazy = 0;
if(l == r) return ;
int mid = (l + r) / 2;
Build(i * 2, l, mid);
Build(i * 2 + 1, mid + 1, r);
} void update(int i, int l, int r, int v) {
if(node[i].l == l && node[i].r == r) {
Update_Same(i, v);
return;
}
push_down(i);
int mid = (node[i].l + node[i].r) / 2;
if(r <= mid) update(i * 2, l, r, v);
else if(l > mid) update(i * 2 + 1, l, r, v);
else {
update(i * 2, l, mid, v);
update(i * 2 + 1, mid + 1, r, v);
}
} int query(int i, int u) {
if(node[i].l == u && node[i].r == u)
return node[i].val;
push_down(i);
int mid = (node[i].l + node[i].r) / 2;
if(u <= mid) return query(i * 2, u);
else return query(i * 2 + 1, u);
} int main() {
scanf("%d", &T);
for(int t = 1; t <= T; t ++) {
printf("Case #%d:\n", t);
int u, v;
memset(used, false, sizeof(used));
init();
scanf("%d", &N);
for(int i = 1; i < N; i ++) {
scanf("%d%d", &u, &v);
used[u] = true;
addedge(v, u);
}
for(int i = 1; i <= N; i ++) {
if(!used[i]) {
dfs(i);
break;
}
}
Build(1, 1, cnt);
char op[10];
int M;
scanf("%d", &M);
while(M --) {
scanf("%s", op);
if(op[0] == 'C') {
scanf("%d", &u);
printf("%d\n", query(1, st[u]));
} else {
scanf("%d%d", &u, &v);
update(1, st[u], en[u], v);
}
}
}
return 0;
}

  线段树 模板题 链表存图 区间修改单点查询 今天小目标之一把这个搞清楚可以自己写粗来

何生枷锁

HDU 3947 Assign the task的更多相关文章

  1. HDU 3974 Assign the task 并查集/图论/线段树

    Assign the task Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

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

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

  3. HDU 3974 Assign the task(简单线段树)

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. hdu 3874 Assign the task

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 3974 Assign the task

    Assign the task Problem Description There is a company that has N employees(numbered from 1 to N),ev ...

  6. 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 ...

  7. hdu 3974 Assign the task (线段树+树的遍历)

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

  8. hdu 3974 Assign the task(dfs序上线段树)

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

  9. HDU 3974 Assign the task(dfs建树+线段树)

    题目大意:公司里有一些员工及对应的上级,给出一些员工的关系,分配给某员工任务后,其和其所有下属都会进行这项任务.输入T表示分配新的任务, 输入C表示查询某员工的任务.本题的难度在于建树,一开始百思不得 ...

随机推荐

  1. LeetCode算法题-Power of Four(Java实现-六种解法)

    这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...

  2. Ubuntu 12.04上安装MySQL并运行

    Ubuntu 12.04上安装MySQL并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 安装MySQL数据库 sudo apt-get upda ...

  3. TIPS FOR IMPROVING PERFORMANCE OF KAFKA PRODUCER

    When we are talking about performance of Kafka Producer, we are really talking about two different t ...

  4. javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换.

    javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换. 时间 2015-11-07 22:18:39  HideHai's blog 原文  http://www.hideh ...

  5. cf 20190307 Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)

    B. Mike and Children time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  6. SQLite 线程安全和并发

    SQLite 与线程 SQLite 是线程安全的. 线程模型 SQLite 支持如下三种线程模型 单线程模型 这种模型下,所有互斥锁都被禁用,同一时间只能由一个线程访问. 多线程模型 这种模型下,一个 ...

  7. UVA1374-Power Calculus(迭代加深搜索)

    Problem UVA1374-Power Calculus Accept:323  Submit:2083 Time Limit: 3000 mSec  Problem Description  I ...

  8. [python] 解决pip install download速度过慢问题 更换豆瓣源

    """ python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini=& ...

  9. 已使用.netframework,version=v4.6.1 而不是目标框架netcoreapp,version=v2.1 还原包,此包可能与项目不完全兼容

    已使用.netframework,version=v4.6.1 而不是目标框架netcoreapp,version=v2.1 还原包,此包可能与项目不完全兼容 NU1202: 包 System.Run ...

  10. jenkins忘记管理员密码之解决方案

    jenkins忘记管理员密码怎么办? 通常有这么几种解决方案,如下所示: (1)进入对应的用户目录文件夹,以ubuntu16.04为例,jenkins安装目录为/var/lib/jenkins进入到该 ...