/*
translation:
一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。
有若干操作,分配给员工任务以及查询该员工正在执行的任务。
solution:
线段树,时间戳一般化
很明显该公司的所有员工间的关系可以用一颗多叉树来表示。然后就是dfs给这棵树打上时间戳。根据新分配的id号码
将其节点对应映射到线段树上面。这样分配任务就相当与更新一段连续的节点,查询任务相当与单点查询。
note:
#: 这道题WA的原因在于搞错了多叉树和线段树间的映射关系。要明白线段树的本质就是对一整段连续区间进行操作。
所以这道题的关键就在于清楚怎么将对多叉树的操作转化成对一整段连续区间的操作。
date:
2016.11.28
*/
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 50000 + 5;
vector<int> boss[maxn];
vector<int> employee[maxn];
int L[maxn*4], R[maxn*4]; //节点在树上所对应的覆盖范围以及新分配的id
int n, q, cnt;
int s[maxn*4], e[maxn*4];
int task[maxn*4];
void init()
{
for(int i = 0; i <= n; i++){
boss[i].clear();
employee[i].clear();
}
}
void dfs(int u)
{
++cnt;
L[u] = cnt;
for(int i = 0; i < boss[u].size(); i++){
int v = boss[u][i];
dfs(v);
}
R[u] = cnt
hdu3974(多叉树时间戳建模成线段树)
最新推荐文章于 2019-12-13 15:42:24 发布
此博客介绍了如何用线段树处理多叉树的时间戳建模问题。通过DFS为多叉树节点打上时间戳,并根据新分配的ID将节点映射到线段树上,实现任务分配和查询。线段树的更新和查询操作对应于在多叉树上的任务更新和查询。
摘要由CSDN通过智能技术生成