Codeforces - MEX Queries

题目链接:Codeforces - MEX Queries


区间覆盖问题,显然可以使用ODT暴力。

于是试了一下并没有卡ODT。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct node{
    int l,r;    mutable int v;
    bool operator < (const node &a) const{return l<a.l;}
};
set<node> s;
inline set<node>::iterator split(int pos){
    auto it=s.lower_bound({pos,-1,0});
    if(it!=s.end()&&it->l==pos) 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;
}
inline void assign(int l,int r,int v){
    auto itr=split(r+1),itl=split(l);
    s.erase(itl,itr);   s.insert({l,r,v});
}
inline void rev(int l,int r){
	auto itr=split(r+1),itl=split(l);
	for(;itl!=itr;itl++)	itl->v^=1;
}
inline int ask(){
	for(auto x=s.begin();x!=s.end();x++){
		if(x->v==0LL)	return x->l;
	}
	return -1;
}
signed main(){
	cin>>n;
	s.insert({1LL,(int)1e18,0LL});
	for(int i=1;i<=n;i++){
		int op,l,r;	scanf("%lld %lld %lld",&op,&l,&r);
		if(op==1)	assign(l,r,1);
		else if(op==2)	assign(l,r,0);
		else	rev(l,r);
		printf("%lld\n",ask());
	}
	return 0;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104181553
Mex