[线段树] *建树 区间更新 单点查询* 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;
}
kosf_
发布了56 篇原创文章 · 获赞 1 · 访问量 3639
私信
关注
标签:hdu,单点,50010,int,dfs,boss,3974,l1,include 来源: https://blog.csdn.net/kosf_/article/details/104434064