Submission #254278

#TimeUsernameProblemLanguageResultExecution timeMemory
254278b00n0rp철로 (IOI14_rail)C++17
0 / 100
311 ms98552 KiB
#include "rail.h"
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define REP(i,n) for(int i = 0; i < n; i ++)
#define FOR(i,a,b) for(int i = a; i < b; i ++)
#define all(v) v.begin(),v.end()

int dist[5005][5005];

vector<pii> cees,dees;

void findLocation(int N, int first, int location[], int stype[]){
	REP(i,N){
		dist[i][i] = 0;
		FOR(j,i+1,N){
			dist[i][j] = getDistance(i,j);
			dist[j][i] = dist[i][j];
		}
	}
	int mn = 1;
	FOR(i,2,N){
		if(dist[0][mn] > dist[0][i]) mn = i;
	}
	
	location[0] = first;
	stype[0] = 1;
	location[mn] = first+dist[0][mn];
	stype[mn] = 2;

	vector<pii> lft,rgt;
	FOR(i,1,N){
		if(i != mn){
			if(dist[0][i] > dist[0][mn]) lft.pb({dist[mn][i],i});
			else rgt.pb({dist[0][i],i});
		}
	}
	sort(all(lft));
	sort(all(rgt));

	int prevC = 0,prevD = mn;
	cees.pb({0,0});
	dees.pb({location[mn],mn});
	for(auto x:lft){
		location[x.S] = location[prevC]+getDistance(prevC,x.S);
		stype[x.S] = 2;
		int closest = cees[lower_bound(all(cees),make_pair(-location[x.S],-1))-cees.begin()].S;
		if(location[x.S]-location[closest]+dist[1][closest] != dist[1][x.S]){
			location[x.S] = location[mn]-dist[1][x.S];
			stype[x.S] = 1;
			cees.pb({-location[x.S],x.S});
		}
	}
	for(auto x:rgt){
		location[x.S] = location[prevD]-getDistance(prevD,x.S);
		stype[x.S] = 1;
		int closest = dees[lower_bound(all(dees),make_pair(location[x.S],-1))-dees.begin()].S;
		if(location[closest]-location[x.S]+dist[0][closest] != dist[0][x.S]){
			location[x.S] = location[0]+dist[0][x.S];
			stype[x.S] = 2;
			dees.pb({location[x.S],x.S});
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...