Rt, 把数据下下来,本地测和 darkbzoj 提交都是 AC,但是到洛谷就是 WA #1~9。
有巨佬知道为什么吗
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define meow(x) cerr << #x << " = " << x
using namespace std;
using i64 = long long;
const i64 si = 5e4 + 10;
i64 n, m, unit;
i64 c[si], cnt[si];
struct Query {
i64 l, r, id;
bool operator < (const Query &b) const {
if((l / unit) != (b.l / unit))
return l < b.l;
if((l / unit) & 1)
return r < b.r;
return r > b.r;
}
}ask[si];
i64 sum = 0;
i64 nume[si], deno[si];
i64 gcd(i64 a, i64 b) {
return b ? gcd(b, a % b) : a;
}
void add(i64 pos) {
i64 now = c[pos];
sum -= (cnt[now] * (cnt[now] - 1)) / 2;
cnt[now] ++;
sum += (cnt[now] * (cnt[now] - 1)) / 2;
}
void sub(i64 pos) {
i64 now = c[pos];
sum -= (cnt[now] * (cnt[now] - 1)) / 2;
cnt[now] --;
sum += (cnt[now] * (cnt[now] - 1)) / 2;
}
int main() {
// freopen("1.in", "r", stdin);
// freopen("1.ans", "w", stdout);
cin.tie(0) -> sync_with_stdio(false);
cin.exceptions(cin.failbit | cin.badbit);
memset(cnt, 0, sizeof cnt);
cin >> n >> m, unit = sqrt(n);
for(int i = 1; i <= n; ++i)
cin >> c[i];
for(int i = 1; i <= m; ++i)
cin >> ask[i].l >> ask[i].r, ask[i].id = i;
sort(ask + 1, ask + 1 + m);
i64 l = 1, r = 0;
for(int i = 1; i <= m; ++i) {
Query &q = ask[i];
if(q.l == q.r) {
nume[q.id] = 0, deno[q.id] = 1;
continue;
}
while(l > q.l) add(--l);
while(r < q.r) add(++r);
while(l < q.l) sub(l++);
while(r > q.r) sub(r--);
nume[q.id] = sum, deno[q.id] = (r - l + 1) * (r - l) / 2;
}
for(int i = 1; i <= m; ++i) {
if(ask[i].l != ask[i].r) {
i64 com = gcd(nume[i], deno[i]);
nume[i] /= com, deno[i] /= com;
}
cout << nume[i] << "/" << deno[i] << endl;
}
return 0;
}