社区讨论

# 代码求调

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 条回复,欢迎继续交流。

正在加载回复...