求助,整体二分……
查看原帖
求助,整体二分……
392727
rsdbk_husky楼主2021/8/3 21:18

样例无法通过,全部输出30519

#include<cstdio>
#include<unistd.h>
#define re register
const int MAXn = 2e5;
const int MAXm = 2e5;
const int MAXai = 1e9;

template <class T>
inline void read(T &a) {
	register char c;while (c = getchar(), (c < '0' || c > '9') && c != '-');register bool f = c == '-';register T x = f ? 0 : c - '0';while (c = getchar(), c >= '0' && c <= '9') {x = (x << 3) + (x << 1) + c - '0';}a = f ? -x : x;
}

int top, t[MAXn + 10];
#define lowbit(x) ((x) & (-(x)))
void BuildUseSum(int *sum) {
	for (re int i = 1; i <= top; ++i) {
		t[i] = sum[i] - sum[i - lowbit(i)];
	}
}
void Add(int p, int v) {
	while (p <= top) {
		t[p] += v;
		p += lowbit(p);
	}
}
int EvaSum(int p) {
	int ans = 0;
	while (p) {
		ans += t[p];
		p -= lowbit(p);
	}
	return ans;
}

int n, m, cnt, cnt1, cnt2, ans[MAXm + 10];
struct Ele {
	int idx, v, l, r, opt;
	Ele(): idx(0), v(0), l(0), r(0), opt(0) {}
	Ele(int idx_, int v_, int l_, int r_, int opt_): 
		idx(idx_), v(v_), l(l_), r(r_), opt(opt_) {}
}a[MAXn + MAXm + 10], a1[MAXn + MAXm + 10], a2[MAXn + MAXm + 10];
void Div(int L, int R, int l, int r) {
	// sleep(0.5);
	// printf ("Div(%d, %d, %d, %d)\n", L, R, l, r);
	if (l > r) return;
	if (L == R) {
		for (re int i = l; i <= r; ++i) {
			if (a[i].opt) {
				ans[a[i].idx] = L;
			}
		}
	} else {
		int mid = (L + R) >> 1;
		cnt1 = cnt2 = 0;
		for (re int i = l; i <= r; ++i) {
			if (!a[i].opt) {
				if (a[i].v <= mid) {
					a1[++cnt1] = a[i];
					Add(a[i].idx, 1);
				} else {
					a2[++cnt2] = a[i];
				}
			} else {
				int x = EvaSum(a[i].r) - EvaSum(a[i].l - 1);
				if (a[i].v <= x) {
					a1[++cnt1] = a[i];
				} else {
					a[i].v -= x;
					a2[++cnt2] = a[i];
				}
			}
		}
		for (re int i = 1; i <= cnt1; ++i) {
			if (!a1[i].opt) {
				Add(a1[i].idx, -1);
			}
		}	
		for (re int i = 1; i <= cnt1; ++i) {
			a[l + i - 1] = a1[i];
		}
		for (re int i = 1; i <= cnt2; ++i) {
			a[l + cnt1 + i - 1] = a2[i];
		}
		Div(L, mid, l, l + cnt1 - 1);
		Div(mid + 1, R, l + cnt1, r);
	}
}


int main() {
	read(n), read(m);
	top = n;
	for (re int i = 1, v; i <= n; ++i) {
		read(v);
		a[++cnt] = Ele(i, v, 0, 0, 0);
	}
	for (re int i = 1, l, r, k; i <= m; ++i) {
		read(l), read(r), read(k);
		a[++cnt] = Ele(i, k, l, r, 1);
	}
	Div(-MAXai, MAXai, 1, cnt);
	for (re int i = 1; i <= m; ++i) {
		printf("%d\n", ans[i]);
	}
}
2021/8/3 21:18
加载中...