Submission #1214803

#TimeUsernameProblemLanguageResultExecution timeMemory
1214803biankDiversity (CEOI21_diversity)C++20
100 / 100
667 ms3744 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; const int B=550; const int MAX_A=3e5+9; ll solve(vector<ii> &g, int n){ int l=0; ll ret=0LL; for(const auto&[x,c]:g){ ret+=(n+1LL)*c*n; ret-=(l+1LL)*c*l; ret-=(2LL*l+1LL)*x*c*(c-1LL)/2LL; ret-=(c-1LL)*c*(2LL*c-1LL)/6LL*x*x; ret-=(n-l+1LL)*(n-l)*c; ret+=(2LL*n-2LL*l+1LL)*x*c*(c+1LL)/2LL; ret-=(c+1LL)*c*(2LL*c+1LL)/6LL*x*x; l+=x*c; } return ret/2; } struct Query{ int l,r,id; bool operator<(const Query &o){ if(l/B!=o.l/B) return l<o.l; if(l/B&1) return r>o.r; return r<o.r; } }; int tot[MAX_A],cnt[MAX_A],freq[MAX_A]; bool vis[MAX_A]; void add(int x, int d){ freq[cnt[x]]--; cnt[x]+=d; freq[cnt[x]]++; } int main(){ ios::sync_with_stdio(0); cin.tie(0); int n,q; cin>>n>>q; vi a(n); forn(i,n){ cin>>a[i]; tot[a[i]]++; } vi lol; forn(x,MAX_A){ if(tot[x]>=B) lol.pb(x); } vector<Query> v(q); forn(i,q){ int l,r; cin>>l>>r; --l,--r; v[i]={l,r,i}; } sort(all(v)); vll ret(q); int curr_l=0,curr_r=-1; for(auto[l,r,id]:v){ while(curr_l<l) add(a[curr_l++],-1); while(curr_r>r) add(a[curr_r--],-1); while(curr_l>l) add(a[--curr_l],1); while(curr_r<r) add(a[++curr_r],1); vector<ii> vec[2]; bool flag=true; vi active; forsn(i,1,B) if(freq[i]) active.pb(i); for(int x:lol){ if(!vis[cnt[x]]&&cnt[x]>=B){ active.pb(cnt[x]); vis[cnt[x]]=true; } } sort(all(active),greater<int>()); for(int x:active){ int c=freq[x]; vec[flag].eb(x,c-c/2); vec[!flag].eb(x,c/2); flag^=c%2==1; } for(int x:lol) vis[cnt[x]]=false; reverse(all(vec[0])); vec[0].insert(end(vec[0]),all(vec[1])); ret[id]=solve(vec[0],r-l+1); } forn(i,q) cout<<ret[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...