Submission #1244371

#TimeUsernameProblemLanguageResultExecution timeMemory
1244371Double_SlashDiversity (CEOI21_diversity)C++20
18 / 100
58 ms6236 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define all(x) x.begin(), x.end()
using pint = pair<int, int>;

const int SQRT = 547, MAX = 3e5;

int main() {
    int n, q;
    cin >> n >> q;
    int a[n];
    for (int &ai: a) cin >> ai;
    vector<array<int, 3>> qu(q);
    for (int i = q; i--;) {
        cin >> qu[i][0] >> qu[i][1];
        --qu[i][0], --qu[i][1];
        qu[i][2] = i;
    }
    sort(all(qu), [&] (auto &a, auto &b) { return a[0] / SQRT == b[0] / SQRT ? a[1] < b[1] : a[0] < b[0]; });
    int l = 0, r = -1, freq[MAX + 1]{n + 1}, ffreq[MAX + 1]{};
    vector<int> nxt(MAX + 1, -1), pre(MAX + 1, -1);
    auto p = [&] (int i, int j) {
        if (~i) nxt[i] = j;
        if (~j) pre[j] = i;
    };
    auto add = [&] (int i) {
        if (not ffreq[++freq[i = a[i]]]++) {
            p(freq[i], nxt[freq[i] - 1]);
            p(freq[i] - 1, freq[i]);
        }
        if (not --ffreq[freq[i] - 1]) p(pre[freq[i] - 1], freq[i]);
    };
    auto rem = [&] (int i) {
        if (not ffreq[--freq[i = a[i]]]++) {
            p(pre[freq[i] + 1], freq[i]);
            p(freq[i], freq[i] + 1);
        }
        if (not --ffreq[freq[i] + 1]) p(freq[i], nxt[freq[i] + 1]);
    };
    vector<ll> ans(q);
    ll squares[MAX + 1]{};
    for (int i = 1; i <= n; ++i) squares[i] = squares[i - 1] + (ll) i * (i + 1) / 2;
    for (auto &[li, ri, i]: qu) {
        while (r < ri) add(++r);
        while (r > ri) rem(r--);
        while (l > li) add(--l);
        while (l < li) rem(l++);
        vector<pint> raw, lhs, rhs;
        bool b = false;
        for (int f = 0; ~(f = nxt[f]);) raw.emplace_back(f, ffreq[f]);
        for (int j = raw.size(); j--;) {
            (b ? lhs : rhs).emplace_back(raw[j].first, (raw[j].second + 1) / 2);
            (b ? rhs : lhs).emplace_back(raw[j].first, raw[j].second / 2);
            b ^= raw[j].second & 1;
        }
        reverse(all(lhs));
        lhs.insert(lhs.end(), all(rhs));
        ll iw = 0;
        int sum = 0;
        for (auto &[f, cnt]: lhs) {
            if (not cnt) continue;
            ans[i] += (iw * cnt + sum * (ll) cnt * (cnt + 1) / 2) * f;
            if (cnt > 1) ans[i] += (ll) (cnt + 2) * (cnt - 1) / 2 * f * f;
            ans[i] += (ll) f * (f + 1) / 2 * cnt;
            iw += (ll) sum * cnt + (ll) f * cnt * (cnt + 1) / 2;
            sum += f * cnt;
        }
    }
    for (int i = q; i--;) cout << ans[i] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...