题意:

  1. 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。
  2. 有若干操作,分配给员工任务以及查询该员工正在执行的任务。

题解:

典型的更新字树的操作,用时间戳来区分子树,然后用线段树做区间的修改和查询。简单介绍一下时间戳(按照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时间戳+线段树的更多相关文章

  1. Assign the task HDU - 3974 (dfs序 + 线段树)

    有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...

  2. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  3. hdu 5692 Snacks(dfs时间戳+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. HDU3974 Assign the task —— dfs时间戳 + 线段树

    题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...

  5. HDU 5877 [dfs序][线段树][序]

    /* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...

  6. hdu 5692(dfs序+线段树,好题)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. HDU 3974 Assign the task(dfs时间戳+线段树成段更新)

    题意:给定点的上下级关系,规定假设给i分配任务a.那么他的全部下属.都停下手上的工作,開始做a. 操作 T x y 分配x任务y,C x询问x的当前任务: Sample Input 1 5 4 3 3 ...

  8. HDU 5692 (DFS序+线段树)

    DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...

  9. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

随机推荐

  1. Tosca:键盘输入字符串

    这是方法之一

  2. C语言函数库分类

  3. SeetaFaceEngine2 实例

    LOG: Creating layer(6):LOG: Creating layer(0):LOG: Creating layer(9):LOG: Creating layer(0):LOG: Cre ...

  4. ES6深入浅出-13 Proxy 与 Reflect-3.Vue 3 将用 Proxy 改写

    如果说想打印出来年龄,但是有没有年龄的这个key值 把创建年龄写在一个按钮上面 通过一个事件来做. 点击创建年龄的按钮,给obj.age设置为18,但是页面的双向绑定并没有显示出来. 因为不响应式,为 ...

  5. php nginx window系统 gettext方式实现UTF-8国际化多语言(i18n)

    开始应用: 步骤一:搭建环境(服务器已经完成,环境已经搭建好了) 1.首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后 ...

  6. Form表单的传递与接收

    目录 表单的构建 后端接收 创建model 用Model接收表单的后端 表单的构建 我才知道这个东西,在开发中经常遇到表单的情况.一下子提交一串内容.表单元素 form,里面的内容必须有name字段. ...

  7. NDK开发和NDK双进程守护

    https://www.jianshu.com/p/433b2c93c6a7 NDK进程守护 https://blog.csdn.net/k393393/article/details/7895435 ...

  8. HTML布局水平导航条1制作

    该文是用css制作个导航条,用竖线分隔,导航条是点击的多个区块.步骤:ul里设置需要数量的li,li中加上a链接给ul加样式,去掉默认的前面的点给li设置左浮动,让ul里的li横向排列a链接设置成块状 ...

  9. spaces的坑

    spacemacs的坑,改镜像源,不能使用退格 emacs25以上可以装spacemacs 目前在mac上装emacs26.1 使用spacemacs的时候会有melpa.org访问慢或者访问不了的问 ...

  10. 解决nginx端口占用问题

    1.键入命令:netstat -ano | findstr 80 查看80端口被哪个程序占用: 2.键入命令:netsh http show servicestate 查看http服务状态(注:解决后 ...