有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导)。如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属。如果你是没有人的老板,那么你就没有下属,没有直接老板的员工就是整个公司的领导,也就是说N个员工构成了一棵树。公司通常把一些任务分配给一些员工来完成,当一项任务分配给某个人时,他/她会把它分配给他/她的所有下属,换句话说,这个人和他/她的所有下属在同一时间接受了一项任务。此外,每当员工收到一个任务,他/她将停止当前任务(如果他/她有),并开始新的任务。在公司将某些任务分配给某个员工后,编写一个程序来帮助找出某个员工当前的任务。

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序 + 线段树)的更多相关文章

  1. hdu 5692(dfs序+线段树,好题)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. HDU 5877 [dfs序][线段树][序]

    /* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...

  3. hdu 3974 dfs时间戳+线段树

    题意: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务. 有若干操作,分配给员工任务以及查询该员工正在执行的任务. 题解: 典型的更新字树的操 ...

  4. HDU 5692 (DFS序+线段树)

    DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...

  5. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  6. 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 ...

  7. 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 ...

  8. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  9. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

随机推荐

  1. Codeforces Gym101518E:The Pharaoh's Curse(BFS + 离散化)

    题目链接 题意 给出一个n*m的地图,人的当前位置是'S',还有不超过两个的箱子'X',任意多个按钮'B',不超过100个可以走的点'.',还有一个在边界的出口'E',当且仅当所有的按钮都被箱子盖住的 ...

  2. 利用consul在spring boot中实现最简单的分布式锁

    因为在项目实际过程中所采用的是微服务架构,考虑到承载量基本每个相同业务的服务都是多节点部署,所以针对某些资源的访问就不得不用到用到分布式锁了. 这里列举一个最简单的场景,假如有一个智能售货机,由于机器 ...

  3. ESXI好好研究

    之前几周在公司要搭建一个平台,因为服务器不够用,所以需要要一台服务器上装虚拟机.有人说用ESXI装虚拟机,并且不用装操作系统,我当时还纳闷儿了,不装操作系统,直接装虚机?这里我有点孤陋寡闻了,其实ES ...

  4. DAX 第二篇:计算上下文

    计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的.行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文.计算上下文用于限定公式计算的环境,当上下文变化时,相同的 ...

  5. 【HDU - 1560】DNA sequence (dfs+回溯)

    DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...

  6. 个人永久性免费-Excel催化剂功能第95波-地图数据挖宝之IP地址转地理地址及不同经纬度版本转换

    经过上一波POI兴趣点查询后,地图数据挖宝也接近尾声,这次介绍在数据采集.准备过程中需要用到的一些转换功能,有IP地址转换地理地址及不同地图版本的经纬度转换. 背景知识 在电商.网络的数据分析过程中, ...

  7. 个人永久性免费-Excel催化剂功能第66波-数据快速录入,预定义引用数据逐字提示

    在前面好几波的功能中,为数据录入的规范性做了很大的改进,数据录入乃是数据应用之根,没有完整.干净的数据源,再往下游的所有数据应用场景都是空话.在目前IT化进程推进了20多年的现状,是否还仍有必要在Ex ...

  8. HIVE之 DDL 数据定义 & DML数据操作

    DDL数据库定义 创建数据库 1)创建一个数据库,数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db. hive (default)> create dat ...

  9. apache CXF Service 简单使用

    cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...

  10. [蓝桥杯] Fibonacci数列 入门

    原题链接 import java.util.Scanner;//导入Scanner类 public class Main { public static void main(String[] args ...