社区讨论
为何此份代码会在一些数据下 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 条回复,欢迎继续交流。
正在加载回复...