玄关求调,样例不过555
查看原帖
玄关求调,样例不过555
1036180
ChampionCyan楼主2024/7/27 11:35
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e4 + 5;
int a[MAXN], pos[MAXN], cnt[MAXN];
long long ans[MAXN];
long long res;


struct Q {
    int l, r, k;
} q[MAXN];

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

inline void print(long long x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}

int n = read(), m = read(), k = read();

inline void add(int) {
    cnt[a[n]]++;
    res += cnt[a[n]] * cnt[a[n]] - (cnt[a[n]] - 1) * (cnt[a[n]] - 1);
}

inline void sub(int) {
    cnt[a[n]]--;
    res -= ((cnt[a[n]] + 1) * (cnt[a[n]] + 1)) - (cnt[a[n]] * cnt[a[n]]);
}

inline bool cmp(const Q &x, const Q &y) {
    return pos[x.l] == pos[y.l] ? x.r < y.r : pos[x.l] < pos[y.l];
}

int main() {
    int siz = sqrt(n);
    for (int i = 1; i <= n; i++) {
        a[i] = read();
        pos[i] = i / siz;
    }
    for (int i = 0; i < m; i++) {
        q[i].l = read(), q[i].r = read();
        q[i].k = i;
    }
    sort(q, q + m, cmp);
    int l = 1, r = 0;
    for (int i = 0; i < m; i++) {
        while (q[i].l < l)
            add(--l);
        while (q[i].r > r)
            add(++r);
        while (q[i].l > l)
            sub[l++];
        while (q[i].r < r)
            sub(r--);
        ans[q[i].k] = res;
    }
    for (int i = 0; i < m; i++)
        print(ans[i]), putchar('\n');
    return 0;
}
2024/7/27 11:35
加载中...