Submission #1084179

#TimeUsernameProblemLanguageResultExecution timeMemory
1084179onlk97Diversity (CEOI21_diversity)C++14
100 / 100
1486 ms6228 KiB
#include <bits/stdc++.h>
using namespace std;
int L,R;
int a[300010];
long long freq[300010],freq2[300010];
bitset <300010> have;
long long calcans(){
    long long ans=0,lps=0,rps=0,s=R-L+1;
    for (int i=have._Find_first(); i<300010; i=have._Find_next(i)){
        long long cntl,cntr;
        int f;
        if (lps<=rps){
            f=min(freq2[i],(rps-lps)/i+1);
            cntl=f+(freq2[i]-f)/2,cntr=(freq2[i]-f+1)/2;
        } else {
            f=min(freq2[i],(lps-rps)/i+1);
            cntl=(freq2[i]-f+1)/2,cntr=f+(freq2[i]-f)/2;
        }
        ans+=cntl*lps*lps+cntl*(cntl+1)*lps*i+cntl*(cntl+1)/2*(2*cntl+1)/3*i*i;
        ans-=s*(lps+i+lps+i*cntl)*cntl/2;
        lps+=cntl*i;
        long long t=s-rps;
        ans+=cntr*t*t-cntr*(cntr-1)*t*i+(cntr)*(cntr-1)/2*(2*cntr-1)/3*i*i;
        ans-=s*(t+t-(cntr-1)*i)*cntr/2;
        rps+=cntr*i;
    }
    return s*(s+1)/2-ans;
}
const int BLOCK=800;
bool cmp(pair <pair <int,int>,int> a,pair <pair <int,int>,int> b){
    int ax=a.first.first/BLOCK,bx=b.first.first/BLOCK;
    if (ax!=bx) return ax<bx;
    return a.first.second<b.first.second;
}
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n,q;
    cin>>n>>q;
    for (int i=1; i<=n; i++) cin>>a[i];
    pair <pair <int,int>,int> qu[q+1];
    for (int i=1; i<=q; i++){
        cin>>qu[i].first.first>>qu[i].first.second;
        qu[i].second=i;
    }
    sort(qu+1,qu+q+1,cmp);
    L=1; R=0;
    long long op[q+1];
    for (int i=1; i<=q; i++){
        while (R<qu[i].first.second){
            R++;
            if (freq[a[R]]){
                freq2[freq[a[R]]]--;
                if (!freq2[freq[a[R]]]) have[freq[a[R]]]=0;
            }
            freq[a[R]]++;
            if (!freq2[freq[a[R]]]) have[freq[a[R]]]=1;
            freq2[freq[a[R]]]++;
        }
        while (L>qu[i].first.first){
            L--;
            if (freq[a[L]]){
                freq2[freq[a[L]]]--;
                if (!freq2[freq[a[L]]]) have[freq[a[L]]]=0;
            }
            freq[a[L]]++;
            if (!freq2[freq[a[L]]]) have[freq[a[L]]]=1;
            freq2[freq[a[L]]]++;
        }
        while (R>qu[i].first.second){
            freq2[freq[a[R]]]--;
            if (!freq2[freq[a[R]]]) have[freq[a[R]]]=0;
            freq[a[R]]--;
            if (freq[a[R]]&&!freq2[freq[a[R]]]) have[freq[a[R]]]=1;
            freq2[freq[a[R]]]++;
            R--;
        }
        while (L<qu[i].first.first){
            freq2[freq[a[L]]]--;
            if (!freq2[freq[a[L]]]) have[freq[a[L]]]=0;
            freq[a[L]]--;
            if (freq[a[L]]&&!freq2[freq[a[L]]]) have[freq[a[L]]]=1;
            freq2[freq[a[L]]]++;
            L++;
        }
        op[qu[i].second]=calcans();
    }
    for (int i=1; i<=q; i++) cout<<op[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...