求助,TLE #8,10,悬关
查看原帖
求助,TLE #8,10,悬关
712506
Lucky_Cloud楼主2024/3/9 16:52

我想用差分实现单 log,但为什么反而挂了呢?

#include <bits/stdc++.h>
#define N 600005
#define ll unsigned long long 
using namespace std;

inline int read() {
	int res = 0; char c = getchar();
	while (c < '0' || c > '9') { c = getchar(); }
	while (c >= '0' && c <= '9') { res = (res << 1) + (res << 3) + (c ^ 48); c = getchar(); }
	return res;
}
int n, m, p[N], k, q[N], ans[N];
ll cnt[N], c[N], be[N];
struct rain {
	int l, r;
	ll a;
} ra[N];

inline void solve(int l, int r, int q[], int len) {
	if (!len) return ;
	if (l == r) {
		for (int i = 1; i <= len; ++i) ans[q[i]] = l;
		return ;
	}
	int mid = (l + r) >> 1;
	for (int i = 1; i <= mid; ++i) {
		if (ra[i].l > ra[i].r) {
			c[ra[i].l] += ra[i].a;
			c[1] += ra[i].a;
			c[ra[i].r + 1] -= ra[i].a;
		}
		else {
			c[ra[i].l] += ra[i].a;
			c[ra[i].r + 1] -= ra[i].a;
		}
	}
	for (int i = 1; i <= m; ++i) cnt[be[i]] += (c[i] += c[i - 1]), c[i - 1] = 0;
	c[m] = c[m + 1] = 0;
	int q1[len + 5] = {0}, q2[len + 5] = {0}, len1 = 0, len2 = 0;
	for (int i = 1; i <= len; ++i) {
		if (cnt[q[i]] >= p[q[i]]) q1[++len1] = q[i];
		else q2[++len2] = q[i];
	}
	for (int i = 1; i <= m; ++i) cnt[be[i]] = 0;
	c[m + 1] = 0;
	solve(l, mid, q1, len1);
	solve(mid + 1, r, q2, len2);
}

int main() {
	n = read(), m = read();
	for (int i = 1; i <= m; ++i) be[i] = read();
	for (int i = 1; i <= n; ++i) p[i] = read();
	k = read();
	for (int i = 1; i <= k; ++i) {
		int l = read(), r = read(), a = read();
		ra[i] = { l, r, a };
	}
	for (int i = 1; i <= n; ++i) q[i] = i;
	solve(1, k + 1, q, n);
	for (int i = 1; i <= n; ++i) 
		if (ans[i] != k + 1)
			cout << ans[i] << '\n';
		else cout << "NIE\n";
	return 0;
}

2024/3/9 16:52
加载中...