Rt 无语死了
据此贴,树状数组大小应该没问题
#include <stdio.h>
#include <algorithm>
using namespace std;
const int S = 1e6 + 5;
const long long MOD = 92084931;
typedef long long LL;
struct N {
LL v, id;
} s[S];
int n, m;
LL a[S], sum[S], b[S], c[S];
LL ans;
bool cmp(N a, N b) {
if (a.v != b.v) {
return a.v < b.v;
} else {
return a.id < b.id;
}
}
LL lowbit(LL x) {
return x & (-x);
}
void update(LL x) {
for ( ; x <= n; x += lowbit(x)) {
c[x] = c[x] + 1;
}
}
LL query(LL x) {
LL ret = 0;
for ( ; x; x -= lowbit(x)) {
ret = c[x] + ret;
}
return ret;
}
int main() {
freopen("vudu6.in", "r", stdin);
freopen("vudu6.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
a[i] -= m;
sum[i] = sum[i - 1] + a[i];
s[i].v = sum[i];
s[i].id = i;
}
scanf("%d", &m);
for (int i = 1; i <= n; i++) {
a[i] -= m;
sum[i] = sum[i - 1] + a[i];
s[i].v = sum[i];
s[i].id = i;
}
s[0].v = 0;
s[0].id = 0;
sort(s, s + n + 1, cmp);
int cnt = 1;
for (int i = 0; i <= n; i++) {
if (i == 0) {
b[s[i].id + 1] = cnt;
} else {
if (s[i].v != s[i - 1].v) {
cnt++;
}
b[s[i].id + 1] = cnt;
}
}
for (int i = 1; i <= n + 1; i++) {
LL t = query(b[i]);
ans = ans + t;
update(b[i]);
}
printf("%lld", ans);
return 0;
}
在这里找到了错误的输入:https://git.sb/baoshuo/OI-codes/-/blob/master/Luogu/P7868/data/vudu6.in
答案输出:
130398164426
我的输出:
130398164423
求大佬救救