제출 #501680

#제출 시각아이디문제언어결과실행 시간메모리
50168079brueMinerals (JOI19_minerals)C++14
90 / 100
46 ms2872 KiB
#include "minerals.h" #include <bits/stdc++.h> typedef long long ll; using namespace std; int n; bool chk[100002]; int order[100002], ocnt; int ans[100002]; bool in[100002]; int lastRet; int query(int x){ in[x] = !in[x]; return Query(order[x]); } void solve(int l, int r, vector<int>& vec){ if(l==r){ ans[l] = vec[0]; return; } if(r-l==1 && (in[vec[0]] ^ in[vec[1]]) && (!in[l] || !in[r])){ int tmp; if(!in[l]) tmp = query(l); else tmp = query(r); if(in[l] ^ in[vec[0]]){ if(tmp == lastRet) ans[l] = vec[1], ans[r] = vec[0]; else ans[l] = vec[0], ans[r] = vec[1]; } else{ if(tmp != lastRet) ans[l] = vec[1], ans[r] = vec[0]; else ans[l] = vec[0], ans[r] = vec[1]; } lastRet = tmp; return; } int m = (l+r)>>1; if(r-m < m-l+1) m--; int tmpCalc = 0; bool st = 0; for(int i=l; i<=m; i++) if(!in[i]) tmpCalc++; for(int i=m+1; i<=r; i++) if(in[i]) tmpCalc++; if(tmpCalc * 2 > r-l+1) st = 1; for(int i=l; i<=m; i++){ if(in[i] == st) lastRet = query(i); } for(int i=m+1; i<=r; i++){ if(in[i] != st) lastRet = query(i); } vector<int> lVec, rVec; for(auto x: vec){ if((int)lVec.size() == m-l+1){ rVec.push_back(x); continue; } else if((int)rVec.size() == r-m){ lVec.push_back(x); continue; } int tmp = query(x); if((tmp == lastRet) ^ st) lVec.push_back(x); else rVec.push_back(x); lastRet = tmp; } solve(l, m, lVec); solve(m+1, r, rVec); } void Solve(int N){ n = N; for(int i=1; i<=n+n; i++){ int tmp = Query(i); if(tmp != lastRet) order[++ocnt] = i, chk[i] = 1; lastRet = tmp; in[i] = 1; } for(int i=1; i<=n+n; i++) if(!chk[i]) order[++ocnt] = i; vector<int> tVec; for(int i=n+1; i<=n+n; i++) tVec.push_back(i); solve(1, n, tVec); for(int i=1; i<=n; i++) Answer(order[i], order[ans[i]]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...