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 ...
随机推荐
- Archlinux无线联网教程
本人是学生党,故对于有线方式不甚了解,学校里一般使用mentohust用动态IP方式联网,或者直接连接wifi,这里介绍无线联网的一些方式,主要包括公共wifi和带有WEP或者WPA或者WPA2PSK ...
- scrapy csvfeed spider
class CsvspiderSpider(CSVFeedSpider): name = 'csvspider' allowed_domains = ['iqianyue.com'] start_ur ...
- 多种在线地图综合对比,Google,必应,arcgis Online...
不同网络地图的对比 天地图 坐标系:WGS84 地图配色: POI数量:丰富 有无建筑:有 地图特点:天地图按照国家标准进行配图,道路.水系.植被等图层用对应颜色渲染, POI信息丰富, ...
- HTML,文字两端对齐
text-align: justify样式的意思是文字两端对齐,但是有时候你会发现这东西不起左右,比如在div标签中的文字. 解决方法:在div中放一个空的span标签,并使用下面的样式. .just ...
- Spark快速入门
Spark 快速入门 本教程快速介绍了Spark的使用. 首先我们介绍了通过Spark 交互式shell调用API( Python或者scala代码),然后演示如何使用Java, Scala或者P ...
- 日推20单词 Day01
1.conflict n. 冲突 2.electronic adj. 电子的 3.mine n. 矿藏,地雷 4.mineral n. 矿物质 adj. 矿物的 5.undermine vt 破坏,渐 ...
- 测试驱动开发实践4————testSave之新增文档分类
[内容指引] 1.确定"新增文档分类"的流程及所需的参数 2.根据业务规则设计测试用例 3.为测试用例赋值并驱动开发 一.确定"新增文档分类"的流程及所需的参数 ...
- SpringMVC(五):@RequestMapping下使用@RequestParam绑定请求参数值
在处理方法入参使用@RequestParam可以把请求参数传递给请求方法,@RequestParam包含的属性值: --- value :参数名称 --- required :是否必须,默认为true ...
- 原来你是这样的Promise
1. Promise简介 promise是异步编程的一种解决方案,它出现的初衷是为了解决回调地狱的问题. 打个比方,我需要: --(延迟1s)--> 输出1 --(延迟2s)--> 输出2 ...
- 【SQL.基础构建-第一节(1/4)】
-- Tips:数据库与sql-- 一.What's 数据库-- 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.-- ...