题意:

  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. android -------- GifView 显示gif图片

    最近的项目需要在界面显示Gif动图,查找网络资料,总结了一下,分享一下, 一个GifView的gif图加载库以有效地显示GIF, 您可以启动,暂停和停止gifView 在app 的 build.gra ...

  2. Windows环境下最新OpenCV和Contribute代码的联合编译【20190505更新红字】

    解决这个问题,目的在于获得并使用最新的完全版本的代码,主要方法是对CMake能够熟练使用,并且对编译等基础支持有所了解. 因为这篇博客经过多次修改,所以里面的内容和配图可能有不是完全比对的地方,但是只 ...

  3. 将移远通信的EC20驱动移植到NUC972上(转)

    源: 将移远通信的EC20驱动移植到NUC972上

  4. 惠普打印机和扫描仪修复医生 HP Print and Scan Doctor

    https://support.hp.com/cn-zh/topic/printscandoctor-printing-problems http://ftp.hp.com/pub/printers/ ...

  5. flutter中的网络请求和下拉刷新上拉加载,toast的案例

    添加依赖 pull_to_refresh: ^1.5.6 dio: ^2.1.0 fluttertoast: ^3.0.1 DioUtil import 'package:dio/dio.dart'; ...

  6. angular ts处理日期格式

    引入DatePipe import {DatePipe} from '@angular/common'; 添加provider @Component({ providers: [DatePipe] } ...

  7. openresty开发系列14--lua基础语法3函数

    openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...

  8. svn服务端搭建

    本文介绍的是SVN的服务器端的搭建. 一.SVN服务器安装 1.     首先来下载和搭建SVN服务器,下载地址如下: http://subversion.apache.org/packages.ht ...

  9. 虚拟机的Vmtools

    安装了虚拟机之后,文件共享不方便,安装VMTools可以在windows上直接拖文件到linux上. 安装方法: 1.进入linux把CD弹出 2.打开虚拟机之后 3.下载完成可以在linux的CD设 ...

  10. 【物联网】esp8266

    esp8266环境配置 https://www.jianshu.com/p/cb0274d612b5 https://www.cnblogs.com/zleiblogs/p/7126106.html ...