珂朵莉树ODT

6bce21a3d6204534990c903684bcb82a
//P1558
#include <bits/stdc++.h>
using namespace std;
struct node{
    int l,r,v;
};
bool operator<(node a,node b){
    return a.l<b.l;
}
set<node> s;
int n,m,l,t,o,tot,col[110];
set<node>::iterator split(int pos){
    set<node>::iterator it=s.lower_bound({pos,0,0});
    if(it!=s.end()&&it->l==pos){
        return it;
    }
    if(it==s.begin()){
        return it;
    }
    it--;
    int l=it->l,r=it->r,v=it->v;
    s.erase(it);
    s.insert({l,pos-1,v});
    return s.insert({pos,r,v}).first;
}
void assign(int l,int r,int v){
    set<node>::iterator it2=split(r+1),it1=split(l);
    /*for(set<node>::iterator it=it1;it!=it2;it++){
        if(it->v){
            col[it->v]--;
            col[v]++;
            if(col[it->v]==0){
                tot--;
            }
            if(col[v]==1){
                tot++;
            }
        }
    }*/
    s.erase(it1,it2);
    s.insert({l,r,v});
    //cout<<l<<r<<v;
}
int Ask(int l,int r){
    int ans=0;
    memset(col,0,sizeof(col));
    set<node>::iterator it2=split(r+1),it1=split(l);
    for(set<node>::iterator it=it1;it!=it2;it++){
        if(it->v){
            //cout<<it->l<<" "<<it->r<<" "<<it->v<<endl;
            col[it->v]++;
        }
    }
    for(int i=1;i<=t;i++){
        if(col[i]){
            ans++;
        }
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(0);
    cin>>l>>t>>o;
    s.insert({1,l,1});
    while(o--){
        int l,r,x;
        char opt;
        cin>>opt>>l>>r;
        if(l>r){
            swap(l,r);
        }
        if(opt=='C'){
            cin>>x;
            assign(l,r,x);
        }
        if(opt=='P'){
            cout<<Ask(l,r)<<endl;
        }
    }
    return 0;
}
//P14623
#include<bits/stdc++.h>
using namespace std;
int n,c,q,cnt,tot,fa[1000010],dfn[1000010],dep[1000010],top[1000010],hed[1000010];
int idx,siz[1000010],son[1000010],col[1000010],bck[1000010];
int ver[1000010],frm[1000010],nxt[1000010];
void add(int a,int b){
    ver[++tot]=b,frm[tot]=a,nxt[tot]=hed[a],hed[a]=tot;
}
struct node{
    int l,r,v;
    node(int a=0,int b=-1,int c=0):l(a),r(b),v(c){}
};
bool operator<(node a,node b){
    return a.l<b.l;
}
set<node>s;
set<node>::iterator split(int pos){
    set<node>::iterator it=s.lower_bound(node(pos));
    if(it!=s.end()&&it->l==pos){
        return it;
    }
    if(it==s.begin()){
        return it;
    }
    it--;
    int l=it->l,r=it->r,v=it->v;
    s.erase(it),s.insert(node(l,pos-1,v));
    return s.insert(node(pos,r,v)).first;
}
void assign(int l,int r,int v){
    set<node>::iterator it2=split(r+1),it1=split(l);
    for(set<node>::iterator it=it1;it!=it2;it++){
        if(it->v){
            col[bck[it->v]]--;
            bck[it->v]-=(it->r-it->l+1);
            col[bck[it->v]]++;
        }
    }
    col[bck[v]]--;
    bck[v]+=(r-l+1);
    col[bck[v]]++;
    s.erase(it1,it2);
    s.insert(node(l,r,v));
}
void dfs1(int u,int faa){
    dep[u]=dep[faa]+1;
    fa[u]=faa;
    siz[u]=1;
    for(int i=hed[u];i;i=nxt[i]){
        int v=ver[i];
        if(v==faa){
            continue;
        }
        dfs1(v,u);
        siz[u]+=siz[v];
        if(siz[son[u]]<siz[v]){
            son[u]=v;
        }
    }
}
void dfs2(int u,int tp){
    top[u]=tp;
    dfn[u]=++cnt;
    if(son[u]){
        dfs2(son[u],tp);
    }
    for(int i=hed[u];i;i=nxt[i]){
        int v=ver[i];
        if(v==fa[u]||v==son[u]){
            continue;
        }
        dfs2(v,v);
    }
}
void update(int u,int v,int k){
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]){
            swap(u,v);
        }
        assign(dfn[top[u]],dfn[u],k);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]){
        swap(u,v);
    }
    if(u!=v){
        assign(dfn[u]+1,dfn[v],k);
    }
}
int main(){
    scanf("%d%d%d",&n,&c,&q);
    for(int i=1;i<=n;i++){
        s.insert(node(i,i,0));
    }
    s.insert(node(n+1,n+1,0));
    col[0]=c;
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u); 
    }
    dfs1(1,0);
    dfs2(1,1);
    while(q--){
        int u,c,m;
        scanf("%d%d%d",&u,&c,&m);
        update(1,u,c);
        printf("%d\n",col[m]);
    }
    return 0;
}

 

posted @ 2026-05-18 22:06  heccqwq  阅读(5)  评论(0)    收藏  举报