社区讨论

为何此份代码会在一些数据下 MLE

P2345[USACO04OPEN] MooFest G参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo7xgyv4
此快照首次捕获于
2023/10/27 09:21
2 年前
此快照最后确认于
2023/10/27 09:21
2 年前
查看原帖
rt
自己算着应该不会超空间,当然本人很弱,可能发现不了一些错误,如有,望指出。
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5;
int n, cnt[N << 2], sum[N << 2], ans, mxx;
struct node {int v, x;}a[N];
bool cmp (node aa, node bb) {return aa.v < bb.v;}
int ls (int k) {return k << 1;}
int rs (int k) {return k << 1 | 1;}
void pushup1 (int k) {sum[k] = sum[ls(k)] + sum[rs(k)];}
void pushup2 (int k) {cnt[k] = cnt[ls(k)] + cnt[rs(k)];}
void modify1 (int now, int val, int l, int r, int k) {
	if (l == r) {sum[k] += val; return ;}
	int mid = (l + r) >> 1;
	if (now <= mid) modify1(now, val, l, mid, ls(k));
	if (now >  mid) modify1(now, val, mid + 1, r, rs(k));
	pushup1 (k);
}
void modify2 (int now, int l, int r, int k) {
	if (l == r) {cnt[k] += 1; return ;}
	int mid = (l + r) >> 1;
	if (now <= mid) modify2(now, l, mid, ls(k));
	if (now >  mid) modify2(now, mid + 1, r, rs(k));
	pushup2 (k);
}
int query1 (int L, int R, int l, int r, int k) {
	if (L <= l and r <= R) return sum[k];
	int mid = (l + r) >> 1, ans = 0;
	if (L <= mid) ans += query1(L, R, l, mid, ls(k));
	if (R >  mid) ans += query1(L, R, mid + 1, r, rs(k));
	return ans;
}
int query2 (int L, int R, int l, int r, int k) {
	if (L <= l and r <= R) return cnt[k];
	int mid = (l + r) >> 1, ans = 0;
	if (L <= mid) ans += query2(L, R, l, mid, ls(k));
	if (R >  mid) ans += query2(L, R, mid + 1, r, rs(k));
	return ans;
}
signed main () {
	scanf ("%lld", &n);
	for (int i = 1; i <= n; ++ i) scanf ("%lld%lld", &a[i].v, &a[i].x), mxx = max(mxx, a[i].x);
	sort (a + 1, a + 1 + n, cmp);
	modify1(a[1].x, a[1].x, 1, n, 1);
	modify2(a[1].x, 1, n, 1);
	for (int i = 2, tot = 0; i <= n; ++ i, tot = 0) {
		if (a[i].x > 1) tot += a[i].v * (a[i].x * query2(1, a[i].x - 1, 1, n, 1) - query1(1, a[i].x - 1, 1, n, 1));
		if (a[i].x < mxx) tot += a[i].v * (query1(a[i].x + 1, mxx, 1, n, 1) - a[i].x * query2(a[i].x + 1, mxx, 1, n, 1));
		ans += tot; modify1 (a[i].x, a[i].x, 1, n, 1); modify2 (a[i].x, 1, n, 1);
	}
	printf ("%lld\n", ans);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...