제출 #1013419

#제출 시각아이디문제언어결과실행 시간메모리
1013419pcc철로 (IOI14_rail)C++17
8 / 100
117 ms203092 KiB
#include "rail.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fs first #define sc second const int mxn = 5050; int dp[mxn][mxn]; pii ans[mxn]; int Ask(int a,int b){ return dp[a][b] == -1?dp[a][b] = dp[b][a] = getDistance(a,b):dp[a][b]; } void Answer(int id,int pos,int tp){ cerr<<"ANS: "<<id<<','<<pos<<','<<tp<<endl; if(ans[id].fs != -1)cerr<<"REPEATED ANSWER: "<<id<<endl; assert(ans[id].fs == -1); ans[id] = pii(pos,tp); } int d1[mxn],d2[mxn]; void findLocation(int N, int ori, int location[], int stype[]){ memset(dp,-1,sizeof(dp)); for(auto &i:ans)i = pii(-1,-1); vector<pii> da; for(int i = 1;i<N;i++){ da.push_back(pii(Ask(0,i),i)); d1[i] = Ask(0,i); } sort(da.begin(),da.end()); int a = 0,b = da[0].sc; cerr<<"[a,b]: "<<a<<','<<b<<endl; Answer(a,ori,1); Answer(b,ori+da[0].fs,2); cerr<<"INIT DONE!"<<endl; vector<int> vl,vr; for(int i = 0;i<N;i++){ if(i == b||i == a)continue; d2[i] = Ask(b,i); if(d1[i]>d2[i])vl.push_back(i); else vr.push_back(i); if(d1[i]>d2[i])cerr<<"VL add: "<<i<<endl; else cerr<<"VR add: "<<i<<endl; } sort(vl.begin(),vl.end(),[](int a,int b){return d2[a]<d2[b];}); sort(vr.begin(),vr.end(),[](int a,int b){return d1[a]<d2[b];}); int lp = a; for(auto &now:vl){ if(Ask(lp,b)+Ask(lp,now) != Ask(b,now)){ Answer(now,ans[b].fs-Ask(b,now),1); lp = now; } else{ Answer(now,ans[lp].fs+Ask(lp,now),2); } } int rp = b; for(auto &now:vr){ if(Ask(a,rp)+Ask(rp,now) != Ask(a,now)){ Answer(now,ans[a].fs+Ask(a,now),2); rp = now; } else{ Answer(now,ans[rp].fs-Ask(rp,now),1); } } for(int i = 0;i<N;i++){ assert(ans[i].fs != -1); location[i] = ans[i].fs; stype[i] = ans[i].sc; } return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...