제출 #114572

#제출 시각아이디문제언어결과실행 시간메모리
114572wilwxkShortcut (IOI16_shortcut)C++11
31 / 100
2054 ms504 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=1e6+5;
ll liga[MAXN], v[MAXN];
ll dp[MAXN], rdp[MAXN];
ll aux[MAXN], raux[MAXN];
ll d[MAXN];
ll respf;
int n, x;

ll testa(int a, int b, ll tam) {
	ll val=0; if(b<a) swap(a, b);
	for(int i=a; i<=b; i++) {
		for(int j=i+1; j<=b; j++) {
			ll aa=min(d[j]-d[i], tam-d[j]+d[i]);
			aa+= (i==a) ? aux[i] : v[i];
			aa+= (j==b) ? raux[j] : v[j];
			val=max(val, aa);
			// printf("   %d %d // %d %d %lld >> %lld\n", i, j, a, b, tam, val);	
		}
	}
	return val;
}

ll find_shortcut(int N, vector<int> lll, vector<int> ddd, int X)
{
	n=N; x=X;
	for(int i=2; i<=n; i++) liga[i]=lll[i-2];
	for(int i=1; i<=n; i++) v[i]=ddd[i-1];
	for(int i=1; i<=n; i++) {
		d[i]=d[i-1]+liga[i];
		dp[i]=max(dp[i-1], aux[i-1]+liga[i]+v[i]);
		aux[i]=max(aux[i-1]+liga[i], v[i]);
	}
	for(int i=n; i>=1; i--) {
		rdp[i]=max(rdp[i+1], raux[i+1]+liga[i+1]+v[i]);
		raux[i]=max(raux[i+1]+liga[i+1], v[i]);
	}
	respf=max(dp[n], rdp[1]);
    
    for(int a=1; a<=n; a++) {
    	for(int b=a+1; b<=n; b++) {
    		ll tam=d[b]-d[a]+x;
    		ll val=max(dp[a], rdp[b]);
    		val=max(val, testa(a, b, tam));
    		// printf("testa %d %d >> %lld // dp[a e b] >> %lld %lld + %lld >> val= %lld\n", a, b, tam, dp[a], rdp[b], min(d[b]-d[a], tam-d[b]+d[a]), val);
    		respf=min(respf, val);
    	}
    }

    return respf;
}
#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...