Submission #1236881

#TimeUsernameProblemLanguageResultExecution timeMemory
1236881erering전선 연결 (IOI17_wiring)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
#include "wiring.h"
using namespace std;
#define pb push_back
#define ll long long
ll pref[200005];
vector<pair<int,int>> vec;
ll score(int l1,int r1,int l2,int r2){
    ll ans=0;
    if(r2-l2>r1-l1){
        ans+=pref[r2]-(l2>0?pref[l2-1]:0)-vec[r1].first*(r2-l2+1);
        ans+=vec[r1].first*(r1-l1+1)-(pref[r1]-(l1>0?pref[l1-1]:0));
    }
    else{
        ans+=vec[l2].first*(r1-l1+1)-(pref[r1]-(l1>0?pref[l1-1]:0));
        ans+=pref[r2]-(l2>0?pref[l2-1]:0)-vec[l2].first*(r2-l2+1);
    }
    return ans;
}
long long min_total_length(std::vector<int> r, std::vector<int> b) {
    for(int i=0;i<r.size();i++)vec.pb({r[i],0});
    for(int i=0;i<b.size();i++)vec.pb({b[i],1});
    sort(vec.begin(),vec.end());
    const ll N=vec.size(),inf=2e18;
    int cont[N];
    cont[0]=1; pref[0]=vec[0].first;
    for(int i=1;i<N;i++){
        pref[i]=vec[i].first+pref[i-1];
        if(vec[i].second==vec[i-1].second)cont[i]=cont[i-1]+1;
        else cont[i]=1;
    }
    ll dp[N];
    int l=-1;
   // cout<<score(6,6,7,8)<<endl;
    for(int i=0;i<N;i++){
        if(cont[i]==i+1){
            dp[i]=inf;
            continue;
        }
        if(l==-1 || vec[i].second!=vec[i-1].second)l=i-1;
        while(l>0 && vec[l].second==vec[l-1].second && (l-2>=0?dp[l-2]:0)+score(l-1,i-cont[i],i-cont[i]+1,i)<dp[l-1]+score(l,i-cont[i],i-cont[i]+1,i))l--;
        dp[i]=score(l,i-cont[i],i-cont[i]+1,i)+(l>0?dp[l-1]:0);
      //  if(i==5)cout<<l<<' '<<i-cont[i]<<' '<<i-cont[i]+1<<' '<<i<<' '<<dp[l-1]<<endl;
    }
    return dp[N-1];
}
#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...