MEX Queries
题解
线段树板子题
我们可以先根据所有点的颜色来建一棵线段树。
很明显,1,2操作就相当于区间赋值,3操作就相当于区间翻转,这些通过打标记就可以解决。
但需要注意区间赋值的标记会影响到区间翻转的标记,打时需要将翻转标记清空。
源码
思路很简单,就是有点难调
#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
const int INF=0x7f7f7f7f;
const int mo=1e9+7;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<LL,LL> pii;
int n,opt[MAXN];LL L[MAXN],R[MAXN],b[MAXN<<2],c[MAXN<<2];
int sum[MAXN<<4],lzy[MAXN<<4],rev[MAXN<<4],tot;
void pushdown(int rt,int l,int r){
int mid=l+r>>1;
if(rev[rt]>=0){
sum[rt<<1]=(mid-l+1)*rev[rt];
sum[rt<<1|1]=(r-mid)*rev[rt];
rev[rt<<1]=rev[rt<<1|1]=rev[rt];
lzy[rt<<1]=lzy[rt<<1|1]