Submission #1186770

#TimeUsernameProblemLanguageResultExecution timeMemory
1186770UnforgettableplDiversity (CEOI21_diversity)C++20
64 / 100
290 ms29676 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int modulo = 1e9+7;

struct fenwick{
    vector<int> treePrefix,treeMulti;
    fenwick(int N):treeMulti(N+1),treePrefix(N+1){}
    void add(int k,int x){
        int m = x*k;
        while(k<treeMulti.size()){
            treeMulti[k]+=m;
            treePrefix[k]+=x;
            k+=k&-k;
        }
    }
    pair<int,int> get(int k){
        int mAns = 0;
        int pAns = 0;
        while(k){
            mAns+=treeMulti[k];
            pAns+=treePrefix[k];
            k-=k&-k;
        }
        return {mAns,pAns};
    }
    pair<int,int> get(int L,int R){
        auto rAns = get(R);
        auto lAns = get(L-1);
        int ans1 = rAns.first-lAns.first-(L-1)*(rAns.second-lAns.second);
        int ans2 = (R-L+2)*(rAns.second-lAns.second)-ans1;
        return {ans1,ans2};
    }
};

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N,Q;
    cin >> N >> Q;
    vector<int> arr(N);
    for(int&i:arr)cin>>i;
    vector<int> newarr;
    {
        int c=0;
        map<int,int> comp;
        for(int&i:arr){
            if(!comp.count(i)){
                comp[i]=c++;
                newarr.emplace_back(0);
            }
            newarr[comp[i]]++;
        }
    }
    sort(newarr.rbegin(),newarr.rend());
    int cost = 0;
    swap(arr,newarr);
    int n = arr.size();
    int t = 0;
    fenwick ans(2*N);
    int lPtr = N+1;
    int rPtr = N;
    for(int i=0;i<n;i++){
        auto [prevCost,nextCost] = ans.get(lPtr,rPtr);
        if(prevCost<nextCost){
            ans.add(--lPtr,arr[i]);
        } else {
            ans.add(++rPtr,arr[i]);
            swap(nextCost,prevCost);
        }
        cost+=prevCost*arr[i];
        cost+=t*arr[i];
        cost+=((arr[i]+1ll)*arr[i])/2ll;
        t+=arr[i];
    }
    cout << cost << '\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...