题意:有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. Python3 CGI编程实现教程

    一.背景说明 虽然很久以前就听说“早期的网站很多通过cgi形式实现”.“C++可通过CGI形式编写网页”,日积月累对CGI也有了一些概念,但一直没真正见过一个实际运行的CGI网站,总归还是有些底气不足 ...

  2. 不同路径II --动态规划

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在考虑网 ...

  3. [Atcoder AGC029C]Lexicographic constraints

    题目大意:给定$n$个字符串的长度$a_i$,问至少用几种字符可以构造出字符串$s_1\sim s_n$,满足$|s_i|=a_i$且$s_1<s_2<\cdots<s_n$. $ ...

  4. Java学习:面向对象的三大特征:封装性、继承性、多态性之继承性

    面向对象的三大特征:封装性.继承性.多态性. 继承 继承是多态的前提 ,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 继承关系当中的特点: 子类可以拥有父类的“内容” 子类还可以拥有 ...

  5. eclipse的debug模式的F5,F6按键失灵

    在使用eclipse Mars.1 Release (4.5.1)开发过程中,发现debug模式下的快捷键无法使用,全部失效了.秉持坚决自己解决绝不求人的态度我艰苦的在度娘上寻求解决办法,有的说是快捷 ...

  6. APS.NET MVC + EF (02)---ADO.NET Entity FrameWork

    2.1 Entity Framework简介 Ado.net Entity Framework 是Microsoft推出的ORM框架. 2.1.1 什么是ORM 对象关系映射(Object Relat ...

  7. Android studio 混淆配置

    混淆 studio 使用Proguard进行混淆,其是一个压缩.优化和混淆java字节码文件的一个工具. 功能:Shrinking(压缩).Optimization(优化).Obfuscattion( ...

  8. Appium中app的元素定位

    app定位方式,本文只讲Android手机的定位方式. 前提条件是adb连接到模拟器或者是手机(具体连接方式这里不再讲解),证明已连接到设备 adb devices app元素定位工具一:UI Aut ...

  9. node_exporte新版本指标名称变化说明

    changelog如下 Breaking changes This release contains major breaking changes to metric names. Many metr ...

  10. IDEA忽略编译报错

    设置Intellij IDEA忽略部分类编译错误 File——Settings——Compiler——Java compiler修改:Use complier:将Javac改为Eclipse在Ecli ...