题意:有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 ;
}

最新文章

  1. Android带加减的edittext
  2. 【转】Flex 布局语法教程
  3. myeclipse中的文件内容被覆盖如何恢复
  4. 【ZOJ 3870】 Team Formation
  5. 《Ant权威指南》笔记(一)
  6. libevent入门教程
  7. 关于iOS中SQLITE句柄的使用的细节
  8. xcode编译运行报错纪录(持续更新)
  9. C链表之创建简单静态链表
  10. Java图形化界面设计——布局管理器之null布局(空布局)
  11. JavaSE学习总结第04天_Java基础语法3
  12. 小白学Docker之Compose
  13. [HNOI2002]跳蚤
  14. Python入门之装饰器九步学习入门
  15. 点击&lt;a&gt;页面跳转解决办法/跨域请求,JSONP
  16. 矢量图形(vector graphics)和位图图像(bitmap)以及分辨率概念
  17. odoo11 安装python ldap
  18. 原创科幻短篇《VR》
  19. VUE2 第六天学习--- vue单文件项目构建
  20. [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践

热门文章

  1. unity延迟加载图片
  2. CentOS7使用tar.gz包安装MySql的踩坑之旅
  3. LeetCode dp专题
  4. IIS 10 PHP 运行环境
  5. 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM 到底有什么区别呢?
  6. SQL系列(三)—— 注释(comment)
  7. angular创建一个独立弹窗服务
  8. node.js中的fs.rename()方法
  9. YUV视频格式详解(翻译自微软文档)
  10. Java集合学习(6):LinkedHashSet