제출 #424772

#제출 시각아이디문제언어결과실행 시간메모리
424772vanic철로 (IOI14_rail)C++14
100 / 100
129 ms640 KiB
#include "rail.h"
#include <vector>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cassert>

using namespace std;

const int maxn=5e3+5;

pair < int, int > dist[maxn];
vector < int > desne;
vector < int > lijeve;
vector < int > pot;


void findLocation(int n, int pos, int sol1[], int sol2[]){
	for(int i=1; i<n; i++){
		dist[i-1]={getDistance(0, i), i};
	}
	sol1[0]=pos;
	sol2[0]=1;
	sort(dist, dist+n-1);
	int l=0;
	lijeve.push_back(l);
	int d=dist[0].second;
	int x;
	sol1[d]=pos+dist[0].first;
	sol2[d]=2;
	desne.push_back(d);
	int q1, q2;
	bool p;
	for(int i=1; i<n-1; i++){
		x=dist[i].second;
//		cout << "na " << x << endl;
		q1=getDistance(l, x);
		q2=getDistance(d, x);
		for(int j=0; j<(int)desne.size(); j++){
			if(sol1[desne[j]]-sol1[l]<q1 && (!j || sol1[desne[j]]*2-q1-sol1[l]>sol1[desne[j-1]])){
				pot.push_back(sol1[desne[j]]*2-q1-sol1[l]);
			}
		}
		p=0;
		for(int j=0; j<(int)pot.size(); j++){
			if(sol1[d]-pot[j]==q2){
				assert(!p);
				assert(pot[j]>=0);
				p=1;
				sol1[x]=pot[j];
				sol2[x]=1;
				lijeve.push_back(x);
				int poz=lijeve.size()-1;
				while(poz>0 && sol1[lijeve[poz]]<sol1[lijeve[poz-1]]){
					swap(lijeve[poz], lijeve[poz-1]);
					poz--;
				}
				l=lijeve[0];
			}
		}
		pot.clear();
		if(p){
			continue;
		}

		for(int j=0; j<(int)lijeve.size(); j++){
			if(sol1[d]-sol1[lijeve[j]]<q2 && (j==(int)lijeve.size()-1 || sol1[lijeve[j]]*2+q2-sol1[d]<sol1[lijeve[j+1]])){
				pot.push_back(sol1[lijeve[j]]*2+q2-sol1[d]);
			}
		}
		for(int j=0; j<(int)pot.size(); j++){
			if(pot[j]-sol1[l]==q1){
				assert(!p);
				p=1;
				sol1[x]=pot[j];
				sol2[x]=2;
				desne.push_back(x);
				int poz=desne.size()-1;
				while(poz>0 && sol1[desne[poz]]<sol1[desne[poz-1]]){
					swap(desne[poz], desne[poz-1]);
					poz--;
				}
				d=desne.back();
			}
		}
		pot.clear();
		if(p){
			continue;
		}


		if(q1-dist[i].first==sol1[0]-sol1[l]){
			sol1[x]=sol1[l]+q1;
			sol2[x]=2;
			desne.push_back(x);
			int poz=desne.size()-1;
			while(poz>0 && sol1[desne[poz]]<sol1[desne[poz-1]]){
				swap(desne[poz], desne[poz-1]);
				poz--;
			}
			d=desne.back();
		}
		else{
			sol1[x]=sol1[d]-q2;
			sol2[x]=1;
			lijeve.push_back(x);
			int poz=lijeve.size()-1;
			while(poz>0 && sol1[lijeve[poz]]<sol1[lijeve[poz-1]]){
				swap(lijeve[poz], lijeve[poz-1]);
				poz--;
			}
			l=lijeve[0];
		}
//		cout << l << ' ' << d << endl;
	}
/*	cout << "kraj--------" << endl;
	for(int i=0; i<n; i++){
		cout << sol2[i] << ' ' << sol1[i] << endl;
	}*/
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...