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