萌新求助全WA
查看原帖
萌新求助全WA
196903
南阳刘子骥楼主2022/5/15 15:59

Rt. 连样例都没过。

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
int q;
int a[N];
struct SegTree
{
	int l, r;
	int sum, tag;
}tr[N << 3];
void pushup(int p)
{
	tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
}
void pushdown(int p)
{
	auto &root = tr[p], &left = tr[p << 1], &rght = tr[p << 1 | 1];
	if(root.tag != -1)
	{
		left.sum = (left.r - left.l + 1) * root.tag;
		rght.sum = (rght.r - rght.l + 1) * root.tag;
		left.tag = root.tag;
		rght.tag = root.tag;
		root.tag = -1;
	}
}
void build(int p, int l, int r)
{
	tr[p].l = l, tr[p].r = r;
	if(l == r)
	{
		return;
	}
	int mid = (l + r) >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
}
void init(int p, int k)
{
	if(tr[p].l == tr[p].r)
	{
		tr[p].sum = (a[tr[p].l] >= k);
		tr[p].tag = -1;
		return;
	}
	init(p << 1, k);
	init(p << 1 | 1, k);
	pushup(p);
}
void segchg(int p, int l, int r, int k)
{
	if(tr[p].l >= l && tr[p].r <= r)
	{
		tr[p].sum = (tr[p].r - tr[p].l + 1) * k;
		tr[p].tag = k;
		return;
	}
	pushdown(p);
	int mid = (tr[p].l + tr[p].r) >> 1;
	if(l <= mid)segchg(p << 1, l, r, k);
	if(r > mid)segchg(p << 1 | 1, l, r, k);
	pushup(p);
}
int segsum(int p, int l, int r)
{
	if(tr[p].l >= l && tr[p].r <= r)return tr[p].sum;
	pushdown(p);
	int mid = (tr[p].l + tr[p].r) >> 1;
	int res = 0;
	if(l <= mid)res += segsum(p << 1, l, r);
	if(r > mid)res += segsum(p << 1 | 1, l, r);
	pushup(p);
	return res;
}
int op[N], L[N], R[N];
bool chq(int middle)
{
	init(1, middle);
	int num;
	for(int i = 1; i <= m; i++)
	{
		num = segsum(1, L[i], R[i]);
		if(op[i])
		{
			segchg(1, L[i], L[i] + num - 1, 1);
			segchg(1, L[i] + num, R[i], 0);
		}
		else
		{
			segchg(1, L[i], R[i] - num, 0);
			segchg(1, R[i] - num + 1, R[i], 1);
		}
	}
	return segsum(1, q, q);
}
int getans()
{
	int left = 1, right = n;
	int answer = -1;
	while(left <= right)
	{
		int mid = (left + right) >> 1;
		if(chq(mid))
		{
			answer = mid;
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return answer;
}
int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for(int i = 1; i <= m; i++)
		scanf("%d%d%d", &op[i], &L[i], &R[i]);
	scanf("%d", &q);
	build(1, 1, n);
	printf("%d\n", getans());
	return 0;
}
2022/5/15 15:59
加载中...