Submission #1231858

#TimeUsernameProblemLanguageResultExecution timeMemory
1231858kl0989e철로 (IOI14_rail)C++20
30 / 100
3101 ms231816 KiB
#include "rail.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()

/*void findLocation(int n, int f, int loc[], int tpe[]) {
	loc[0]=f;
	tpe[0]=1;
	vi dst(n,0);
	int mn=1;
	for (int i=1; i<n; i++) {
		dst[i]=getDistance(0,i);
		if (dst[i]<dst[mn]) {
			mn=i;
		}
	}
	loc[mn]=f+dst[mn];
	tpe[mn]=2;
	for (int i=1; i<n; i++) {
		if (i==mn) {
			continue;
		}
		if (getDistance(mn,i)<dst[i]) {
			loc[i]=f+2*dst[mn]-dst[i];
			tpe[i]=1;
		}
		else {
			loc[i]=f+dst[i];
			tpe[i]=2;
		}
	}
}*/

map<pi,int> mem;

int get(int i, int j) {
	if (mem.count({i,j})) {
		return mem[{i,j}];
	}
	if (mem.count({j,i})) {
		return mem[{j,i}];
	}
	return mem[{i,j}]=getDistance(i,j);
}

void find(int k, int side, vi& inds, int loc[], int tpe[]) {
	if (inds.size()==0) {
		return;
	}
	int mn=inds[0];
	for (auto i:inds) {
		if (get(k,i)<get(k,mn)) {
			mn=i;
		}
	}
	loc[mn]=loc[k]+side*get(k,mn);
	tpe[mn]=(side==1?2:1);
	vi newinds;
	int clo=k;
	for (auto i:inds) {
		if (i==mn) {
			continue;
		}
		if (get(k,i)==get(k,mn)+get(mn,i) && get(mn,i)<get(k,mn)) {
			if (get(mn,i)<get(clo,mn)) {
				clo=i;
			}
			loc[i]=loc[mn]-side*get(mn,i);
			tpe[i]=(side==1?1:2);
		}
		else {
			newinds.pb(i);
		}
	}
	vi indsl,indsr;
	for (auto i:newinds) {
		if (get(mn,i)<get(clo,i)) {
			indsl.pb(i);
		}
		else {
			indsr.pb(i);
		}
	}
	find(k,side,indsr,loc,tpe);
	find(mn,-side,indsl,loc,tpe);
}

void findLocation(int n, int f, int loc[], int tpe[]) {// sub 3
	for (int i=0; i<n; i++) {
		mem[{i,i}]=0;
	}
	loc[0]=f;
	tpe[0]=1;
	vi inds(n-1);
	iota(all(inds),1);
	find(0,1,inds,loc,tpe);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...