Submission #1329459

#TimeUsernameProblemLanguageResultExecution timeMemory
1329459Faisal_SaqibSimfonija (COCI19_simfonija)C++20
0 / 110
54 ms8144 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <cmath>
#include <set>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
#define int ll
int k;
int solve(vector<int> p,vector<int> n)
{
    if(p.size()==0)
    {
        return 1e18;
    }
    sort(begin(p),end(p));
    sort(begin(n),end(n));
    multiset<ll> curn,curp;
    int sz=p.size();
    int sz1=n.size();
    for(int i=0;i<k and i<sz1;i++)
    {
        curn.insert(p[sz-1]-n[i]);
    }
    for(int i=0;i<k-sz1;i++)
    {
        curn.insert(p[sz-1]-p[i]);
    }
    // return 0;
    ll dif=0;
    int sm=0,smn=0,sm1=0;
    int lsc=0,smg=0,grc=0;
    for(auto x:curn)sm+=x;
    for(auto x:n)smn+=x,lsc++;
    for(auto x:p)smn+=x,lsc++;
    int mi=0;
    for(auto x:p)mi+=abs(x);
    for(auto x:n)mi+=abs(x);

    int j=sz-1;
    for(int i=sz-1;i>=0;i--)
    {
        ll cur=lsc*p[i]-smn+smg - p[i]*grc;
        while(j>i and curn.size()>0 and (*begin(curn))+(p[i]-p[sz-1])<(p[j]-p[i]))
        {
            sm-=(*begin(curn));
            curn.erase(curn.begin());
            curp.insert(p[j]-p[i]);
            sm1+=(p[j]-p[i]);
            j--;
        }
        cur-=(sm+(p[i]-p[sz-1])*curn.size())+sm1;
        // if(cur==-1)
        // {
        //     cout<<"Fudge "<<endl;
        //     cout<<sm<<' '<<sm1<<endl;
        //     cout<<p[i]<<' '<<i<<' '<<j<<endl;
        //     for(auto x:curn)
        //         cout<<x<<' ';
        //     cout<<endl;
        //     for(auto x:curp)
        //         cout<<x<<' ';
        //     cout<<endl;
        // }
        if(i>0){
            // sm-=(p[i]-p[i-1])*(curn.size());
            sm1+=(p[i]-p[i-1])*(curp.size());
        }
        lsc--;
        smn-=p[i];

        grc++;
        smg+=p[i];
        mi=min(mi,cur);
    }
    return mi;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n>>k;
    vector<int> a(n),b(n);
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i],b[i]-=a[i];
    vector<int> neg,pos;
    for(auto x:b)
    {
        if(x<0)
        {
            neg.push_back(x);
        }
        else
        {
            pos.push_back(x);
        }
    }
    int cur=solve(pos,neg);
    swap(pos,neg);
    for(auto&x:pos)x*=-1;
    for(auto&x:neg)x*=-1;
    cur=min(cur,solve(neg,pos));
    cout<<cur<<endl;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...