题意:有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. golang gin框架设置静态目录

    router := gin.Default() 第一个参数是api 第二个静态问价的文件夹相对目录 router.StaticFS("/data", http.Dir(" ...

  2. word 转 pfd

    转自: https://www.cnblogs.com/qiwu1314/p/6101400.html demo: public class Doc2Pdf { public static boole ...

  3. nginx location指令详解

    Nginx的HTTP配置主要包括三个区块,结构如下: http { //这个是协议级别 include mime.types; default_type application/octet-strea ...

  4. SpringBoot中使用@scheduled定时执行任务需要注意的坑

    spring boot: 计划任务@ EnableScheduling和@Scheduled @Scheduled中的参数说明 @Scheduled(fixedRate=2000):上一次开始执行时间 ...

  5. 使用PS打开图片的常见姿势

    我们经常会使用PS对现有的图片进行编辑.所以每个人都会经历打开图片这一步骤. 下面为大家介绍一下PS打开图片的这一步的常见方式吧: 第一种:使用文件资源管理器(也就是双击我的电脑弹出来的窗口) 第二种 ...

  6. .net list转树状结构

    主要的方法 /// <summary> /// 转化成树结构 /// </summary> /// <param name="menuList"> ...

  7. C#使用表达式树动态调用方法并实现99乘法表

    我们在使用C#编程的时候,经常使用反射来动态调用方法,但有时候需要动态的生成方法,下面介绍使用表达式树的方式来自动生成方法,并调用. 首先需要说明什么是表达式,熟悉Linq的程序猿都用过类似于下面的代 ...

  8. Oracle分页查询和SQL server分页查询总结

    分页查询是项目中必不可少的一部分,难倒是不难,就是这些东西,长时间不用,就忘的一干二净了.今天特此总结一下这两款数据库分页查询的实现过程(只记录效率比较高的) 一.Oracle中的分页查询 1.通用分 ...

  9. ssh in depth

    前两天写了一篇关于ssh的相对比较入门的文章,重点介绍了ssh在免密登录场景下的应用. 本文试图对ssh更高级的话题做一下探讨,重点探讨一下ssh tunneling https://www.ssh. ...

  10. 详细的Hadoop的入门教程-伪分布模式Pseudo-Distributed Operation

    一. 伪分布模式Pseudo-Distributed Operation 这里关于VM虚拟机的安装就不再介绍了,详细请看<VMware虚拟机的三种网络管理模式>一章介绍.这章只介绍hado ...