HDOJ 3974 Assign the task

Posted greenty1208

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ 3974 Assign the task相关的知识,希望对你有一定的参考价值。

题意

给定一棵多叉树,每个节点定义val,job ,指定val,初始job全为 -1
两种操作
C x :查询结点val==x的job值
T x y  将以val == x为根节点的子树的所有节点的job值改为y

分析

这里着重分析如何将多叉树模型转换成线性模型,从而可以进行区间修改
从根节点开始,dfs整棵树,依次盖上时间戳,则对于结点x为根的子树,包含的时间戳范围就是:[ 刚访问x的时间戳 , 即将从x返回的时间戳 ] 

代码

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#define For(i,a,b) for(int i=(a); i<=(b) ; i++)
#define _For(i,a,b) for(int i=(a); i>=(b) ; i--)
#define Memset(a,b); memset((a),(b),sizeof((a)));
#define Cin(a); scanf("%d",&(a));
#define Cinc(a); scanf(" %c",&(a));
#define Cins(a); scanf("%s",(a));
#define Cout(a,b);  printf("%d",(a));printf(b);
#define Coutc(a,b);  printf("%c",(a));printf(b);
#define Couts(a,b);  printf("%s",(a));printf(b);
using namespace std;
typedef  long long LL;
typedef  unsigned long long ULL;
typedef  long double LDB;
inline int readint() {int x;cin>>x;return x;} 
vector<int>v[50005];
int js,ans,n;
int st[50005];
int en[50005];
int lazy[500005];
int previsit = 0; 
void dfs(int now)
{
	st[now] = ++js;
	for(int i=0;i<v[now].size();i++)
	{
		int to = v[now][i];
		if(i == v[now].size()-1) en[to] = n+1;
		else en[to] = v[now][i+1];
		dfs(to);
	}
	en[now] = js;
}
inline void pushdown(int o)
{
	lazy[o<<1] = lazy[o<<1|1] = lazy[o];
	lazy[o] = -1;
}
void update(int o,int l,int r,int L,int R,int d)
{
	if(l>=L && r<=R){
		lazy[o] = d;
		return;
	}
	if(lazy[o]!=-1) pushdown(o);
	int M = (l+r)>>1;
	if(M>=L) update(o<<1,l,M,L,R,d);
	if(M+1<=R) update(o<<1|1,M+1,r,L,R,d);
}
void query(int o,int l,int r,int x)
{
	if(l==r){
		ans = lazy[o];
		return;
	}
	if(lazy[o]!=-1) pushdown(o);
	int M = (l+r)>>1;
	if(M>=x) query(o<<1,l,M,x);
	else query(o<<1|1,M+1,r,x);
}
int main()
{
	int _,x,y;
	char cmd;
	Cin(_);
	For(T,1,_)
	{
		For(i,1,n) v[i].clear();
		Memset(st,0);
		Memset(en,0);
		Memset(lazy,-1);
		Cin(n);
		LL root = n*1LL*(n+1)/2*1LL;
		for(int i=1;i<n;i++)
		{
			Cin(x);Cin(y);
			root -= x;
			v[y].push_back(x);     	
		}
		js = 0;
		en[root] = n+1;
		dfs(root);
		int m;
		Cin(m);
		char cmd;
		printf("Case #%d:\n",T);
		st[n+1] = n+1;
		for(int i=1;i<=m;i++)
		{
			Cinc(cmd);
			if(cmd == ‘C‘)
			{
				Cin(x);
				query(1,1,n,st[x]);
				Cout(ans,"\n");
			} 
			else
			{
				Cin(x);Cin(y);
				int xx = st[x];
				int yy = en[x];
				update(1,1,n,xx,yy,y);
			}
		}
		
	}
}

  

 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

以上是关于HDOJ 3974 Assign the task的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3974 Assign the task(线段树)

HDU3974 Assign the task

HDU 3974 Assign the task

hdu 3974 Assign the task(线段树)

hdu 3974 Assign the task 线段树 DFS序

HDU - 3974 Assign the task (线段树区间修改+构建模型)