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. MacOS远程Windows提示:远程桌面连接无法验证您希望连接的计算机的身份

    解决方法: 1.在Windows端,运行输入 “gpedit.msc”,打开本地组策略编辑器 2.依次打开[计算机配置]→[管理模板]→[windows组件]→[远程桌面服务]→[远程桌面会话主机]→ ...

  2. 实现Github和Coding仓库等Git服务托管更新

    如何使Github.Coding.Gitee 码云 同时发布更新,多个不同Git服务器之间同时管理部署发布提交 缘由 因为在Github上托管的静态页面访问加载速度较为缓慢,故想在Coding上再建一 ...

  3. php学习----基本介绍及数据类型

    php 官方手册:http://php.net/manual/zh/ 1.PHP(全称 Hypertext Preprocessor,超文本预处理器的字母缩写)是一种服务器端脚本语言,它可嵌入到 HT ...

  4. 2802:小游戏利用bfs来实现

    之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...

  5. C语言 大小写字母转换

    //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 方法1: #include<stdio.h> #include<stdlib.h> ...

  6. CORS(跨域资源共享)详解及与JSONP的对比

    上篇讲解的JSONP的跨域请求方式,但是在浏览器的支持及请求方式上有局限性,接下来将介绍一种新的跨域请求方式CORS. CORS是一个W3C标准,全称是"跨域资源共享"(Cross ...

  7. 【Teradata System】How Teradata uses MPP Systems

    内存分配 内存初始化时将分配给操作系统和Vprocs,内存不使用部分的90%做为FSG (File Segment Cache) ,由PDE对FSG进行管理. FSG Cache:缓存常驻内存的dat ...

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

  9. D - Counting Test Gym - 101532D 字符串

    Yousef has a string s that is used to build a magical string w by repeating the string s infinitely ...

  10. Linux 与 Unix 到底有什么不同?区别在哪?

    Linux 与 Unix 到底有什么不同?区别在哪? 如果你是一名20多岁或30多岁的软件开发人员,那么你已成长在一个由Linux主导的世界中.数十年来,它一直是数据中心的重要参与者,尽管很难找到明确 ...