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的主要内容,如果未能解决你的问题,请参考以下文章