Submission #1144312

#TimeUsernameProblemLanguageResultExecution timeMemory
1144312mnbvcxz123Diversity (CEOI21_diversity)C++20
64 / 100
363 ms4680 KiB
#include<bits/stdc++.h> using namespace std; using ll=long long; #define int ll constexpr int NAX=3e5+5; constexpr int B=500; set<int>ss; int n,q,a[NAX]; int res[NAX],cnt[NAX],num[NAX]; void add(int x){ num[cnt[x]]--; num[++cnt[x]]++; if(cnt[x]==B)ss.insert(x); } void del(int x){ if(cnt[x]==B)ss.erase(x); num[cnt[x]--]--; num[cnt[x]]++; } int get(int N){ vector<int>v; for(const int&x:ss)v.push_back(cnt[x]); sort(v.begin(),v.end()); int l=0,r=0,tot=0,k=0,col=0; auto cal=[&](int x, int s, int d){ tot+=(x*(x+1)*s+d*(2*x+1)*s*(s-1)/2+d*d*(s-1)*s*(2*s-1)/6)/2; }; auto add=[&](int x, int s, int d){ cal(x,s,d); cal(N-x-s*d,s,d); }; for(int i=1;i<B;++i){ col+=num[i]; if(!num[i])continue; int x=(num[i]+1)/2; int y=num[i]/2; if(k)swap(x,y); add(l,x,i); add(r,y,i); l+=x*i; r+=y*i; k^=(num[i]&1); } col+=v.size(); for(const int&x:v){ if(k)add(r,1,x),r+=x; else add(l,1,x),l+=x; k^=1; } tot=col*N*(N+1ll)/2ll-tot; return tot; } mt19937 rng(time(nullptr)); int32_t main(){ cin>>n>>q; for(int i=1;i<=n;++i)cin>>a[i]; vector<array<int,3>>qq(q); for(int i=0;i<q;++i){ cin>>qq[i][0]>>qq[i][1]; qq[i][2]=i; } sort(qq.begin(),qq.end(),[&](const auto&x,const auto&y){ if(x[0]/B!=y[0]/B)return x[0]<y[0]; if(rng()&1)return x[1]>y[1]; return x[1]<y[1]; }); int L=1,R=0; for(auto[l,r,id]:qq){ while(R<r)add(a[++R]); while(L>l)add(a[--L]); while(R>r)del(a[R--]); while(L<l)del(a[L++]); res[id]=get(r-l+1); } for(int i=0;i<q;++i) cout<<res[i]<<'\n'; }
#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...