제출 #232954

#제출 시각아이디문제언어결과실행 시간메모리
232954Charis02도서관 (JOI18_library)C++14
100 / 100
326 ms388 KiB
#include <cstdio> #include <vector> #include<iostream> #define MAXN 1004 #include "library.h" using namespace std; pair < int,int > adj[MAXN]; int prefix[MAXN]; int suffix[MAXN]; int NN; int adjacencies(vector < int > M) { int ones = 0; for(int i = 0;i < NN;i++) ones+=M[i]; return ones-Query(M); } int join_pref(int pref,int el) { vector < int > M(NN); for(int i = 0;i < NN;i++) M[i]=0; M[el]=1; for(int i = 0;i <= pref;i++) M[i] = 1; return adjacencies(M); } int join_suf(int suf,int el) { vector < int > M(NN); for(int i = 0;i < NN;i++) M[i]=0; M[el]=1; for(int i = NN-1;i>=suf;i--) M[i] = 1; return adjacencies(M); } void Solve(int N) { NN=N; vector<int> M(N); for(int i = 0;i< N;i++) M[i] = 0; for(int i = 0; i < N; i++) { adj[i] = make_pair(-1,-1); M[i] = 1; prefix[i] = adjacencies(M); } for(int i = 0;i< N;i++) M[i] = 0; for(int i = N-1;i>=0;i--) { M[i]=1; suffix[i] = adjacencies(M); } for(int i = 0;i < N;i++) { if(i >= 0 && prefix[i-1] < prefix[i]) { int low = 0; int high = i-1; int pos = i-1; while(low<=high) { int mid = (low+high)/2; if(join_pref(mid,i) > prefix[mid]) { high=mid-1; pos=min(pos,mid); } else low=mid+1; } adj[i].first = pos; if(adj[pos].first==-1) adj[pos].first=i; else adj[pos].second=i; } if(prefix[i]-prefix[i-1] == 2) { int low = adj[i].first+1; int high=i-1; int pos = i-1; while(low<=high) { int mid = (low+high)/2; if(join_pref(mid,i) > prefix[mid]+1) { high=mid-1; pos=min(pos,mid); } else low=mid+1; } adj[i].second = pos; if(adj[pos].first==-1) adj[pos].first=i; else adj[pos].second=i; } } vector<int> res(N); int cur = 0; int par = 0; for(int i = 0;i < N;i++) { if(adj[i].first==-1||adj[i].second == -1) { cur=i; break; } } par=-1; // cout << endl << endl; // cout << "here " << cur << " " << adj[cur].first << " " << adj[cur].second << " " << suffix[cur] << " " << suffix[cur+1] << " " << join_suf(cur,cur+1) <<endl; // cout << "here " << 68 << " " << adj[68].first << " " << adj[68].second << endl; for(int i = 0;i < N;i++) { res[i] = cur+1; // cout << res[i] << endl; if(adj[cur].first==par) { par=cur; cur = adj[cur].second; } else { par=cur; cur=adj[cur].first; } } Answer(res); } /* 5 4 2 5 3 1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...