hdu 3974 线段树 将树弄到区间上
Assign the task
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1647 Accepted Submission(s): 753
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
/*
hdu 3974 线段树 将树弄到区间上 题意: 给定一棵树,50000个节点,50000个操作
C x表示查询x节点的值,
T x y表示更新x节点及其子节点的值为y 没想到的是普通并查集都能过,数据是由多水 - - 由于T操作每次更新当前节点以及它的子树,所有dfs一次,给每个节点进行编号。 每次更新
就成了对当前节点所覆盖区间的更新。 hhh-2016-04-22 14:09:04
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 50010; struct node
{
int l,r;
int val;
int lazy;
int mid() {return (l+r) >> 1;}
}tree[maxn<<2]; int tot,cnt;
int rt[maxn];
int st[maxn],ed[maxn];
vector <int > vec[maxn];
void dfs(int cur)
{
st[cur] = ++cnt;
for(int i = 0;i < vec[cur].size();i++)
{
dfs(vec[cur][i]);
}
ed[cur] = cnt;
} void build(int i,int l,int r)
{
tree[i].l = l,tree[i].r = r;
tree[i].val = -1,tree[i].lazy = 0;
if(l == r)
return ;
int mid = tree[i].mid();
build(lson,l,mid);
build(rson,mid+1,r);
} void push_down(int i)
{
if(tree[i].lazy)
{
tree[lson].val = tree[i].val,tree[lson].lazy = 1;
tree[rson].val = tree[i].val,tree[rson].lazy = 1;
tree[i].lazy = 0;
}
} void update(int i,int l,int r,int val)
{
if(tree[i].l >= l && tree[i].r <= r)
{
tree[i].val = val;
tree[i].lazy = 1;
return ;
}
push_down(i);
int mid = tree[i].mid();
if(l <= mid)
update(lson,l,r,val);
if(r > mid)
update(rson,l,r,val);
// if(r <= mid)
// update(lson,l,r,val);
// else if(l > mid)
// update(rson,l,r,val);
// else
// {
// update(lson,l,mid,val);
// update(rson,mid+1,r,val);
// }
return ;
} int query(int i,int k)
{
if(tree[i].l == k && tree[i].r == k)
return tree[i].val;
int mid = tree[i].mid();
push_down(i);
if(k <= mid)
return query(lson,k);
else
return query(rson,k);
} int main()
{
int T,n,m,x,y;
int cas = 1;
scanf("%d",&T);
while(T--)
{
cnt = 0;
scanf("%d",&n);
printf("Case #%d:\n",cas++);
for(int i = 1;i <= n;i++)
{
vec[i].clear();
}
memset(rt,0,sizeof(rt));
int u,v;
for(int i = 1;i < n;i++)
{
scanf("%d%d",&u,&v);
vec[v].push_back(u);
rt[u] = 1;
}
int rot;
for(int i = 1;i <= n;i++)
{
if(!rt[i])
{
rot = i;
break;
}
}
dfs(rot);
build(1,1,cnt);
char op[10];
scanf("%d",&m);
for(int i = 1;i <= m;i++)
{
scanf("%s",op);
if(op[0] == 'C')
{
scanf("%d",&x);
printf("%d\n",query(1,st[x]));
}
else if(op[0] == 'T')
{
scanf("%d%d",&x,&y);
update(1,st[x],ed[x],y);
}
}
}
return 0;
}
hdu 3974 线段树 将树弄到区间上的更多相关文章
- HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)
题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输 ...
- HDU - 3974 Assign the task (线段树区间修改+构建模型)
https://cn.vjudge.net/problem/HDU-3974 题意 有一棵树,给一个结点分配任务时,其子树的所有结点都能接受到此任务.有两个操作,C x表示查询x结点此时任务编号,T ...
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- hdu 4747 线段树
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树
HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- iOS中滤镜种类及相关介绍
- 2017 清北济南考前刷题Day 3 morning
实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...
- 一、Django的基本用法
学习Django有一段时间了,整理一下,充当笔记. MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 ...
- C# reportview 按时间改变行颜色
//) AND ((Day(Now()) - Day() AND (Day(Now()) - Day()),) AND (Day(Now()) - Day()) OR (Month(Now()) - ...
- SpringCloud的应用发布(二)vmvare+linux,Centos7.0下发布应用
一.运行环境 1.jdk下载安装 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 检查是否有老版本jdk 如 ...
- eclipse版本对应的jdk版本
Installing Eclipse is relatively easy, but does involve a few steps and software from at least two d ...
- python实现:最长子字符串
给定一个字符串 s 和正整数 n,请使用你熟悉的编程语言输出 s 中包含不超过 n 种字符的最长子串,如 s="uabbcadbaef",n=4 时应该输出 "abbca ...
- margin-top塌陷
margin-top 塌陷 在两个不浮动的盒子嵌套时候,内部的盒子设置的margin-top会加到外边的盒子上,导致内部的盒子margin-top设置失败,解决方法如下: 1.外部盒子设置一个边框: ...
- RxJava系列6(从微观角度解读RxJava源码)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log from class org.apache.poi.openxml4j.opc.ZipPackage
代码说简单也简单,说复杂那还真是寸步难行. 之前好好的excel导出功能,本地启动调试的时候突然就不行了,一直报上面的错. 一直在本地折腾了半天,去测试环境上看,又是好的,可以正常导出excel. 搜 ...