제출 #1123566

#제출 시각아이디문제언어결과실행 시간메모리
1123566modwweDiversity (CEOI21_diversity)C++17
100 / 100
622 ms5548 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn = 3e5+5; const int B = 500; set<int> ss; int n,q,a[maxn]; int res[maxn],cnt[maxn],num[maxn]; 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(int x:ss) v.push_back(cnt[x]); sort(v.begin(),v.end()); int l=0,r=0,total=0,k=0,col=0; auto cal = [&](int x,int s,int d){ int val=(x*(x+1)*s+d*(2*x+1)*s*(s-1)/2+d*d*(s-1)*s*(2*s-1)/6)/2; total+=val; }; 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,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+=(int)v.size(); for(int x:v){ if(k) add(r,1,x),r+=x; else add(l,1,x),l+=x; k^=1; } total=col*N*(N+1)/2-total; return total; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); cin >> n >> q; for(int i=1;i<=n;i++) cin >> a[i]; int l=1,r=0; 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(),[&](array<int,3> x,array<int,3> y){ if(x[0]/B!=y[0]/B) return x[0]/B<y[0]/B; else if((x[0]/B)&1) return x[1]<y[1]; else 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...