题意:有n个人,有上下级关系,有m个操作,有两种操作1.把一个任务分给某个人,他的下属也会停下手中工作和他一起做;2.查询某个人的当前任务是什么?

解题:n-1个关系,总有一个人没有上级,以他为根节点用dfs搜索整张图可以得到一棵树,按“根左右”先序遍历,根表示自己,遍历到最右边的儿子结束,这段区间为自己的管辖范围,按遍历顺序构造一棵线段树,每个人记录管辖范围,一有任务分给某人,他就分散下去,线段树区间更新。

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int T,n,v,u,cnt,m,x,y;
char s[];
vector<int>son[];///儿子可能有多个,邻接表
int dad[];///下标是儿子,内容是父亲
int l[];
int r[];///l和r两个数组之间的范围 表示 管辖的员工在线段树中的编号范围
int tree[*];
int lazy[*]; void dfs(int now)///now是当前搜到的员工的编号
{
l[now]=++cnt;
for(int i=;i<son[now].size();i++)
{
int xx=son[now][i];
dfs(xx);
}
r[now]=cnt;
} void pushdown(int rt)
{
if( lazy[rt]!=- )
{
tree[ rt* ] = tree[ rt*+ ] = lazy[ rt* ] = lazy[ rt*+ ] =lazy[rt];
lazy[rt]=-;///懒标记赋值给儿子后清空为-1
}
} void build(int l,int r,int rt)
{
if(l==r)
{
tree[rt]=-;
return;
}
int mid=(l+r)/;
build(l,mid,rt*);
build(mid+,r,rt*+);///不需要求和
} void update(int L,int R,int p,int l,int r,int rt)
{
if( L<=l && r<=R )
{
tree[rt]=lazy[rt]=p;
return;
}
int mid=(l+r)/;
pushdown(rt);
if( L<=mid )
update(L,R,p,l,mid,rt*);
if( mid+<=R )
update(L,R,p,mid+,r,rt*+);
} int query(int l,int r,int rt,int x)
{
if( l==r )
return tree[rt];
int mid=(l+r)/;
pushdown(rt);
if(x<=mid)
return query(l,mid,rt*,x);
else
return query(mid+,r,rt*+,x);
} int main()
{ scanf("%d",&T);
for(int t=;t<=T;t++)
{
memset(dad,,sizeof(dad));
memset(lazy,-,sizeof(lazy));
memset(tree,-,sizeof(tree));
for(int i=;i<=n;i++)
son[i].clear(); scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);///v是u的父亲
dad[u]=v;
son[v].push_back(u);
} for(int i=;i<=n;i++)
{
if( dad[i]== )///没有父亲,便是祖宗
{
v=i;
break;
}
}
cnt=;
dfs(v);///从祖宗开始往下搜 printf("Case #%d:\n",t);
scanf("%d",&m);
while(m--)
{
string ss;
cin>>ss;
if( ss[]=='C' )///查询a的任务
{
scanf("%d",&x);
int ans=query(,cnt,,l[x]);
printf("%d\n",ans);
}
else
{
scanf("%d%d",&x,&y);///让员工a做任务b,a会叫他的下属一起做,左右区间表示需要做的人,包括自己
update( l[x],r[x],y,,cnt, );
}
} }
return ;
}

hdu3974-Assign the task-(dfs+线段树)的更多相关文章

  1. 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 ...

  2. HDU 3974 Assign the task (DFS+线段树)

    题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...

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

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

  4. 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 ...

  5. HDU 3974 Assign the task 暴力/线段树

    题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  6. HDU - 3974 Assign the task (线段树区间修改+构建模型)

    https://cn.vjudge.net/problem/HDU-3974 题意 有一棵树,给一个结点分配任务时,其子树的所有结点都能接受到此任务.有两个操作,C x表示查询x结点此时任务编号,T ...

  7. hdu 3974 Assign the task(线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意:给定一棵树,50000个节点,50000个操作,C x表示查询x节点的值,T x y表示更 ...

  8. hdu 3974 Assign the task (线段树+树的遍历)

    Description There is a company that has N employees(numbered from 1 to N),every employee in the comp ...

  9. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  10. Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线

    Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...

随机推荐

  1. [转帖]HashMap、HashTable、ConcurrentHashMap的原理与区别

    HashMap.HashTable.ConcurrentHashMap的原理与区别 http://www.yuanrengu.com/index.php/2017-01-17.html 2017年1月 ...

  2. 使用Oracle Logminer同步Demo

    使用Oracle Logminer同步Demo 1 Demo介绍 1.1 Demo设想 前面介绍了Oracle LogMiner配置使用以及使用LogMiner进行解析日志文件性能,在这篇文章中将利用 ...

  3. Django 模板语言 变量名称

    Django 模板语言 变量名称 模板语言中已变量形式显示 # view 文件内 def func(request): return render(request,"index.html&q ...

  4. Python语言的特点及自学建议

    Python语言的特点Python语言是一种被广泛使用的高级通用脚本编程语言,具有很多区别于其他语言的特点,这里仅列出如下一些重要特点.(1)语法简洁:实现相同功能,Python语言的代码行数仅相当于 ...

  5. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  6. 史上最全HashMap红黑树解析

    HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...

  7. 详细的Hadoop的入门教程-完全分布模式Fully-Distributed Operation

    1. 前面在伪分布模式下已经创建了一台机器,为了统一命名,hostname更名为hadoop01.然后再克隆2台机器:hadoop02. hadoop03:将第一台机器hadoop01上的伪分布停止, ...

  8. Map接口---Day20

    Map接口概述: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系 ...

  9. Csharp 基础笔记知识点整理

    /* * @version: V.1.0.0.1 * @Author: fenggang * @Date: 2019-06-16 21:26:59 * @LastEditors: fenggang * ...

  10. js两个不同类型值比较Boolean(0=='')

    写js遇到的问题 本以为 Boolean(0=='') 结果为true 可是在控制台执行 Boolean(0==' ')trueBoolean(0==null)false 百度得知,两个不同类型值比较 ...