整体二分WA+TLE求调,玄关
查看原帖
整体二分WA+TLE求调,玄关
1023865
xuezhiyu楼主2025/1/8 13:51
#include <iostream>

using namespace std;

struct opt {
	int l, r, val;
};

struct country {
	int p, id;
};

constexpr int N = 3e5 + 10;
opt q[N];
bool unable[N];
country a[N], a1[N], a2[N];
int n, m, k, h[N], e[N], ne[N], idx, c[N], ans[N];

void update(int k, int x) {
	while (k < N) {
		c[k] += x;
		k += (k & -k);
	}
}

int getsum(int k) {
	int res = 0;
	while (k) {
		res += c[k];
		k -= (k & -k);
	}
	return res;
}

void push(int u, int val) {
	++idx;
	e[idx] = val;
	ne[idx] = h[u];
	h[u] = idx;
}

void solve(int l, int r, int L, int R) {
	if (l > r || L > R) return;
	if (l == r) {
		for (int i = L; i <= R; i++) ans[a[i].id] = l;
		return;
	}
	int mid = (l + r) >> 1, c1 = 0, c2 = 0;
	for (int i = l; i <= mid; i++) {
		if (q[i].l <= q[i].r) update(q[i].l, q[i].val), update(q[i].r + 1, -q[i].val);
		else update(q[i].l, q[i].val), update(m + 1, -q[i].val), update(1, q[i].val), update(q[i].r + 1, -q[i].val);
	}
	for (int i = L; i <= R; i++) {
		int cnt = 0;
		for (int j = h[a[i].id]; j; j = ne[j]) cnt += getsum(e[j]);
		if (a[i].p <= cnt) a1[++c1] = a[i];
		else a[i].p -= cnt, a2[++c2] = a[i];
	}
	for (int i = 1; i <= mid; i++) {
		if (q[i].l <= q[i].r) update(q[i].l, -q[i].val), update(q[i].r + 1, q[i].val);
		else update(q[i].l, -q[i].val), update(m + 1, q[i].val), update(1, -q[i].val), update(q[i].r + 1, q[i].val);
	}
	for (int i = 1; i <= c1; i++) a[L + i - 1] = a1[i];
	for (int i = 1; i <= c2; i++) a[L + c1 + i - 1] = a2[i];
	solve(l, mid, L, L + c1 - 1);
	solve(mid + 1, r, L + c1, R);
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int t;
		cin >> t;
		push(t, i);
	}
	for (int i = 1; i <= n; i++) cin >> a[i].p, a[i].id = i;
	cin >> k;
	for (int i = 1; i <= k; i++) {
		cin >> q[i].l >> q[i].r >> q[i].val;
		if (q[i].l <= q[i].r) update(q[i].l, q[i].val), update(q[i].r + 1, -q[i].val);
		else update(q[i].l, q[i].val), update(m + 1, -q[i].val), update(1, q[i].val), update(q[i].r + 1, -q[i].val);
	}
	for (int i = 1; i <= n; i++) {
		int cnt = 0;
		for (int j = h[i]; j; j = ne[j]) cnt += getsum(e[j]);
		unable[i] = cnt < a[i].p;
	}
	for (int i = 1; i <= k; i++) {
		if (q[i].l <= q[i].r) update(q[i].l, -q[i].val), update(q[i].r + 1, q[i].val);
		else update(q[i].l, -q[i].val), update(m + 1, q[i].val), update(1, -q[i].val), update(q[i].r + 1, q[i].val);
	}
	solve(1, k, 1, n);
	for (int i = 1; i <= n; i++) {
		if (unable[i]) cout << "NIE" << '\n';
		else cout << ans[i] << '\n';
	}
	return 0;
}

2025/1/8 13:51
加载中...