Submission #71788

# Submission time Handle Problem Language Result Execution time Memory
71788 2018-08-25T15:56:38 Z KLPP Shortcut (IOI16_shortcut) C++14
Compilation error
0 ms 0 KB
#include "shortcut.h"
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long int lld;
typedef pair<int,long long int> pii;

vector<pii>nei[1000000];
lld max(lld x, lld y){
	if(x<y)return y;
return x;
	
}
lld min(lld x, lld y){
	if(x>y)return y;
return x;
	
}
class ST{
	lld maximo[100000];
	int n;
	public:
	void build(int a, int b, int node){
		maximo[node]=0;
		if(a==b)return;
		int mid=(a+b)/2;
		build(a,mid,2*node);
		build(mid+1,b,2*node+1);
	}
	void init(int N){
		n=N;
		build(0,n-1,1);
	}
	void update(int pos, lld val,int a, int b, int node){
		if(pos<a || pos>b)return;
		if(a==b){
			maximo[node]=val;
			return;
		}
		int mid=(a+b)/2;
		update(pos,val,a,mid,2*node);
		update(pos,val,mid+1,b,2*node+1);
		maximo[node]=max(maximo[2*node],maximo[2*node+1]);
	}
	void set(int pos,lld val){
		update(pos,val,0,n-1,1);
	}
	lld query(){
		return maximo[1];
	}
};
lld positive(lld values[],lld distances[],int n){
	int pnt=0;
	lld dist=0;
	lld sum=0;
	lld DP[n];
	DP[0]=0;
	for(int i=0;i<n-1;i++)DP[i+1]=DP[i]+distances[i];
	for(int i=0;i<n;i++)sum+=distances[i];
	//cout<<sum<<endl;
	ST *s=new ST();
	s->init(n);
	lld ans=0;
	for(int i=0;i<n;i++){
		while(pnt<n && 2*(dist+distances[pnt])<=sum){
			dist+=distances[pnt];
			pnt++;
			if(pnt<n)s->set(pnt,DP[pnt]+values[pnt]);
		}//cout<<i<<" "<<pnt<<" "<<dist<<endl;
		s->set(i,0);
		ans=max(ans,s->query()-DP[i]+values[i]);
		ans=max(ans,values[i]);
		dist-=distances[i];
	}
	return ans;
}
lld negative(lld values[],lld distances[],int n){
	int pnt=0;
	lld dist=0;
	lld sum=0;
	lld DP[n];
	DP[0]=0;
	for(int i=0;i<n-1;i++)DP[i+1]=DP[i]+distances[i];
	for(int i=0;i<n;i++)sum+=distances[i];
	//cout<<sum<<endl;
	//for(int i=0;i<n;i++)cout<<distances[i]<<" "<<values[i]<<endl;
	ST *s=new ST();
	s->init(n);
	for(int i=0;i<n;i++)s->set(i,sum-DP[i]+values[i]);
	lld ans=0;//cout<<endl;
	for(int i=0;i<n;i++){
		while(pnt<n && 2*dist<=sum){s->set(pnt,0);
			dist+=distances[pnt];
			pnt++;
		}//cout<<i<<" "<<pnt<<" "<<dist<<endl;
		//s->set(i,0);
		if(pnt<n)ans=max(ans,s->query()+DP[i]+values[i]);
		ans=max(ans,values[i]);
		dist-=distances[i];
		//cout<<values[i]<<" ";
	}//cout<<endl<<endl;
	return ans;
}
long long find_shortcut(int n, int l[], int d[], int c)
{
	lld ans=1000000000000000;
	lld left[n];
	left[0]=d[0];
	for(int i=1;i<n;i++){
		left[i]=left[i-1];
		lld dist=0;
		for(int j=i-1;j>-1;j--){
			dist+=l[j];
			left[i]=max(left[i],dist+d[j]+d[i]);
		}
		//cout<<left[i]<<" ";
	}//cout<<endl;
	lld right[n];
	right[n-1]=d[n-1];
	for(int i=n-2;i>-1;i--){
		right[i]=right[i+1];
		lld dist=0;
		for(int j=i;j<n-1;j++){
			dist+=l[j];
			right[i]=max(right[i],dist+d[j+1]+d[i]);
		}
		//cout<<right[i]<<" ";
	}//cout<<endl;
	/*
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			lld values[j-i+1];
			lld distances[j-i+1];
			int size=j-i+1;
			for(int h=0;h<j-i;h++){
				distances[h]=l[i+h];
			}
			distances[j-i]=c;
			for(int h=i+1;h<j;h++){
				values[h-i]=d[h];
			}
			lld dist=0;
			values[0]=d[i];
			for(int h=i-1;h>-1;h--){
				dist+=l[h];
				values[0]=max(values[0],dist+d[h]);
			}
			values[j-i]=d[j];
			
			dist=0;
			for(int h=j;h<n-1;h++){
				dist+=l[h];
				values[j-i]=max(values[j-i],dist+d[h+1]);
			}
			
			lld r=positive(values,distances,size);
			//cout<<i<<" A "<<j<<" "<<r<<endl;
			r=max(r,negative(values,distances,size));
			//cout<<i<<" B "<<j<<" "<<r<<endl;
			//cout<<values[0]<<" "<<values[j-i]<<endl;
			r=max(r,left[i]);
			r=max(r,right[j]);
			//cout<<max(left[i],right[j])<<endl;
			ans=min(ans,r);
		}
	}*/
	return ans;
}

Compilation message

/tmp/ccZRQ6RN.o: In function `main':
grader.cpp:(.text.startup+0x10d): undefined reference to `find_shortcut(int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, int)'
collect2: error: ld returned 1 exit status