CF620E New Year Tree
题意略。
首先只有子树操作,于是我们把这棵树拍成欧拉序。
然后把每个位置的颜色状压一下,就变成了区间推平和区间按位或。
然后谁都会的线段树。
// Problem: E. New Year Tree
// Contest: Codeforces - Educational Codeforces Round 6
// URL: https://codeforces.com/contest/620/problem/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// Author: jimmyywang
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
inline ll rd() {
ll x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c))x=x*10+c-'0',c=getchar();
return x*f;
}
#define d rd()
#define pb push_back
ll n,m;
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
ll t[800010<<2];
ll tg[800010<<2];
void upd(ll p){t[p]=t[ls(p)]|t[rs(p)];}
void pd(ll p){
if(!tg[p])return;
tg[ls(p)]=tg[rs(p)]=t[ls(p)]=t[rs(p)]=tg[p];
tg[p]=0;
}
void ch(ll l,ll r,ll p,ll L,ll R,ll k){
if(L<=l&&r<=R){tg[p]=t[p]=k;return;}
pd(p);ll mid=(l+r)>>1;
if(mid>=L)ch(l,mid,ls(p),L,R,k);
if(mid<R)ch(mid+1,r,rs(p),L,R,k);
upd(p);
}
ll ask(ll l,ll r,ll p,ll L,ll R){
if(L<=l&&r<=R)return t[p];
pd(p);ll mid=(l+r)>>1,ans=0;
if(mid>=L)ans|=ask(l,mid,ls(p),L,R);
if(mid<R)ans|=ask(mid+1,r,rs(p),L,R);
return ans;
}
ll c[400010],cnt;
vector<ll>e[400010];
ll l[400010],r[400010];
void dfs(ll u,ll fa){
l[u]=++cnt;
for(int i=0;i<e[u].size();i++){
ll v=e[u][i];
if(v==fa)continue;
dfs(v,u);
}r[u]=++cnt;
ch(1,2*n,1,l[u],l[u],1ll<<c[u]);
ch(1,2*n,1,r[u],r[u],1ll<<c[u]);
}
int main(){
n=d,m=d;f(i,1,n)c[i]=d;
f(i,1,n-1){ll u=d,v=d;e[u].pb(v),e[v].pb(u);}
dfs(1,0);while(m--){
ll opt=d;
if(opt==1){
ll u=d,col=d;
ch(1,2*n,1,l[u],r[u],1ll<<col);
}else{
ll u=d,p=ask(1,2*n,1,l[u],r[u]),q=0;
f(i,1,60)if(p&(1ll<<i))q++;
printf("%lld\n",q);
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】