Submission #1169145

#TimeUsernameProblemLanguageResultExecution timeMemory
1169145AlgorithmWarriorWiring (IOI17_wiring)C++20
100 / 100
50 ms8128 KiB
#include "wiring.h"
#include <bits/stdc++.h>

using namespace std;

int const MAX=2e5+5;
long long const INF=1e18;

struct dot{
    int poz,type;
    long long dp,minpref,minsuf;
    bool operator<(dot ot){
        return poz<ot.poz;
    }
}v[MAX];

long long min_total_length(vector<int>r,vector<int>b) {
    int n=r.size();
    int m=b.size();
    int i;
    for(i=1;i<=n;++i){
        v[i].poz=r[i-1];
        v[i].type=1;
    }
    for(i=1;i<=m;++i){
        v[n+i].poz=b[i-1];
        v[n+i].type=2;
    }
    sort(v+1,v+n+m+1);
    int ult=-1;
    for(i=1;i<=n+m;++i){
        int j=i;
        while(v[j].type==v[j+1].type)
            ++j;
        int id;
        if(ult==-1){
            for(id=i;id<=j;++id)
                v[id].dp=INF;
        }
        else{
            long long sum=0;
            for(id=i;id<=j;++id){
                sum+=v[id].poz-v[i].poz;
                if(id-i+1>=ult)
                    v[id].dp=sum+1LL*(id-i+1)*(v[i].poz-v[i-1].poz)+v[i-ult].minsuf;
                else
                    v[id].dp=sum+min(1LL*(id-i+1)*(v[i].poz-v[i-1].poz)+v[2*i-id-1].minsuf,v[2*i-id-2].minpref);
            }
        }
        for(id=j-1;id>=i-1;--id)
            v[id].dp=min(v[id].dp,v[id+1].dp);
        long long sum=0;
        for(id=j;id>=i;--id){
            sum+=v[j].poz-v[id].poz;
            v[id].minsuf=v[id-1].dp+sum;
            v[id].minpref=v[id-1].dp+sum+1LL*(j-id+1)*(v[j+1].poz-v[j].poz);
        }
        for(id=i+1;id<=j;++id)
            v[id].minpref=min(v[id].minpref,v[id-1].minpref);
        for(id=j-1;id>=i;--id)
            v[id].minsuf=min(v[id].minsuf,v[id+1].minsuf);
        ult=j-i+1;
        i=j;
    }
    return v[n+m].dp;
}
#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...