样例 #2 WA 求调
  • 板块CF620E New Year Tree
  • 楼主_H17_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/12 20:56
  • 上次更新2024/11/12 23:23:35
查看原帖
样例 #2 WA 求调
743014
_H17_楼主2024/11/12 20:56
#include<bits/stdc++.h>
#define int long long 
using namespace std;
constexpr int N=4e5+1;
int n,q,a[N],cnt,tot,root;
vector<int>e[N];
struct Segment{
    int l,r;
    Segment(int l=0,int r=0):l(l),r(r){}
}s[N];
struct SegmentTreeNode{
    int l,r,ls,rs,val,tag;
    SegmentTreeNode(int l=0,int r=0,int ls=0,int rs=0,int val=0,int tag=0):l(l),r(r),ls(ls),rs(rs),val(val),tag(tag){}
}f[N<<1];
void add(int u,int v){
    e[u].push_back(v);
    return;
}
int dfs(int u,int fa){
    s[u].l=s[u].r=(++cnt);
    for(auto v:e[u])
        if(v!=fa)
            s[u].r=max(s[u].r,dfs(v,u));
    return s[u].r;
}
void pushup(int cur){
    f[cur].val=(f[f[cur].ls].val|f[f[cur].rs].val);
    return;
}
void pushdown(int cur){
    if(f[cur].tag){
        f[f[cur].ls].val=(1ll<<((f[f[cur].ls].tag=f[cur].tag)-1)),
        f[f[cur].rs].val=(1ll<<((f[f[cur].rs].tag=f[cur].tag)-1));
        f[cur].tag=0;
    }
    return;
}
void build(int l,int r,int&cur){
    f[cur=(++tot)]=SegmentTreeNode(l,r,0,0,0,0);
    if(l==r){
        f[cur].val=(1ll<<(a[l]-1));
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,f[cur].ls),build(mid+1,r,f[cur].rs);
    return pushup(cur);
}
void modify(int l,int r,int val,int cur){
    if(l<=f[cur].l&&f[cur].r<=r){
        f[cur].val=(1ll<<(val-1)),f[cur].tag=val;
        return;
    }
    pushdown(cur);
    int mid=(f[cur].l+f[cur].r)>>1;
    if(l<=mid)
        modify(l,r,val,f[cur].ls);
    if(mid<r)
        modify(l,r,val,f[cur].rs);
    return pushup(cur);
}
int query(int l,int r,int cur){
    if(l<=f[cur].l&&f[cur].r<=r)
        return f[cur].val;
    pushdown(cur);
    int mid=(f[cur].l+f[cur].r)>>1,ret=0;
    if(l<=mid)
        ret|=query(l,r,f[cur].ls);
    if(mid<r)
        ret|=query(l,r,f[cur].rs);
    return ret;
}
signed main(){
	ios::sync_with_stdio(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        add(u,v),add(v,u);
    }
    dfs(1,0),build(1,n,root);
    for(int op,x,c;q;--q){
        cin>>op>>x;
        if(op==1){
            cin>>c;
            modify(s[x].l,s[x].r,c,1);
        }
        else
            cout<<__builtin_popcountll(query(s[x].l,s[x].r,1))<<'\n';
    }
    return 0;
}
2024/11/12 20:56
加载中...