Assign the task HDU - 3974 (dfs序 + 线段树)
Input第一行包含单个正整数T(T<=10),表示测试用例的数量。对于每个测试用例:第一行包含一个整数N(N≤50,000),它是雇员的数目。下面的N-1行分别包含两个整数u和v,这意味着雇员v是雇员u的直接老板(1<=u,v<=N)。下一行包含一个整数M(M≤50,000)。下面的M行分别包含一条消息,“Cx”表示对员工x的当前任务的查询,“Tx y”表示公司将任务y分配给员工x。(1<=x<=N,0<=y<=10^9)Output对于每个测试用例,在第一行打印测试用例编号(以1开头),然后为每个查询输出相应的答案。Sample Input
1
5
4 3
3 2
1 3
5 2
5
C 3
T 2 1
C 3
T 3 2
C 3
Sample Output
Case #1:
-1
1
2 分析:用dfs遍历多叉树,按遍历顺序给每个人编号并保存子树的区间,然后直接套线段树的模板,进行区间的更新(子树的区间是连续的); 代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = * 1e4 + ;
struct bo
{
int l, r;
int task;
}t[maxn << ]; int n;
int clockk;
bool vis[maxn];
vector<int> bos[maxn];
int l[maxn], r[maxn]; void pushdown(int tar)
{
if (t[tar].task != -)
{
t[tar << ].task = t[tar << | ].task = t[tar].task;
t[tar].task = -;
}
} void build(int l, int r, int tar)
{
t[tar].l = l, t[tar].r = r, t[tar].task = -;
if (l == r) return;
int mid = (l + r) >> ;
build(l, mid, tar << );
build(mid + , r, tar << | );
}
void dfs(int x)
{
l[x] = ++clockk;
for (int i = ; i < bos[x].size(); i++)
dfs(bos[x][i]);
r[x] = clockk;
} void update(int l, int r, int work, int tar)
{
if (t[tar].l == l && t[tar].r == r)
{
t[tar].task = work;
return;
}
pushdown(tar);
int mid = (t[tar].l + t[tar].r) >> ;
if (r <= mid) update(l, r, work, tar << );
else if (l > mid) update(l, r, work, tar << | );
else update(l, mid, work, tar << ), update(mid + , r, work, tar << | );
} int query(int x, int tar)
{
if (t[tar].l == t[tar].r) return t[tar].task;
pushdown(tar);
int mid = (t[tar].l + t[tar].r) >> ;
if (x <= mid) return query(x, tar << );
else return query(x, tar << | );
} int main()
{
int T; cin >> T;
int boss, emp;
char ope[];
int cases = ; while (T--)
{
cin >> n;
clockk = ;
memset(vis, , sizeof(vis));
for (int i = ; i <= n; i++)
bos[i].clear();
build(, n, );
for (int i = ; i < n; i++)
{
scanf("%d%d", &emp, &boss);
vis[emp] = true;
bos[boss].push_back(emp);
}
for (int i = ; i <= n; i++)
if (!vis[i])
dfs(i);
int m, x, y; cin >> m;
printf("Case #%d:\n", ++cases);
while (m--)
{
cin >> ope;
if (ope[] == 'C')
{
scanf("%d", &x);
cout << query(l[x], ) << endl;
}
else
{
scanf("%d%d", &x, &y);
update(l[x], r[x], y, );
}
}
}
}
Assign the task HDU - 3974 (dfs序 + 线段树)的更多相关文章
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 5877 [dfs序][线段树][序]
/* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...
- hdu 3974 dfs时间戳+线段树
题意: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务. 有若干操作,分配给员工任务以及查询该员工正在执行的任务. 题解: 典型的更新字树的操 ...
- HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- Codeforces Round #442 (Div. 2)A,B,C,D,E(STL,dp,贪心,bfs,dfs序+线段树)
A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- CodeForces 877E Danil and a Part-time Job(dfs序+线段树)
Danil decided to earn some money, so he had found a part-time job. The interview have went well, so ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
随机推荐
- Python爬虫入门:爬取pixiv
终于想开始爬自己想爬的网站了.于是就试着爬P站试试手. 我爬的图的目标网址是: http://www.pixiv.net/search.php?word=%E5%9B%9B%E6%9C%88%E3%8 ...
- Python3 列表的基本操作
列表索引和切片 和字符串一样,也有索引和切片,只不过切出来的内容是列表. 索引的下标从0开始. lst= ["海上钢琴师", "奥特曼", "舌尖3& ...
- 接口文档注解:@ApiOperation
@ApiOperation不是spring自带的注解是swagger里的 com.wordnik.swagger.annotations.ApiOperation; @ApiOperation和@Ap ...
- C++学习书籍推荐《Effective C++ 第三版》下载
百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...
- [Noi2002]Savage 题解
[Noi2002]Savage 时间限制: 5 Sec 内存限制: 64 MB 题目描述 输入 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci ...
- 【译】深入理解G1的GC日志(一)
本文翻译自:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2?source= ...
- vijos P1848 记数问题
自答[119ms内存456.0 KiB] #include<iostream>using namespace std;int num = 0;void judge(int n, int x ...
- Java 读写 excel 实战完全解析
本文微信公众号「AndroidTraveler」首发. 背景 时值毕业季,很多毕业生初入职场. 因此,这边也写了一些新手相关的 Android 技术点. 比如上一篇的 Android 开发你需要了解的 ...
- C#写进程守护程序
最近写了好多次进程守护程序,今天在这里总结一下. 用到的知识点: 1.在程序中启动进程, 2.写Windows服务, 3.以及在Windows服务中启动带界面的程序 关于第三点的问题,我在我的上一篇博 ...
- python检测是否是质数
python检测是否是质数 编写python脚本,使得实现以下功能: 输入一个整数,通过脚本判断出输入的这个数是否是质数,然后输出是否是质数. 脚本如下图所示: Num = input("P ...