Submission #1155592

#TimeUsernameProblemLanguageResultExecution timeMemory
1155592ace5Diversity (CEOI21_diversity)C++20
4 / 100
21 ms4164 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 300005; const int sqr = 550; const int pos1 = 150002; const int maxq = 50005; map<int,int> el; ll a[maxn]; ll neq[maxn]; ll val[maxn]; int L = 0,R = -1; struct block { block(int _l,int _r,ll _sum,ll _wsum,ll _ans){l = _l,r = _r;sum = _sum;wsum = _wsum;ans = _ans;}; block(){}; int l,r; ll sum; ll wsum; ll ans; }; block mrg(block a,block b) { block ans; ans.sum = a.sum + b.sum; ans.wsum = a.wsum + b.wsum + b.sum * (a.r-a.l+1); ans.ans = a.ans + b.ans + a.sum * (b.wsum + b.sum) + (a.sum * (a.r-a.l+1) - a.wsum) * b.sum; ans.l = a.l; ans.r = b.r; return ans; } int get_pos(int tpos,int sz) { int d = (sz-tpos)/2; return pos1 + (sz%2 == tpos%2 ? -d : d); } ll get(int l,int r) { int tl = pos1 + 1,tr = pos1; int tnum = maxn; deque<block> blocks; for(auto [me,f]:el) { int e = -me; if(f == 0) continue; tnum -= f; int lg = get_pos(tnum,maxn),rg = get_pos(tnum+1,maxn); if(lg > rg) { swap(lg,rg); } if(lg != tl) { int len = tl-lg; blocks.push_front(block(lg,tl-1,e*len,e * len * (len + 1) / 2,len * e * (e + 1) / 2 + e*e*neq[len])); } if(rg != tr) { int len = rg-tr; blocks.push_back(block(tr+1,rg,e*len,e * len * (len + 1) / 2,len * e * (e + 1) / 2 + e*e*neq[len])); } tl = lg; tr = rg; } block ans = blocks[0]; for(int j =1;j < blocks.size();++j) { ans = mrg(ans,blocks[j]); } return ans.ans; } void add(int x) { if(val[x]) el[-val[x]]--; if(el[-val[x]] == 0) el.erase(-val[x]); val[x]++; el[-val[x]]++; } void sub(int x) { el[-val[x]]--; if(el[-val[x]] == 0) el.erase(-val[x]); val[x]--; if(val[x]) el[-val[x]]++; } ll res[maxq]; struct query { query(int _l,int _r,int _i){l = _l;r = _r;i = _i;}; query(){}; int l,r,i; bool operator < (const query & oth){return (l/sqr != oth.l/sqr ? l/sqr < oth.l/sqr : r < oth.r);}; }; vector<query> ev; void go_ll() { L--; add(a[L]); } void go_lr() { sub(a[L]); L++; } void go_rr() { R++; add(a[R]); } void go_rl() { sub(a[R]); R--; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); int n,q; cin >> n >> q; block sb = block(0,0,1,1,0); neq[1] = sb.ans; for(int j = 2;j < maxn;++j) { sb = mrg(sb,block(j-1,j-1,1,1,0)); neq[j] = sb.ans; } for(int i = 0;i < n;++i) { cin >> a[i]; } for(int i = 0;i < q;++i) { int l,r; cin >> l >> r; l--; r--; ev.push_back(query(l,r,i)); } sort(ev.begin(),ev.end()); for(int i = 0;i < ev.size();++i) { int tl = ev[i].l; int tr = ev[i].r; while(L > tl) { go_ll(); } while(R < tr) { go_rr(); } while(L < tl) { go_lr(); } while(R > tr) { go_rl(); } res[ev[i].i] = get(0,maxn-1); } for(int i= 0 ;i < q;++i) { cout << res[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...