HDU 3947 Assign the task
http://acm.hdu.edu.cn/showproblem.php?pid=3974
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)
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 <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的更多相关文章
- 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 3874 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
Assign the task Problem Description There is a company that has N employees(numbered from 1 to N),ev ...
- 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 (线段树+树的遍历)
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 ...
- HDU 3974 Assign the task(dfs建树+线段树)
题目大意:公司里有一些员工及对应的上级,给出一些员工的关系,分配给某员工任务后,其和其所有下属都会进行这项任务.输入T表示分配新的任务, 输入C表示查询某员工的任务.本题的难度在于建树,一开始百思不得 ...
随机推荐
- LeetCode算法题-Symmetric Tree(Java实现)
这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...
- February 15th, 2018 Week 7th Thursday
Every orientation presupposes a disorientation. 迷失过方向,才能找到方向. Not until we are lost do we begin to u ...
- KFCM算法的matlab程序
KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...
- CISCO ACL配置
ACL:access(访问)control(控制)list(列表),用来实现防火墙规则. 访问控制列表的原理对路由器接口来说有两个方向出:已经经路由器的处理,正离开路由器接口的数据包入:已经到达路由器 ...
- C语言入坑指南-被遗忘的初始化
前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...
- Spring的AOP基于AspectJ的注解方式开发2
参考自黑马培训机构 上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类 接下来介绍aop的注解的通知类型,和切入 ...
- 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 ...
- vue调试工具的安装
开发避免不了的就是调试工具,因为vue是进行数据驱动的,单从chrome里面进行element查看,查不到什么鸟东西,必须要进行对数据动向进行关查 首先是下载这个工具,github下载地址:https ...
- centos7下kubernetes(9。kubernetes中用label控制pod得位置)
Kubernetes通过label实现将pod运行在指定得node上. 默认配置下,Schesuler将pod调度到所有可用得node,有时候我们希望将pod部署到指定得node,比如将有大量磁盘I/ ...
- centos7下kubernetes(1。kubernetes---start)
kubernetes官网:https://kubernetes.io/docs/home/ 也是怀着不情愿的心情,要开始kubernetes了,本身是非常热爱技术,尤其是容器技术,可能是最近有点累和懈 ...