码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ 3974 Assign the task

时间:2018-01-30 12:48:13      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:tmp   vector   star   row   code   ios   als   转换   long   

题意

给定一棵多叉树,每个节点定义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

标签:tmp   vector   star   row   code   ios   als   转换   long   

原文地址:https://www.cnblogs.com/greenty1208/p/8383109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!