| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1305765 | jojeonghoon | 도서관 (JOI18_library) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
#include<library.h>
using namespace std;
int N;
vector<vector<int>> A;
int Qur(vector<vector<int>>v, int x){
vector<int>m;
m.assign(N,0);
m[x-1]=1;
for(auto i:v) for(auto j:i) m[j-1]=1;
return Query(m);
}
void F(int x){
int k = (int)A.size()+1-Qur(A,x);
vector<int>in={x};
if(k==0){
A.push_back(in);
return;
}
if(k==1 || k==2){
int low=0, hig=(int)A.size()-1;
while(low<hig){
int mid=low+hig>>1;
vector<vector<int>>v;
for(int i=0; i<=mid; i++) v.push_back(A[i]);
if(Qur(v,x) == v.size()+1) low=mid+1;
else hig=mid;
}
if(low!=A.size()-1) swap(A[low], A[A.size()-1]);
vector<int> B=A.bk;
A.pop_back();
if(Qur({{B.bk}},x)==2) reverse(B.bg,B.ed);
in=B;
in.push_back(x);
}
if(k==2){
int low=0, hig=(int)A.size()-1;
while(low<hig){
int mid=low+hig>>1;
vector<vector<int>>v;
for(int i=0; i<mid; i++) v.push_back(A[i]);
if(Qur(v,x) == v.size()+1) low=mid+1;
else hig=mid;
}
if(low!=A.size()-1) swap(A[low], A[A.size()-1]);
vector<int> B=A.bk;
A.pop_back();
for(int i:B) in.push_back(i);
}
A.push_back(in);
}
void Solve(int N_){
N=N_;
A.push_back({1});
for(int i=2; i<=N; i++){
F(i);
}
Answer(A[0]);
}
