hdu3974-Assign the task-(dfs+线段树)
题意:有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+线段树)的更多相关文章
- 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 ...
- HDU 3974 Assign the task (DFS+线段树)
题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...
- HDU3974 Assign the task —— dfs时间戳 + 线段树
题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...
- 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 ...
- HDU 3974 Assign the task 暴力/线段树
题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU - 3974 Assign the task (线段树区间修改+构建模型)
https://cn.vjudge.net/problem/HDU-3974 题意 有一棵树,给一个结点分配任务时,其子树的所有结点都能接受到此任务.有两个操作,C x表示查询x结点此时任务编号,T ...
- hdu 3974 Assign the task(线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意:给定一棵树,50000个节点,50000个操作,C x表示查询x节点的值,T x y表示更 ...
- hdu 3974 Assign the task (线段树+树的遍历)
Description There is a company that has N employees(numbered from 1 to N),every employee in the comp ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线
Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...
随机推荐
- 【转帖】netstat命令总结
netstat命令总结 https://www.cnblogs.com/chenqionghe/p/10654109.html nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的 ...
- only size-1 arrays can be converted to Python scalars
python版本:3.6.5 opencv版本:3.2.0 使用的jupyter notebook 源码如下: import cv2 import numpy as np import matplot ...
- windows中Crontab的使用
一.jdk的安装 安装地址ttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二 . ...
- Apache配置WebSocket代理
引入mod_proxy_wstunnel.so模块,使其可以解析ws.wss协议 LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel ...
- tomcat重启session不失效问题
本地写代码每次重启都要重新登录浪费了很多时间,如何重启不用重新登录呢,只要让tomcat在关闭时将session写入文件中,在启动时从文件中读取session即可. 只需在conf/context.x ...
- 修改docker容器参数
创建容器时没有添加参数 --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动. docker container update --restart=alway ...
- WebStorm eslint插件报错解决 - TypeError: this.CliEngine is not a constructor
将eslint更新版本后,出现TypeError: this.CliEngine is not a constructor的错误. 解决办法: 1.编辑 X:\WebStorm\plugins\Jav ...
- 从 Vue 的视角学 React(三)—— 事件处理
如果要处理某个元素的 click 事件,原生 js 可以直接为该元素添加一个 onclick 函数 Vue 封装了 v-on 指令,可以简化为 @click 并添加相应的函数 React 的开发思想是 ...
- setsockopt()函数使用
closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket BOOL bReuseaddr=TRUE; setsockopt (s,SOL_SOCKET ,SO ...
- spec开发思路以及理解
一.spec说明 描述:编写SEPC采用创联公司自主开发的CIT语言,它是一种过程化的.类似数据库编码的语言.SPEC中除了关键字外提倡使用中文. 理解:可以理解为业务逻辑层.链接前台页面和后台数据库 ...