[线段树] *建树 区间更新 单点查询* hdu 3974

题目

在这里插入图片描述
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974

思路

这道题给出了每个人之间的关系,让我们自己建图。
首先,没有boss的人就是boss,我们要先把boss找出来,然后利用dfs建树。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
vector<int> v1[50010];
struct sut{
	int l,r,lazy,sum;
}v2[50010],tree[200100]; 
bool root[50010];
int po;
void dfs(int pos){
	v2[pos].l=po++;
	for(int i=0;i<(int)v1[pos].size();i++){
		dfs(v1[pos][i]);
	}
	v2[pos].r=po-1;
}
void build(int l1,int r1,int x){
	tree[x].l=l1,tree[x].r=r1;
	tree[x].lazy=0;tree[x].sum=-1;
	if(l1==r1) return;
	int mid=(l1+r1)>>1;
	build(l1,mid,x<<1);
	build(mid+1,r1,x<<1|1);
}
void pushdown(int x){
	if(tree[x].l==tree[x].r) tree[x].lazy=0;
	else if(tree[x].lazy){
		tree[x<<1].lazy=tree[x<<1|1].lazy=tree[x].lazy;
		tree[x<<1|1].sum=tree[x<<1].sum=tree[x].sum;
		tree[x].lazy=0;
	}
}
void update(int l1,int r1,int add,int x){
	if(l1<=tree[x].l&&tree[x].r<=r1){
		tree[x].lazy=1;
		tree[x].sum=add;
		return;
	}
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)>>1;
	if(l1<=mid) update(l1,r1,add,x<<1);
	if(mid<r1) update(l1,r1,add,x<<1|1); 
}
int query(int l1,int r1,int x){
	if(tree[x].l==tree[x].r){
		return tree[x].sum;
	}
	int ans=0;
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)>>1;
	if(l1<=mid) ans=query(l1,r1,x<<1);
	if(mid<r1) ans=query(l1,r1,x<<1|1);
	return ans; 
}
char c[5]; 
int main(){
	int t;
	scanf("%d",&t);
	int res=1;
	while(t--){
		printf("Case #%d:\n",res++); 
		int n;
		scanf("%d",&n);
		for(int i=0;i<=n;i++) v1[i].clear();
		memset(root,0,sizeof root);
		for(int i=1;i<n;i++){
			int x,y;
			scanf("%d %d",&x,&y);
			v1[y].push_back(x);
			root[x]=1;
		}
		int root1=0;
		for(int i=1;i<n;i++){
			if(root[i]==0){
				root1=i;
				break;
			} 
		} 
		po=1;
		dfs(root1);
		build(1,n,1);
		int m;
		scanf("%d",&m);
		while(m--){
			int x,y;
			scanf("%s",c);
			if(c[0]=='T'){
				scanf("%d%d",&x,&y);
				update(v2[x].l,v2[x].r,y,1);
			}
			if(c[0]=='C'){
				scanf("%d",&x);
				printf("%d\n",query(v2[x].l,v2[x].l,1));
			}
		}
	} 
    return 0;
}

发布了78 篇原创文章 · 获赞 1 · 访问量 4378

猜你喜欢

转载自blog.csdn.net/kosf_/article/details/104434064