Submission #595321

#TimeUsernameProblemLanguageResultExecution timeMemory
595321LastRoninShortcut (IOI16_shortcut)C++14
31 / 100
2082 ms460 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pill pair<ll, ll>
#define mp make_pair
#define f first
#define s second
using namespace std;

const ll N = 3e5;

int n, c;
ll le[N];
ll d[N];
ll pr[N];
ll precPr[N];
ll precSuf[N];

struct seg {
	ll t[4 * N] = {0};
	ll p[4 * N] = {0};
	void push(ll v, ll tl, ll tr) {
		t[v] = t[v] + p[v];
		if(tl < tr) {
			p[v * 2] += p[v];
			p[v * 2 + 1] += p[v];
		}
	   	p[v] = 0;
	}
	void upd(ll p, ll z, ll v = 1, ll tl = 0, ll tr = n) {
		push(v, tl, tr);
		if(tl == tr) {
			t[v] = z;
			return;
		}
		ll m = (tl + tr) >> 1ll;
		if(p <= m) {
			upd(p, z, v * 2, tl, m);
			push(v * 2 + 1, m + 1, tr);	
		} else {
			upd(p, z, v * 2 + 1, m + 1, tr);
			push(v * 2, tl, m);
		}
		t[v] = max(t[v * 2], t[v * 2 + 1]);
	}
	void dob(ll l, ll r, ll z, ll v = 1, ll tl = 0, ll tr = n) {
		push(v, tl, tr);
		if(l > tr || tl > r)return;
		if(l <= tl && tr <= r) {
			p[v] += z;
			push(v, tl, tr);
			return;
		}
		ll m = (tl + tr) >> 1ll;
		dob(l, r, z, v * 2, tl, m);
		dob(l, r, z, v * 2 + 1, m + 1, tr);
		t[v] = max(t[v * 2], t[v * 2 + 1]);
	}
	ll get(ll l, ll r, ll v = 1, ll tl = 0, ll tr = n) {
	    push(v, tl, tr);
		if(l > tr || tl > r)return 0;
		if(l <= tl && tr <= r)return t[v];
		ll m = (tl + tr) >> 1ll;
		return max(get(l, r, v * 2, tl, m), get(l, r, v * 2 + 1, m + 1, tr));
	}
} rt[3];

ll calc(ll l, ll r) {
    ll sub = 0;
    for(int i = 0; i < n; i++)
    	sub = max(sub, d[i]);
	for(int i = 0; i < l; i++) {
		for(int j = i + 1; j < l; j++) {
			sub = max(sub, pr[j] - pr[i] + d[i] + d[j]);
		}
	}
	for(int i = r; i < n; i++) {
		for(int j = i + 1; j < n; j++) {
			sub = max(sub, pr[j] - pr[i] + d[i] + d[j]);
		}
	}
	for(int i = 0; i < l; i++) {
		for(int j = r + 1; j < n; j++) {
			sub = max(sub, d[i] + d[j] + pr[l] - pr[i] + pr[j] - pr[r] + min((ll)c, pr[r] - pr[l]));
		}
	}	
	for(int i = 0; i < l; i++) {
		for(int j = l; j <= r; j++) {
			ll dist = (pr[l] - pr[i]) + min(c + pr[r] - pr[j], pr[j] - pr[l]) + d[i] + d[j];
			sub = max(sub, dist);			
		}
	}
	for(int j = l; j <= r; j++) {
		for(int i = r + 1; i < n; i++) {
			ll dist = (pr[i] - pr[r]) + min(c + pr[j] - pr[l], pr[r] - pr[j]) + d[i] + d[j];
			sub = max(sub, dist);
		}
	}
	for(int i = l; i < r; i++) {
		for(int j = i + 1; j <= r; j++) {
			ll dist = min(pr[j] - pr[i], pr[i] - pr[l] + pr[r] - pr[j] + c) + d[i] + d[j];
			sub = max(sub, dist);
		}
	}
	return sub;
}

ll find_shortcut(int na, vector<int> l, vector<int> di, int C) {
	c = C;
	n = na;
	for(int i = 0; i < n - 1; i++) {
		le[i + 1] = l[i];		
	}
	pr[0] = 0;
	for(int i = 1; i < n; i++)
		pr[i] = pr[i - 1] + le[i];
	for(int i = 0; i < n; i++)
		d[i] = di[i];
	for(int i = 0; i < n; i++) {
		rt[0].upd(i, pr[i] - d[i]);
		rt[1].upd(i, pr[i] + d[i]);
	}
	ll ans = calc(0, 1);
	for(int i = 0; i < n; i++) {
		for(int j = i + 1; j < n; j++) {
			ans = min(ans, calc(i, j));		
		}
	}
    return ans;
}

Compilation message (stderr)

shortcut.cpp: In function 'long long int calc(long long int, long long int)':
shortcut.cpp:71:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   71 |     for(int i = 0; i < n; i++)
      |     ^~~
shortcut.cpp:73:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   73 |  for(int i = 0; i < l; i++) {
      |  ^~~
#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...