Submission #385460

#TimeUsernameProblemLanguageResultExecution timeMemory
385460KeshiRail (IOI14_rail)C++17
30 / 100
469 ms100332 KiB
//In the name of God #include <bits/stdc++.h> #include "rail.h" using namespace std; typedef int ll; typedef pair<ll, ll> pll; const ll maxn = 5100; const ll mod = 1e9 + 7; const ll inf = 1e9; #define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("input.txt", "r+", stdin);freopen("output.txt", "w+", stdout); #define pb push_back #define Mp make_pair #define F first #define S second #define Sz(x) ll((x).size()) #define all(x) (x).begin(), (x).end() ll dis[maxn][maxn]; bool isr[maxn]; void findLocation(int n, int first, int loc[], int st[]){ for(ll i = 0; i < n; i++){ for(ll j = i + 1; j < n; j++){ dis[i][j] = dis[j][i] = getDistance(i, j); } } ll x = 1; for(ll i = 1; i < n; i++){ if(dis[0][i] < dis[0][x]) x = i; } st[0] = 1; st[x] = 2; isr[x] = 1; loc[x] = dis[0][x]; ll cntr = 0; for(ll i = 1; i < n; i++){ if(x == i) continue; if(dis[0][i] < dis[x][i]) isr[i] = 1, cntr++; if(dis[x][i] < dis[0][x]){ isr[i] = 1; st[i] = 1; loc[i] = loc[x] - dis[x][i]; } } while(cntr){ ll y = -1; for(ll i = 1; i < n; i++){ if(!isr[i] || st[i]) continue; if(y == -1 || dis[0][y] > dis[0][i]) y = i; } st[y] = 2; loc[y] = dis[0][y]; cntr--; ll z = 0; for(ll i = 0; i < n; i++){ if(i == y) continue; if(dis[y][i] < dis[y][z]) z = i; } if(st[z]) continue; loc[z] = 2 * dis[0][y] - dis[0][z]; st[z] = 1; cntr--; for(ll i = 0; i < n; i++){ if(!isr[i] || st[i]) continue; if(dis[y][i] < dis[z][i]){ st[i] = 1; loc[i] = dis[0][i] - dis[0][y]; cntr--; } } } for(ll i = 1; i < n; i++){ if(!isr[i]) cntr++; } while(cntr){ ll y = -1; for(ll i = 1; i < n; i++){ if(isr[i] || st[i]) continue; if(y == -1 || dis[x][y] > dis[x][i]) y = i; } st[y] = 1; loc[y] = dis[0][x] - dis[x][y]; cntr--; ll z = 0; for(ll i = 0; i < n; i++){ if(i == y) continue; if(dis[y][i] < dis[y][z]) z = i; } if(st[z]) continue; loc[z] = dis[0][x] - (2 * dis[x][y] - dis[x][z]); st[z] = 2; cntr--; for(ll i = 0; i < n; i++){ if(isr[i] || st[i]) continue; if(dis[y][i] < dis[z][i]){ st[i] = 2; loc[i] = dis[0][x] - (2 * dis[x][y] - dis[x][i]); cntr--; } } } loc[0] = 0; for(ll i = 0; i < n; i++){ loc[i] += first; } return; } /*int main(){ fast_io; return 0; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...