HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树)。当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工作),题目会询问你其中某个人正在做的工作。
解题思路:其实从“一个人分配他的下属做一样的工作”这里就可以看出来了,这相当于让一块区间的人都做一样的事,就是线段树区间染色问题。但不能使用线段树,要先将多叉树铺展开,将节点映射到线段上。把每个人的管理区段找出来(把属于同一个人管的放一起,上司放在前面),这样对某个员工更新也就是对他和他下属的更新。具体实现就是先将多叉树保存下来,用dfs遍历多叉树给每个人打上时间戳,分配序号就行了。
#include<iostream>
#include<cstring>
#include<vector>
#define LC(a) ((a<<1))
#define RC(a) ((a<<1)+1)
#define MID(a,b) ((a+b)>>1)
using namespace std;
const int N=5e4+;
typedef long long ll; vector<ll>v[N];
ll Start[N],End[N];//每个员工所有下属的开始和结束节点,包含本身
ll ans,cnt;//cnt用于记录节点的编号
bool used[N]; void dfs(ll rt){
Start[rt]=++cnt;
for(int i=;i<v[rt].size();i++){
dfs(v[rt][i]);
}
End[rt]=cnt;
} struct node{
ll l,r;
ll task;//task=-2表示下属工作不同
}tree[N*]; void pushup(ll p){
tree[p].task=(tree[LC(p)].task==tree[RC(p)].task?tree[LC(p)].task:-);
} void pushdown(ll p){
tree[LC(p)].task=tree[RC(p)].task=tree[p].task;
} void build(ll p,ll l,ll r){
tree[p].l=l;
tree[p].r=r;
tree[p].task=-;
if(l==r){
return;
}
build(LC(p),l,MID(l,r));
build(RC(p),MID(l,r)+,r);
} void update(ll p,ll l,ll r,ll task){
if(r<tree[p].l||l>tree[p].r)
return;
if(l<=tree[p].l&&r>=tree[p].r){
tree[p].task=task;
return;
}
if(tree[p].task!=-)
pushdown(p);
update(LC(p),l,r,task);
update(RC(p),l,r,task);
pushup(p);
} void query(ll p,ll t){
if(tree[p].task!=-){
ans=tree[p].task;
return;
}
ll mid=MID(tree[p].l,tree[p].r);
if(t<=mid)
query(LC(p),t);
else
query(RC(p),t);
} int main(){
ios::sync_with_stdio(false);
ll t;
ll cas=;
cin>>t;
while(t--){
cas++;
//初始化
cnt=;
memset(used,false,sizeof(used));
for(int i=;i<=N;i++){
v[i].clear();
} ll n;
cin>>n;
for(int i=;i<=n-;i++){
ll rt,chd;
cin>>chd>>rt;
used[chd]=true;
v[rt].push_back(chd);
}
//将多叉树转化为线段
for(int i=;i<=n;i++){
//找到根结点
if(!used[i]){
dfs(i);
break;
}
}
//建树
build(,,n);
ll m;
cout<<"Case #"<<cas<<":"<<endl;
cin>>m;
for(int i=;i<=m;i++){
char op;
cin>>op;
if(op=='C'){
ll x,t;
cin>>x;
t=Start[x];
query(,t);
cout<<ans<<endl;
}
else{
ll x,l,r,task;
cin>>x>>task;
l=Start[x];
r=End[x];
update(,l,r,task);
}
}
}
}
HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)的更多相关文章
- hdu 5023(线段树区间染色,统计区间内颜色个数)
题目描述:区间染色问题,统计给定区间内有多少种颜色? 线段树模板的核心是对标记的处理 可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点 Lazy操作减少修改的次数( ...
- 线段树区间染色 ZOJ 1610
Count the Colors ZOJ - 1610 传送门 线段树区间染色求染色的片段数 #include <cstdio> #include <iostream> #in ...
- HDU-3974 Assign the task(多叉树DFS时间戳建线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=3974 Time Limit: 15000/5000 MS (Java/Others) Memory Lim ...
- hdu3974 Assign the task dfs序+线段树
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- HDU3974 Assign the task
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- POJ 1436 (线段树 区间染色) Horizontally Visible Segments
这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...
- ZOJ1610 Count the Colors —— 线段树 区间染色
题目链接:https://vjudge.net/problem/ZOJ-1610 Painting some colored segments on a line, some previously p ...
- hdu3974 Assign the task【线段树】
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
随机推荐
- Linux内核分析第五周——扒开系统调用的“三层皮”(下)
Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...
- ueditor上传图片配置
1 去ueditor文件夹下 找 ueidtors/dialogs/image/image.html -- 配置位置大概如下: 107 utils.domReady(function(){ 108 ...
- jar包下载地址(fasterxml.jackson)
jar包下载地址(fasterxml.jackson) Home » com.fasterxml.jackson » core jar包下载地址 https://mvnrepository.com/a ...
- poj3783 Balls
Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1110 Accepted: 721 Description ...
- Android MediaRecorder解析
源码路径:frameworks/base/media/java/android/media/MediaRecorder.javaframeworks/base/media/jni/android_me ...
- Codeforces Round #546 (Div. 2) ABCDE 题解
1136A: 题意:一本书有n个章节,每个章节的分别在li到ri页,小明读完书后将书折在第k页,问还有多少章节没有读 题解:控制k在li~ri的范围内后输出n-i即可 #include <set ...
- FreeRTOSv9.0.0在STM32F103RCT6上的移植
1.去官网下载源代码(FreeRTOSv9.0.0.exe) 2.取出Source文件夹,根据单片机和编译器不同,删除不需要的文件,如下图 3.在CORTEX_STM32F103_IAR文件夹中取出P ...
- tf.train.batch的偶尔乱序问题
tf.train.batch的偶尔乱序问题 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.train.batch的偶尔乱序问题 我们在通过tf.Reader读取文件后,都需要用batc ...
- python---twisted的使用,使用其模拟Scrapy
twisted的网络使用 twisted的异步使用 一:简单使用 from twisted.internet import defer from twisted.web.client import g ...
- Spring Boot 使用IntelliJ IDEA创建一个web开发实例(三)
属性配置 1.配置application.properties文件 配置web访问端口和context path server.port = 8081 server.servlet.context-p ...