区间推平(类似珂朵莉树)

区间推平:给l,r ,把【l,r】 中的元素全变成x
例题:https://ac.nowcoder.com/acm/contest/111159/F

模板//
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int N=1e6+10;
struct node
{
    int l,r,val;
    bool operator < (const node &t) const{
        if(l==t.l) return r<t.r;
        return l<t.l;
    }
};
int n;
map<int,int> mp;
set<node> se;
signed main()
{
    ios
    se.insert({0,200000,0});
    mp[0]=200000;
    cin>>n;
    while(n--)
    {
        int l,r,x;
        cin>>l>>r>>x;
        node t={l,200000,x};
        auto L=se.lower_bound(t);
        L--;
        int l1=L->l,r1=L->r,v1=L->val;
        t={r+1,200000,x};
        auto R=se.lower_bound(t);
       R--;
        int l2=R->l,r2=R->r,v2=R->val;
        vector<node> del;
        for(auto it=L;;it++)
        {
            del.emplace_back(*it);
            if(it==R) break;
        }
        for(auto d: del)
        {
            int l=d.l,r=d.r,val=d.val;
            mp[val]-=r-l+1;
            if(mp[val]==0) mp.erase(val);
            se.erase(d);
        }
        if(l1<l)
        {
            se.insert({l1,l-1,v1});
            mp[v1]+=l-1-l1+1;
        }
        if(r<r2){ 
            se.insert({r+1,r2,v2});
            mp[v2]+=r2-r;
        }
        se.insert({l,r,x});
        mp[x]+=r-l+1;
        cout<<mp.size()<<endl;
    }
    return 0;
    
}
posted on 2025-06-10 15:18  下头小美  阅读(5)  评论(0)    收藏  举报