Submission #203368

#TimeUsernameProblemLanguageResultExecution timeMemory
203368anonymousWiring (IOI17_wiring)C++14
100 / 100
74 ms15072 KiB
#include "wiring.h"
#include<vector>
#include<utility>
#include<iostream>
#define MAXN 200005
#define LL long long
#define fi first
#define se second
#define INF (1LL<<50)
using namespace std;
vector<pair<LL,bool> > P;
LL dp[MAXN], pref[MAXN], suf[MAXN], Cost[MAXN], dp_min[MAXN];

LL get(int i) {
    if (i>=0) {return(dp_min[i]);}
    return(0);
}
LL min_total_length(std::vector<int> r, std::vector<int> b) {
	int ptR=0, ptB=0, N=r.size(), M=b.size();
	while (ptR<r.size() || ptB<b.size()) {
        if (ptR == r.size() || (ptB<b.size() && r[ptR] >= b[ptB])) {
            P.push_back({b[ptB], true});
            ptB++;
        } else {
            P.push_back({r[ptR], false});
            ptR++;
        }
	}

	int s2=0,s1=0; //indices of second and first prior swaps (if i != i+1 then s1 = i+1)
	LL cur_cost=0;
	for (int i=0; i<N+M; i++) {
        if (i && P[i].se != P[i-1].se) {
            dp_min[i]=suf[i]=INF;
            for (int j=i-1; j>=s1; j--) { //initialise costs
                Cost[j]=Cost[j+1]+P[i-1].fi-P[j].fi;
                dp_min[j]=min(dp_min[j+1], dp[j]);
            }
            if (s1) {
                pref[s1-1]=INF;
                dp_min[s1-1]=min(dp_min[s1], dp[s1-1]);
            }
            for (int j=i-1; j>=s1; j--) { //initialise suffix querys
                suf[j]=min(suf[j+1], Cost[j] + get(j-1)); //add gap cost and cur cost later
            }
            for (int j=s1; j<i; j++) {
                LL dif = i-j; //put j to i-1 to current
                pref[j]=min(j ? pref[j-1] : INF, Cost[j]+ get(j-1) + dif*(P[i].fi-P[i-1].fi)); //add cur cost later
            }
            s2 = s1;
            s1 = i;
            cur_cost=0;
        }
        cur_cost += P[i].fi - P[s1].fi;
        if (s1 == 0) {
            dp[i]=INF;
        } else {
            LL num = i-s1+1;
            dp[i]=min(suf[max(s2,i-2*(i-s1)-1)]+num*(P[s1].fi-P[s1-1].fi),
                  (i-2*(i-s1)-1)>=s2 ? pref[i-2*(i-s1)-1] : INF) + cur_cost;
        }
	}
	return(dp[N+M-1]);
}

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:20:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (ptR<r.size() || ptB<b.size()) {
         ~~~^~~~~~~~~
wiring.cpp:20:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (ptR<r.size() || ptB<b.size()) {
                         ~~~^~~~~~~~~
wiring.cpp:21:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (ptR == r.size() || (ptB<b.size() && r[ptR] >= b[ptB])) {
             ~~~~^~~~~~~~~~~
wiring.cpp:21:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (ptR == r.size() || (ptB<b.size() && r[ptR] >= b[ptB])) {
                                 ~~~^~~~~~~~~
#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...