제출 #501630

#제출 시각아이디문제언어결과실행 시간메모리
50163079brueMinerals (JOI19_minerals)C++14
80 / 100
41 ms2676 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; } 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...