zoukankan      html  css  js  c++  java
  • 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
    ",b[e[1].k0]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    ubuntu14.04通过将语音,耳机没有声音
    网络编程easy错误点-手知道
    如何实现网页在线咨询框架
    C++定义自己的命名空间和头文件
    使用光标
    工作日两个日期之间的数
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/9880870.html
Copyright © 2011-2022 走看看