1. 程式人生 > >HDOJ 3974 Assign the task

HDOJ 3974 Assign the task

efi cmd read lba -c -m 題意 兩種 min

題意

給定一棵多叉樹,每個節點定義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