小红的区间修改(二)(珂朵莉树板子)

[小红的区间修改(二)](https://ac.nowcoder.com/acm/contest/111159/F)

题意:

q次查询,每次[l,r,x]进行区间推平并覆盖的操作,每次操作后输出数组元素种类数

思路:

珂朵莉树板子
用区间set维护,按左端点排序
map维护数组元素种类数,当右键为0时erase掉,mp.size()就是种类数

struct node{
    int l,r;
    mutable int val;
    bool operator<(const node&A)const{
        return l<A.l;
    }
};
map<int,int>mp;
set<node>st;
IT split(int pos){
    IT it=st.lower_bound((node){pos,-1,0});
    if(it!=st.end()&&it->l==pos)return it;
    it--;
    int L=it->l,R=it->r;
    int v=it->val;

    st.erase(it);
    st.insert((node){L,pos-1,v});
    return st.insert((node){pos,R,v}).first;
}

void tp(int l,int r,int val){
    IT ir=split(r+1),il=split(l);
    for(auto it=il;it!=ir;it++){
        int v=it->val;
        int L=it->l,R=it->r;
        mp[v]-=(R-L+1);
        if(mp[v]==0){
            mp.erase(v);
        }
    }
    st.erase(il,ir);
    st.insert((node){l,r,val});
    mp[val]+=(r-l+1);
}

void solve(){
    int q;cin>>q;
    st.insert((node){1,maxn,0});
    while(q--){
        int l,r,x;cin>>l>>r>>x;
        tp(l,r,x);
        cout<<mp.size()<<endl;
    }

}
posted @ 2025-06-15 15:45  Marinaco  阅读(26)  评论(0)    收藏  举报
//雪花飘落效果