제출 #1219244

#제출 시각아이디문제언어결과실행 시간메모리
1219244Gray도서관 (JOI18_library)C++20
100 / 100
76 ms928 KiB
#include <bits/stdc++.h> #include "library.h" using namespace std; int query(vector<int> a, int n){ vector<int> rask(n); for (auto ch:a) { rask[ch-1]=1; } int ret=Query(rask); return ret; } void Solve(int N) { vector<deque<int>> segs = {{1}}; int prev=1; for (int i=2; i<=N; i++){ vector<int> ask; for (auto &x:segs) { for (auto y:x) ask.push_back(y); } ask.push_back(i); int ret = query(ask, N); if (ret>prev){ prev=ret; segs.push_back({i}); }else if (ret==prev){ int l=-1, r=segs.size()-1; while (l+1<r){ int mid = (l+r)/2; ask.clear(); for (int j=0; j<=mid; j++){ for (auto y:segs[j]) ask.push_back(y); } ask.push_back(i); if (query(ask, N)==mid+1) r=mid; else l=mid; } if (query({i, segs[r][0]}, N)==1) { segs[r].push_front(i); }else segs[r].push_back(i); }else{ prev=ret; int l=-1, r=segs.size()-1; while (l+1<r){ int mid = (l+r)/2; ask.clear(); for (int j=0; j<=mid; j++){ for (auto y:segs[j]) ask.push_back(y); } ask.push_back(i); if (query(ask, N)<=mid+1) r=mid; else l=mid; } int left = r; l=0; r=segs.size(); while (l+1<r){ int mid = (l+r)/2; ask.clear(); for (int j=(int)segs.size()-1; j>=mid; j--){ for (auto y:segs[j]) ask.push_back(y); } ask.push_back(i); if (query(ask, N)<=(int)segs.size()-mid) l=mid; else r=mid; } int right = l; if (query({segs[left][0], i}, N)==1){ if (query({segs[right][0], i}, N)==1){ segs[left].push_front(i); while (!segs[right].empty()) { segs[left].push_front(segs[right].front()); segs[right].pop_front(); } }else{ segs[left].push_front(i); while (!segs[right].empty()){ segs[left].push_front(segs[right].back()); segs[right].pop_back(); } } }else{ if (query({segs[right][0], i}, N)==1){ segs[left].push_back(i); while (!segs[right].empty()) { segs[left].push_back(segs[right].front()); segs[right].pop_front(); } }else{ segs[left].push_back(i); while (!segs[right].empty()){ segs[left].push_back(segs[right].back()); segs[right].pop_back(); } } } vector<deque<int>> nsegs; for(int j=0; j<(int)segs.size(); j++){ if (j==right) continue; nsegs.push_back(segs[j]); } segs=nsegs; } } vector<int> ans; while (!segs[0].empty()){ ans.push_back(segs[0].back()); segs[0].pop_back(); } Answer(ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...