社区讨论
# 代码求调
P1494[国家集训队] 小 Z 的袜子参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjd98ue
- 此快照首次捕获于
- 2025/11/04 00:40 4 个月前
- 此快照最后确认于
- 2025/11/04 00:40 4 个月前
抄老师的板子结果样例都没过不知道为什么……
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 50100;
ll tmp, ans[N], ans2[N];
int n, q, c[N], cnt[N];
array<int, 3> que[N];
ll gcd(ll a, ll b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
}
for (int i = 0; i < q; i++) {
int l, r;
scanf("%d%d", &l, &r);
que[i] = {l, r, i};
ans2[i] = (ll)(r - l) * (r - l + 1) / 2;
}
int B = 500;
sort(que, que + q, [&](array<int, 3> a, array<int, 3> b) {
if (a[0] / B != b[0] / B) return a[0] / B < b[0] / B;
return a[1] < b[1];
});
int l = 1, r = 0;
auto add = [&] (int x) {
tmp += cnt[c[x]];
cnt[c[x]]++;
};
auto del = [&] (int x) {
cnt[c[x]]--;
tmp -= cnt[c[x]];
};
for (int i = 0; i < q; i++) {
while (r < que[i][0]) r++, add(r);
while (l > que[i][0]) l--, add(l);
while (r > que[i][0]) del(r), r--;
while (l < que[i][0]) del(l), l++;
ans[que[i][2]] = tmp;
}
for (int i = 0; i < q; i++) {
ll d = gcd(ans[i], ans2[i]);
printf("%lld/%lld\n", ans[i] / d, ans2[i] / d);
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...