hdu 3974 dfs时间戳+线段树
题意:
- 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。
- 有若干操作,分配给员工任务以及查询该员工正在执行的任务。
题解:
典型的更新字树的操作,用时间戳来区分子树,然后用线段树做区间的修改和查询。简单介绍一下时间戳(按照dfs的顺寻把一个点第一次遍历的时间点 以及最后一次也就是第二次遍历到的时间点保存下来 具体看下图 会发现一个点的第一次和第二次的时间包含了同样标记的子节点第一次遍历的时间)
序列话之后,用线段树维护查询就好咯,注意一下建树的时候,大小别搞错了,,
上代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <map>
#include <cstring>
#include <vector>
#define maxn 50010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
vector<int > edge[maxn];
int n,ret;
int in[maxn*2],out[maxn*2]; // 这里的范围要注意一下
int lazy[maxn*4],val[maxn*4];
int vis[maxn];
void init()
{
ret=0;
for(int i=0;i<=n;i++)
{
edge[i].clear();
vis[i]=0;
}
}
void dfs(int x,int fa)
{
in[x]=++ret;
int len=edge[x].size();
for(int i=0;i<len;i++)
{
if(edge[x][i]!=fa)
{
dfs(edge[x][i],x);
}
}
out[x]=ret;
}
void build(int l,int r,int rt)
{
lazy[rt]=-1;
val[rt]=-1;
if(l==r) return;
int m=(l+r)/2;
build(lson);
build(rson);
}
void pushdown(int rt)
{
if(lazy[rt]!=-1)
{
val[rt<<1]=lazy[rt];
val[rt<<1|1]=lazy[rt];
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void update(int L,int R,int key,int l,int r,int rt)
{
if(L<=l && r<=R)
{
lazy[rt]=val[rt]=key;
return;
}
pushdown(rt);
int m=(l+r)/2;
if(L<=m) update(L,R,key,lson);
if(R>m) update(L,R,key,rson);
}
void query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
cout<<val[rt]<<endl;
return;
}
pushdown(rt);
int m=(l+r)/2;
if(L<=m) query(L,R,lson);
if(R>m) query(L,R,rson);
}
int main()
{
int t,Case=0;
cin>>t;
while(t--)
{
cin>>n;
init();
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
vis[x]=1;
// edge[x].push_back(y);
edge[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
dfs(i,i);
break;
}
}
build(1,ret,1);// 对dfs序建树 printf("Case #%d:\n",++Case);
int q;
cin>>q;
while(q--)
{
char op[100];
cin>>op;
if(op[0]=='C')
{
int x;
scanf("%d",&x);
query(in[x],in[x],1,ret,1);
}
else
{
int x,y;
scanf("%d %d",&x,&y);
update(in[x],out[x],y,1,ret,1);
}
}
}
return 0;
}
hdu 3974 dfs时间戳+线段树的更多相关文章
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- hdu 5692 Snacks(dfs时间戳+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU3974 Assign the task —— dfs时间戳 + 线段树
题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...
- HDU 5877 [dfs序][线段树][序]
/* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 3974 Assign the task(dfs时间戳+线段树成段更新)
题意:给定点的上下级关系,规定假设给i分配任务a.那么他的全部下属.都停下手上的工作,開始做a. 操作 T x y 分配x任务y,C x询问x的当前任务: Sample Input 1 5 4 3 3 ...
- HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
随机推荐
- keepalived非争抢机制不生效【原创】
故障现象:俩台服务器设置了keepalived非争抢机制,但是发现优先级高的服务器还是会优先获取vip 利用tcpdump抓包发现只有其中一台服务器,没有另一台 tcpdump -i eth0 vrr ...
- MiniUI表单验证实践
学习实践: <form id="form2"> <div id="update_pas" style="width:380px&qu ...
- [Eclipse]已经写好的代码怎样切换为unix下的换行符?
问题:使用eclise提交文件到github,每行文件后面都有^M字符 切换换行符的显示格式, 但是这样只能对新文件起作用,修改旧文件:
- typeScript中的数据类型
/* typeScript中的数据类型 typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,在typescript中主要给我们提供了以下数据类型 布尔类型(boolean) 数 ...
- logrotate机制&原理
logrotate机制&原理 centos系统中默认安装logrotate,logrotate主配置文件:/etc/logrotate.conf,其中定义了系统默认的logrotate规则,当 ...
- openresty开发系列17--lua中的正则表达式
与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要40 ...
- Qt编写气体安全管理系统15-网络转发
一.前言 在本系统中网络转发是个什么功能含义呢,其实就是将本地采集设备的所有数据打包发送到指定的网络地址,默认采用UDP的形式,无连接开销小,我也是看到很多的组态软件有这个功能,其实现有的很多的气体探 ...
- 获取Django model中字段名,字段的verbose_name,字段类型
如下app:ywreport下存在model:Game: class Game(models.Model): name = models.CharField(u'游戏名称',max_length=30 ...
- top显示命令详解+top命令使用
http://blog.csdn.net/u014226549/article/details/22041289
- Selenium(二十):expected_conditions判断页面元素
1. 判断元素(expected_conditons) 作为一个刚刚转到python开发的小朋友,在开发前只将前辈们封装的方法看了一遍,学了一边selenium基础.看到封装的方法有什么判断元素是否存 ...