hdu3974(多叉树时间戳建模成线段树)

此博客介绍了如何用线段树处理多叉树的时间戳建模问题。通过DFS为多叉树节点打上时间戳,并根据新分配的ID将节点映射到线段树上,实现任务分配和查询。线段树的更新和查询操作对应于在多叉树上的任务更新和查询。
摘要由CSDN通过智能技术生成
/*
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值