求助dalao,我调了一下午了,连样例都过不了
查看原帖
求助dalao,我调了一下午了,连样例都过不了
120017
JeffZhao楼主2021/7/5 17:40
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 5e4 + 10;

inline int du(void) {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
	return x * f;
}
inline void write(int x) {
	if (x < 0) { putchar('-'); x = -x; }
	if (x > 9)write(x / 10);
	putchar(x % 10 ^ 48);
	return;
}

int n, m; 
int L[N << 2], R[N << 2];
int siz[N << 2], Max[N << 2], Lmax[N << 2], sum[N << 2], Rmax[N << 2];
int tag[N << 2], ans[N];

inline void push_up(int k) {
	siz[k] = siz[k << 1] + siz[k << 1 | 1];
	R[k] = R[k << 1 | 1], L[k] = L[k << 1 | 1];//容易遗漏
	Lmax[k] = Lmax[k << 1], Rmax[k] = Rmax[k << 1 | 1], Max[k] = max(Max[k << 1], Max[k << 1 | 1]);
	if (R[k << 1] == L[k << 1 | 1] && R[k << 1] == 1) {
		Max[k] = max(Max[k], Rmax[k << 1] + Lmax[k << 1 | 1]);
		if (siz[k << 1] == Max[k << 1])Lmax[k] = siz[k << 1] + Lmax[k << 1 | 1];
		if (siz[k << 1 | 1] == Max[k << 1 | 1])Rmax[k] = siz[k << 1 | 1] + Rmax[k << 1];
	}
	Max[k] = max(Max[k], max(Lmax[k], Rmax[k]));
	return;
}

inline void build(int k, int l, int r) {
	if (l == r) {
		R[k] = L[k] = 1;
		siz[k] = Max[k] = Lmax[k] = Rmax[k] = 1;
		return;
	}
	int mid = (l + r) >> 1;
	build(k << 1, l, mid);
	build(k << 1 | 1, mid + 1, r);
	push_up(k);
	return;
}
//1清空2住人
inline void Add(int k, int l, int r, int v) {
	tag[k] = v;
	L[k] = R[k] = v;
	Lmax[k] = tag[k] == 1 ? (r - l + 1) : 0;
	Rmax[k] = tag[k] == 1 ? (r - l + 1) : 0;
	Max[k] = tag[k] == 1 ? (r - l + 1) : 0;
	return;
}
inline void pushdown(int k, int l, int r) {
	if (tag[k] == 0)
		return;
	int mid = (l + r) >> 1;
	Add(k << 1, l, mid, tag[k]);
	Add(k << 1 | 1, mid + 1, r, tag[k]);
	tag[k] = 0;
	return;
}


inline void update(int k, int l, int r, int ql, int qr, int v) {
	if (ql <= l && r <= qr) {
		Add(k, l, r, v);
		return;
	}
	pushdown(k, l, r);
	int mid = (l + r) >> 1;
	if (ql <= mid)update(k << 1, l, mid, ql, qr, v);
	if (qr > mid)update(k << 1 | 1, mid + 1, r, ql, qr, v);
	push_up(k);
	return;
}

inline int query(int k, int l, int r, int x) {
	int mid = (l + r) >> 1;
	pushdown(k, l, r);
	if (Max[k << 1] >= x)return query(k << 1, l, mid, x);
	else if (Rmax[k << 1] + Lmax[k << 1 | 1] >= x)return siz[k << 1] - Rmax[k << 1] + 1;
	else if(Max[k << 1 | 1] >= x)return query(k << 1 | 1, mid + 1, r, x);
}

int main(void) {
	n = du(), m = du();

	int ins, x, y;

	build(1, 1, n);

	//cout << Max[1];
	int cnt = 0;

	for (int i = 1; i <= m; ++i) {
		ins = du();
		if (ins == 1) {
			x = du();
			if (Max[1] < x)
				ans[++cnt] = 0;
			else {
				int l = query(1, 1, n, x);
				ans[++cnt] = l;
				update(1, 1, n, l, l + x - 1, 2);
			}
		}
		if (ins == 2) {
			x = du(), y = du();
			update(1, 1, n, x, x + y - 1, 1);
		}
	}

	for (int i = 1; i <= cnt; ++i)
		cout << ans[i] << endl;

	return 0;
}
2021/7/5 17:40
加载中...