Submission #652596

#TimeUsernameProblemLanguageResultExecution timeMemory
652596jamezzzShortcut (IOI16_shortcut)C++17
100 / 100
1691 ms53584 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
#define fi first
#define se second
#define pf printf
#define pb push_back
#define all(x) x.begin(),x.end()
#define LINF 1023456789123456789

#define maxn 1000005

int n,c;
vector<int> d;
ll x[maxn];

bool pos(ll k){
	ll mnsm=-LINF,mxsm=LINF,mndf=-LINF,mxdf=LINF,add=0,sub=LINF;
	bool have=false;
	deque<int> dq;
	for(int i=0;i<n;++i){
		while(!dq.empty()&&x[i]-x[dq.front()]+d[i]+d[dq.front()]>k){
			int j=dq.front();dq.pop_front();
			add=max(add,x[j]+d[j]);
			sub=min(sub,x[j]-d[j]);
			have=true;
		}
		if(have){
			mxsm=min(mxsm,x[i]-d[i]+sub+k-c);
			mnsm=max(mnsm,x[i]+d[i]+add-k+c);
			mxdf=min(mxdf,x[i]-d[i]-add+k-c);
			mndf=max(mndf,x[i]+d[i]-sub-k+c);
		}
		while(!dq.empty()&&x[i]-d[i]<x[dq.back()]-d[dq.back()]){
			dq.pop_back();
		}
		dq.push_back(i);
	}
	if(mxsm<mnsm||mxdf<mndf)return false;
	int l1=n,r1=n-1,l2=0,r2=-1;
	for(int i=0;i<n;++i){
		while(l1!=0&&mnsm<=x[i]+x[l1-1])--l1;
		while(r1!=-1&&mxsm<x[i]+x[r1])--r1;
		while(l2!=n&&mxdf<x[i]-x[l2])++l2;
		while(r2!=n-1&&mndf<=x[i]-x[r2+1])++r2;
		if(max(l1,l2)<=min(r1,r2)&&max(l1,l2)<=i)return true;
	}
	return false;
}

ll find_shortcut(int _n,vector<int> l,vector<int> _d,int _c){
	n=_n,c=_c,d=_d;
    for(int i=0;i<n;++i){
		if(i!=0)x[i]=x[i-1]+l[i-1];
	}
	ll lo=1,hi=1e18,mid,res;
	while(lo<=hi){
		mid=(lo+hi)>>1;
		if(pos(mid))res=mid,hi=mid-1;
		else lo=mid+1;
	}
	return res;
}

Compilation message (stderr)

shortcut.cpp: In function 'll find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:65:9: warning: 'res' may be used uninitialized in this function [-Wmaybe-uninitialized]
   65 |  return res;
      |         ^~~
#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...