Submission #572465

#TimeUsernameProblemLanguageResultExecution timeMemory
572465valerikkDiversity (CEOI21_diversity)C++17
18 / 100
50 ms2664 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e5 + 7; const int Q = 5e4 + 11; const int B = 500; long long solve(vector<pair<int, int>> c) { reverse(c.begin(), c.end()); int n = 0, k = 0; deque<pair<int, int>> q; int t = 0; for (const auto &[x, y] : c) { n += x * y; k += y; if (t) { q.push_back({x, (y + 1) / 2}); if (y > 1) q.push_front({x, y / 2}); } else { q.push_front({x, (y + 1) / 2}); if (y > 1) q.push_back({x, y / 2}); } t = (t + y) & 1; } long long all = n * 1ll * (n + 1) / 2 * k; long long bad = 0; long long sum = 0; for (int i = 0; i < (int) q.size(); ++i) { const auto &[x, y] = q[i]; bad += sum * sum * y; bad += sum * x * y * (y - 1); bad += sum * y; bad += x * y * (y - 1); bad += (y - 1) * y * (2 * y - 1) / 6 * x * x; sum += x * y; } sum = 0; for (int i = (int) q.size() - 1; i >= 0; --i) { const auto &[x, y] = q[i]; bad += sum * sum * y; bad += sum * x * y * (y - 1); bad += sum * y; bad += x * y * (y - 1); bad += (y - 1) * y * (2 * y - 1) / 6 * x * x; sum += x * y; } bad /= 2; long long res = all - bad; return res; } int n, q; int a[N]; int l[Q], r[Q]; int ord[Q]; struct Cnt { int cnt[N]; int scnt[N]; set<int> s; void add(int x) { if (--scnt[cnt[x]] == 0) s.erase(cnt[x]); ++cnt[x]; if (++scnt[cnt[x]] == 1) s.insert(cnt[x]); } void remove(int x) { if (--scnt[cnt[x]] == 0) s.erase(cnt[x]); --cnt[x]; if (++scnt[cnt[x]] == 1) s.insert(cnt[x]); } vector<pair<int, int>> get_cnts() { vector<pair<int, int>> res; res.reserve(s.size()); for (const auto &i : s) { if (i != 0) res.push_back({i, scnt[i]}); } assert(is_sorted(res.begin(), res.end())); return res; } Cnt() { for (int i = 0; i < N; ++i) { ++scnt[cnt[i]]; } s.insert(0); } } cnt; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> q; for (int i = 0; i < n; ++i) { cin >> a[i]; } for (int i = 0; i < q; ++i) { cin >> l[i] >> r[i]; --l[i]; } iota(ord, ord + q, 0); sort(ord, ord + q, [&] (const int &i, const int &j) { return make_pair(l[i] / B, r[i]) < make_pair(l[j] / B, r[j]); }); vector<long long> ans(q); int cl = 0, cr = 0; for (int i = 0; i < q; ++i) { while (cl > l[ord[i]]) { cnt.add(a[--cl]); } while (cr < r[ord[i]]) { cnt.add(a[cr++]); } while (cl < l[ord[i]]) { cnt.remove(a[cl++]); } while (cr > r[ord[i]]) { cnt.remove(a[--cr]); } ans[ord[i]] = solve(cnt.get_cnts()); } for (int i = 0; i < q; ++i) { cout << ans[i] << "\n"; } return 0; }
#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...