区间推平(类似珂朵莉树)
区间推平:给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;
}
浙公网安备 33010602011771号