小红的区间修改(二)(珂朵莉树板子)
[小红的区间修改(二)](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;
}
}

浙公网安备 33010602011771号