Submission #622370

#TimeUsernameProblemLanguageResultExecution timeMemory
622370JoshcDiversity (CEOI21_diversity)C++11
100 / 100
3676 ms6560 KiB
#include <bits/stdc++.h> using namespace std; #define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0) char _; #define ll long long int cnt[300005], a[300005], l[300005], r[300005]; ll n, out[50005]; const int SQRT = 900; ll f(ll a, ll b, ll x) { // sum((a+bi) choose 2) with x terms return x*a*a + a*b*x*(x-1) + x*(x-1)*(2*x-1)/6*b*b - (2*a+b*(x-1))*x/2; } ll val(ll start, ll sz, ll num) { // We have num blocks of size sz, starting at position start // What is the total contribution? if (!num || !sz) return 0; ll res = n*(n+1)*num; res -= f(start, sz, num); res -= f(n-(start+sz*num-1)+1, sz, num); return res/2; } bool comp(int x, int y) { int p = l[x]/SQRT, q = l[y]/SQRT; if (p != q) return p < q; return p&1 ? (r[x] < r[y]) : (r[x] > r[y]); } vector<int> s; bool included[300005]; int freq[300005], v[300005]; void add(int x) { if (freq[x] && !--v[freq[x]]) included[freq[x]] = false; v[++freq[x]]++; if (!included[freq[x]]) { included[freq[x]] = true; s.push_back(freq[x]); } } void remove(int x) { if (!--v[freq[x]]) included[freq[x]] = false; v[--freq[x]]++; if (!included[freq[x]]) { included[freq[x]] = true; s.push_back(freq[x]); } } ll solve() { ll ans = 0; int lsum = 0, rsum = 0; sort(s.begin(), s.end()); vector<int> cur; for (int sz : s) { if (!included[sz]) continue; included[sz] = false; cur.push_back(sz); int num = v[sz]; int lv = 0, rv = 0; if (lsum < rsum) { lv = num-num/2; rv = num/2; } else { rv = num-num/2; lv = num/2; } ans += val(lsum+1, sz, lv) + val(rsum+1, sz, rv); lsum += sz*lv; rsum += sz*rv; } s = cur; for (int i : s) included[i] = true; return ans; } int main() { int q, x; scan(n); scan(q); vector<int> order; for (int i=1; i<=n; i++) scan(a[i]); for (int i=1; i<=q; i++) { scan(l[i]); scan(r[i]); order.push_back(i); } sort(order.begin(), order.end(), comp); int L = 1, R = 0; for (int i : order) { while (R < r[i]) add(a[++R]); while (L > l[i]) add(a[--L]); while (R > r[i]) remove(a[R--]); while (L < l[i]) remove(a[L++]); n = R-L+1; out[i] = solve(); } for (int i=1; i<=q; i++) printf("%lld\n", out[i]); }

Compilation message (stderr)

diversity.cpp: In function 'int main()':
diversity.cpp:84:12: warning: unused variable 'x' [-Wunused-variable]
   84 |     int q, x;
      |            ^
#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...