CF817F MEX Queries

题目

CF
luogu

思路

好菜呀
数据太大,需要离散化
但是离散化x的时候,需要带上x-1和x+1
因为这也有可能是答案,当然你分类讨论也阔以
然后维护一下第一个1出现的位置和第一个0出现的位置

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define ls rt<<1
#define rs rt<<1|1
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn = 6e5 + 7;
const int inf = 0x3f3f3f3f;
ll read() {
	ll x = 0, f = 1; char s = getchar();
	for (; s < '0' || s > '9'; s = getchar()) if (s == '-') f = -1;
	for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
	return x * f;
}
struct node {
	int l, r, size;
	int k1, k0, sum;
	int lazy1, lazy2;
	void sap() {
		swap(k1,k0);
		sum=size-sum;
		lazy2++;
	}
} e[maxn << 2];
int n;
void pushup(int rt) {
	e[rt].k0 = (e[ls].k0 == e[rt].l+e[ls].size+1) ? e[rs].k0 : e[ls].k0;
	e[rt].k1 = (e[ls].k1 == e[rt].l+e[ls].size+1) ? e[rs].k1 : e[ls].k1;
	e[rt].sum = e[ls].sum + e[rs].sum;
}
void pushdown(int rt) {
	if (e[rt].lazy1 != -1) {
		e[rs].lazy1 = e[ls].lazy1 = e[rt].lazy1;
		e[rs].lazy2 = e[ls].lazy2 = 0;
		if (e[rt].lazy1 == 0) {
			e[ls].k0 = e[ls].l;
			e[ls].k1 = e[ls].l+e[ls].size+1;
			e[ls].sum = 0;
			e[rs].k0 = e[rs].l;
			e[rs].k1 = e[rs].l+e[rs].size+1;
			e[rs].sum = 0;
		} else {
			e[ls].k1 = e[ls].l;
			e[ls].k0 = e[ls].l+e[ls].size+1;
			e[ls].sum = e[ls].size;
			e[rs].k1 = e[rs].l;
			e[rs].k0 = e[rs].l+e[rs].size+1;
			e[rs].sum = e[rs].size;
		}
		e[rt].lazy1 = -1;
	}
	if (e[rt].lazy2 % 2) {
		e[ls].sap();
		e[rs].sap();
		e[rt].lazy2 = 0;
	}
}
void build(int l, int r, int rt) {
	e[rt].l = l, e[rt].r = r, e[rt].size = r - l + 1;
	e[rt].lazy1 = -1;
	if (l == r) {
		e[rt].k0 = e[rt].l;
		e[rt].k1 = e[rt].l+e[rt].size+1;
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, ls);
	build(mid + 1, r, rs);
	pushup(rt);
}
void modify_1(int L, int R, int k, int rt) {
	if (L <= e[rt].l && e[rt].r <= R) {
		if (k == 0) {
			e[rt].k0 = e[rt].l;
			e[rt].k1 = e[rt].l+e[rt].size+1;
			e[rt].sum = 0;
			e[rt].lazy1 = 0;
		} else {
			e[rt].k1 = e[rt].l;
			e[rt].k0 = e[rt].l+e[rt].size+1;
			e[rt].sum = e[rt].size;
			e[rt].lazy1 = 1;
		}
		e[rt].lazy2 = 0;
		return;
	}
	pushdown(rt);
	int mid = (e[rt].l + e[rt].r) >> 1;
	if (L <= mid) modify_1(L, R, k, ls);
	if (R > mid) modify_1(L, R, k, rs);
	pushup(rt);
}
void modify_2(int L, int R, int rt) {
	if (L <= e[rt].l && e[rt].r <= R) {
		e[rt].sap();
		return;
	}
	pushdown(rt);
	int mid = (e[rt].l + e[rt].r) >> 1;
	if (L <= mid) modify_2(L, R, ls);
	if (R > mid) modify_2(L, R, rs);
	pushup(rt);
}
struct dsr {
	int pd;
	ll x,y;
}Q[maxn];
ll b[maxn];
int gs;
int main() {
	// 离散化
	n = read();
	b[++gs]=1;
	FOR(i, 1, n) {
		Q[i].pd=read(),Q[i].x=read(),Q[i].y=read();
		b[++gs]=Q[i].x;
		b[++gs]=Q[i].x+1;
		if(Q[i].x-1!=0)
		b[++gs]=Q[i].x-1;
		b[++gs]=Q[i].y;
		b[++gs]=Q[i].y+1;
		if(Q[i].y-1!=0)
		b[++gs]=Q[i].y-1;
	}
	sort(b+1,b+1+gs);
	int PKU=unique(b+1,b+1+gs)-b-1;
	FOR(i,1,n) {
		Q[i].x=lower_bound(b+1,b+1+PKU,Q[i].x)-b;
		Q[i].y=lower_bound(b+1,b+1+PKU,Q[i].y)-b;
	}
	// 询问
	build(1, 6e5, 1);
	FOR(i,1,n) {
		if (Q[i].pd == 1) {
			modify_1((int)Q[i].x, (int)Q[i].y, 1, 1);
		} else if (Q[i].pd == 2) {
			modify_1((int)Q[i].x, (int)Q[i].y, 0, 1);
		} else {
			modify_2((int)Q[i].x, (int)Q[i].y, 1);
		}
		printf("%lld\n",b[e[1].k0]);
	}
	return 0;
}
posted @ 2018-10-31 07:40  ComplexPug  阅读(154)  评论(0编辑  收藏  举报