# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1052733 | 2024-08-10T20:06:35 Z | Itamar | 통행료 (IOI18_highway) | C++14 | 0 ms | 0 KB |
using namespace std; #include<vector> void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y); int find_s(int M, vector<int> A){ int N = A.size(); A.push_back(0); std::vector<int> C(M + 1,19); std::vector<int> X(2*N+1), Y(2*N+1); int l = 0, r = N; int wr = 0; while(l<r){ int rt = l-1; int lt = rt - (r-l)/2; int it = r; for(int i = lt; i<=rt; i++){ if(r == N){ Y[wr]=it; it--; if(it >=l){ X[wr]=it; }else{ X[wr] = 2; } it--;wr++; } else{ Y[wr]=it; it--; if(it >=l){ X[wr]=it; }else{ X[wr] = 2; } it--,wr++; } } l=lt,r=rt; } return l; } #include <algorithm> #define vi vector<int> vi getper(int N){ if(N==1)return {0}; vi per1= getper(N/2), per2 = getper((N+1)/2); vi ans; for(int i = 0; i < N; i++){ if(i%2){ ans.push_back(per1[i/2]+(N+1)/2); }else{ ans.push_back(per2[i/2]); } } return ans; } void create_circuit(int M, std::vector<int> A) { int s = find_s(M,A); int N = A.size(); vector<int> per; A.push_back(0); std::vector<int> C(M + 1,s); std::vector<int> X(-s), Y(-s); int l = 0, r = N; int wr = 0; while(l<r){ int rt = l-1; int lt = rt - (r-l)/2; int it = r; for(int i = lt; i<=rt; i++){ if(r == N){ Y[wr]=it; it--; if(it != r-1 || (r-l)%2){ X[wr]=it; it--; }else{ X[wr] = s; } wr++; } else{ Y[wr]=it; it--; if(it != r-1 || (r-l)%2){ X[wr]=it; it--; }else{ X[wr] = s; } wr++; } } l=lt,r=rt; } int st = s; while(st!=N){ if(st < 0){ int stag = X[-1-st]; swap(X[-1-st],Y[-1-st]); st = stag; }else{ per.push_back(st); st = s; } } per.push_back(N); vi q(N+1); for(int i = 0; i <= N; i++)q[per[i]]=i; for(int i = 0; i< (-s); i++){ if(X[i]>=0)X[i] = A[q[X[i]]]; if(Y[i]>=0)Y[i] = A[q[Y[i]]]; } per.push_back(0); answer(C,X,Y); }