求助,动态开点wa7
查看原帖
求助,动态开点wa7
821939
zhi_hui_kan_ti_jie楼主2023/11/19 20:43
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 10;
struct node
{
	int l, r,val=0,tag=-1; //-1,0,1,2
	node*lson=NULL, *rson=NULL;
	node(int l, int r){ this->l = l, this->r = r; }
};
node* root = new node(1, 1e18);
inline void push_down(node* now)
{
	int l = now->l, r = now->r;
	int mid = l + r >> 1;
	if ((!now->lson) &&(!now->rson))
	{
		now->lson = new node(l, mid);
		now->rson = new node(mid + 1, r);
		if (now->val == now->r - now->l + 1)
		{
			now->lson->val = mid - l + 1;
			now->rson->val = r - mid;
		}
		now->lson->tag = now->rson->tag = now->tag;
		now->tag = -1;
		return;
	}
	if (now->tag == 0)
	{
		now->lson->val = 0;
		now->rson->val = 0;
		now->lson->tag = 0;
		now->rson->tag = 0;
	}
	else if (now->tag == 1)
	{
		now->lson->val = mid-l+1;
		now->rson->val = r-mid;
		now->lson->tag = 1;
		now->rson->tag = 1;
	}
	else if (now->tag == 2)
	{
		now->lson->val = mid - l + 1-now->lson->val;
		now->rson->val = r - mid-now->rson->val;
		now->lson->tag = 2;
		now->rson->tag = 2;
	}
	now->tag = -1;
}
inline void push_up(node* now)
{
	now->val = now->lson->val + now->rson->val;
}
void add(node* now, int ql, int qr)
{
	int l = now->l, r = now->r;
	if (l>=ql &&r<=qr)
	{
		now->val = now->r - now->l + 1;
		now->tag = 1;
		return;
	}
	push_down(now);
	int mid = l + r >> 1;
	if (ql <= mid)add(now->lson, ql, qr);
	if (qr > mid)add(now->rson, ql, qr);
	push_up(now);
}
void del(node* now, int ql, int qr)
{
	int l = now->l, r = now->r;
	if (l >= ql &&r <= qr)
	{
		now->val = 0;
		now->tag = 0;
		return;
	}
	push_down(now);
	int mid = l + r >> 1;
	if (ql <= mid)del(now->lson, ql, qr);
	if (qr > mid)del(now->rson, ql, qr);
	push_up(now);
}
void rev(node* now, int ql, int qr)
{
	int l = now->l, r = now->r;
	if (l >= ql &&r <= qr)
	{
		now->val = now->r - now->l + 1-now->val;
		now->tag = 2;
		return;
	}
	push_down(now);
	int mid = l + r >> 1;
	if (ql <= mid)rev(now->lson, ql, qr);
	if (qr > mid)rev(now->rson, ql, qr);
	push_up(now);
}
int ask(node* now)
{
	int l = now->l, r = now->r;
	if (l == r)
	{
		return l;
	}
	push_down(now);
	int mid = l + r >> 1;
	int ret = 0;
	if (now->lson->val < now->lson->r - now->lson->l + 1)
		ret = ask(now->lson);
	else
		ret = ask(now->rson);
	push_up(now);
	return ret;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int op, l, r; cin >> op >> l >> r;
		if (op == 1) add(root, l, r);
		else if (op == 2) del(root, l, r);
		else rev(root, l, r);
		cout << ask(root) << '\n';
	}
	return 0;
}
2023/11/19 20:43
加载中...