题意:

  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. Java_jdbc 基础笔记之五 数据库连接 (ResultSet)

    /** * ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果. * 1. 调用 Statement 对象的 executeQuery(sql)可以得到结果集. * 2. Resul ...

  2. Linux系列 | Ubuntu 各版本号和名称对照【转】

    转载处:https://blog.csdn.net/songfulu/article/details/85310273   版本 开发代号 中译 发布日期 支持结束时间 内核版本 桌面版 服务器版 4 ...

  3. C++提示没有与这些操作数匹配的<<运算符

    应该是忘了#include.#include<string>

  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_41、SpringBoot定时任务schedule讲解

    笔记 1.SpringBoot定时任务schedule讲解     简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类            ...

  5. 免费好用的SSH手机客户端

    简单说一些,SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定,SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专 ...

  6. nginx多层反向代理获取客户端真实ip

    访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序 经 ...

  7. 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)

    github地址: Arthas English version goes here. Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Art ...

  8. error C1002: 在第 2 遍中编译器的堆空间不足

    error C1002: 在第 2 遍中编译器的堆空间不足 fatal error C1083: Not enough space 打开VS2015 x64 x86 兼容工具命令提示符,在此命令行中再 ...

  9. 阿里云服务器Svn-Server无法连接

    总结:关于阿里云服务器Svn-Server无法连接,Svn-Server的配置问题 2018年07月09日 11:51:08 周同学的博客 阅读数:355   最近在使用阿里云服务器时,SQL SER ...

  10. 算法习题---5-4交换学生(UVa10763)

    一:题目 有一组学生,他们手中分别有自己学校和想要去的目标学校(A,B).为了成功的交换学生,必须保证这一组学生中必须每两个人之间满足 s1 (A,B) 和 s2 (B,A).即两者原来和目标学校相对 ...