제출 #814784

#제출 시각아이디문제언어결과실행 시간메모리
814784khshgDiversity (CEOI21_diversity)C++14
4 / 100
7054 ms468 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define ar array const int maxn = 300000, maxq = 50000, B = 300; int N, Q; int A[maxn], cnt[maxn], l[maxn + 1], r[maxn + 1]; ar<int, 3> q[maxn]; ll cur, ans[maxq]; ar<ll, maxn + 1> pref, LtoR, RtoL; void add(ar<ll, maxn + 1>& a, int i, ll val) { ++i; while(i <= maxn) { a[i] += val; i += i & -i; } } ll sum(ar<ll, maxn + 1>& a, int p) { ll ans = 0; while(p) { ans += a[p]; p -= p & -p; } return ans; } ll sum(ar<ll, maxn + 1>& a, int l, int r) { return sum(a, r + 1) - sum(a, l); } int prv(int i) { return N - i - (i > N / 2); } int nxt(int i) { return N - i - (i <= N / 2); } void add(int i) { int v = A[i]; i = r[cnt[v]]; if(l[cnt[v]] == r[cnt[v]]) { l[cnt[v]] = r[cnt[v]] = -1; } else { r[cnt[v]] = prv(i); } cur += ++cnt[v]; if(i + 1 <= N - 1) cur += sum(LtoR, i + 1, N - 1) - sum(pref, i + 1, N - 1) * i; if(0 <= i - 1) cur += sum(RtoL, 0, i - 1) - sum(pref, 0, i - 1) * (N - 1 - i); add(LtoR, i, i + 1); add(RtoL, i, N - i); add(pref, i, 1); if(l[cnt[v]] == -1) l[cnt[v]] = r[cnt[v]] = i; else l[cnt[v]] = i; } void rem(int i) { exit(1); int v = A[i]; i = l[cnt[v]]; if(l[cnt[v]] == r[cnt[v]]) { l[cnt[v]] = r[cnt[v]] = -1; } else { l[cnt[v]] = nxt(i); } cur -= cnt[v]--; if(i + 1 <= N - 1) cur -= sum(LtoR, i + 1, N - 1) - sum(pref, i + 1, N - 1) * i; if(0 <= i - 1) cur -= sum(RtoL, 0, i - 1) - sum(pref, 0, i - 1) * (N - 1 - i); add(LtoR, i, -(i + 1)); add(RtoL, i, -(N - i)); add(pref, i, -1); if(l[cnt[v]] == -1) l[cnt[v]] = r[cnt[v]] = i; else r[cnt[v]] = i; } int32_t main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> Q; l[0] = 0; r[0] = N / 2; for(int i = 0; i < N; ++i) { l[i + 1] = r[i + 1] = -1; cin >> A[i]; --A[i]; } for(int i = 0; i < Q; ++i) { for(int x : {0, 1}) { cin >> q[i][x]; --q[i][x]; } q[i][2] = i; } sort(q, q + Q, [&](const ar<int, 3>& a, const ar<int, 3>& b) { if(a[0] / B == b[0] / B) return (bool)((a[1] < b[1]) ^ ((a[0] / B) & 1)); return ((a[0] / B) < (b[0] / B)); }); for(int i = 0, L = 0, R = 0; i < Q; ++i) { int ql = q[i][0], qr = q[i][1]; while(R <= qr) add(R++); while(L < ql) rem(L++); while(L > ql) add(--L); while(R > qr + 1) rem(--R); // erkhes sussy ans[q[i][2]] = cur; } 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...