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 ...
随机推荐
- lambda匿名函数和他的小伙伴(处理大量数据的时候用到)
lambda匿名函数 主要是为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n f = lambda n : n ** n 语法: 函数名 = ...
- Nginx运行报错unknown directive ""
使用文本编辑器把编码格式修改为UTF-8即可. 推荐文本编辑器:notepad++,自行百度搜索即可下载
- Oracle数据库---异常处理
Oracle异常处理在PL/SQL语句书写时,需要处理的异常-- 不做异常处理时DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE;BEGIN SELE ...
- 分布式事务(3)---RocketMQ实现分布式事务原理
分布式事务(3)-RocketMQ实现分布式事务原理 之前讲过有关分布式事务2PC.3PC.TCC的理论知识,博客地址: 1.分布式事务(1)---2PC和3PC原理 2.分布式事务(2)---TCC ...
- python 3.7 新特性 - popitem
百度上大多文章说 popitem 随机删除字典的一个键值对 python 3.7 官方文档已经说了,popitem 删除字典最后一个添加进去的键值对
- who are you?
不多说,直接使用脚本跑 # -*- coding:utf-8 -*- import requests import string url = "http://ctf5.shiyanbar.c ...
- vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。
1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...
- CSS(下)
1.CSS边框 边框属性: 1.border-width 宽度 2.border-style 样式 none 无边框 dotted 点状虚线边框 dashed 矩形虚线边框 solid 实线边框 3. ...
- MySQL图形工具SQLyog破解版
最近一直在用MySQL,所以分享一下现在这套开发工具. SQLyog:链接:http://pan.baidu.com/s/1bLq2OA 密码:h5bj 注册信息用户名:yunjian注册码:81f4 ...
- 一文搞懂List 、List<Object>、List<?>的区别以及<? extends T>与<? super T>的区别
前段时间看<Java编程思想>泛型时对 <? extends T>与<? super T>很懵逼,接着看到泛型与集合的更蒙蔽,随后又翻开<码出高效>时, ...