871F.MEX Queries(线段树)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了871F.MEX Queries(线段树)相关的知识,希望对你有一定的参考价值。

871F.MEX Queries(线段树)

区间覆盖为1,区间清0,区间0-1翻转。

问最小0出现的位置。

维护每个区间的1出现的最小位置,0出现的最小位置即可。

// Problem: F. MEX Queries
// Contest: Codeforces - Educational Codeforces Round 23
// URL: https://codeforces.ml/problemset/problem/817/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// Date: 2021-08-03 19:20:55
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
struct query{
	ll l,r;
	int op;
}q[N];
ll b[N*4],cnt;
int n;
void init(){	//离散化
	b[++cnt]=1;//pay attention
	for(int i=1;i<=n;i++) {
			b[++cnt]=q[i].l,b[++cnt]=q[i].r,b[++cnt]=q[i].r+1;
			if(q[i].l-1) b[++cnt]=q[i].l-1;
	}
	sort(b+1,b+cnt+1);cnt=unique(b+1,b+cnt+1)-b-1;b[cnt+1]=1e18+5;
	for(int i=1;i<=n;i++) {
	q[i].l=lower_bound(b+1,b+cnt+1,q[i].l)-b,
	q[i].r=lower_bound(b+1,b+cnt+1,q[i].r)-b;
	}
}
#define lx x<<1
#define rx x<<1|1
struct node{
	ll c[2];
	int l,r,lz;
}a[N*12];
void re(int x){
	for(int i=0;i<2;i++) a[x].c[i]=min(a[lx].c[i],a[rx].c[i]);
}
void tg(int x,int v){
	if(v==-1) swap(a[x].c[0],a[x].c[1]),a[x].lz^=1;
	else a[x].c[v]=a[x].l,a[x].c[!v]=cnt+1,a[x].lz=v;
}
void pd(int x){
	if(a[x].lz==-2) return;
	tg(lx,a[x].lz),tg(rx,a[x].lz);a[x].lz=-2;
}
void bud(int x,int l,int r){
	a[x].l=l,a[x].r=r,a[x].lz=-2;
	if(l==r){
		a[x].c[0]=l,a[x].c[1]=cnt+1;return;
	}
	int m=l+r>>1;
	bud(lx,l,m),bud(rx,m+1,r);re(x);
}
void upd(int x,int l,int r,int op){
	if(a[x].l>=l&&a[x].r<=r){
		tg(x,op);return;
	}
	pd(x);
	int m=a[x].l+a[x].r>>1;
	if(l<=m) upd(lx,l,r,op);
	if(r>m) upd(rx,l,r,op);
	re(x);
}
int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++) 
	scanf("%d%lld%lld",&q[i].op,&q[i].l,&q[i].r);
	init();bud(1,1,cnt);
	for(int i=1;i<=n;i++){
		int op=2-q[i].op;
		upd(1,q[i].l,q[i].r,op);
		printf("%lld\\n",b[a[1].c[0]]);
	}
	return 0;
}

以上是关于871F.MEX Queries(线段树)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4027 Can you answer these queries?(线段树)

SPOJ GSS3 Can you answer these queries III ——线段树

SPOJ GSS5 Can you answer these queries V ——线段树

Sum Queries? CodeForces - 1217E (线段树)

SP2713 GSS4 - Can you answer these queries IV(线段树)

HDU 4027 Can you answer these queries? (线段树)