제출 #1292786

#제출 시각아이디문제언어결과실행 시간메모리
1292786ChuanChen버섯 세기 (IOI20_mushrooms)C++20
큐에 대기중
0 ms0 KiB
#include "mushrooms.h" #include<bits/stdc++.h> using namespace std; mt19937 rng(time(NULL)); const unsigned int OPT = 110; int ans; vector<int> A, B; queue<int> q; vector<int> u; int count_mushrooms(int n) { vector<int> m; A.push_back(0); u.resize(n-1); iota(u.begin(), u.end(), 1); shuffle(u.begin(), u.end(), rng); for (int i : u){ q.push(i); } while(q.size() && A.size() <= OPT && B.size() <= OPT){ int c1 = q.front(); q.pop(); if(q.empty()){ int verdic = use_machine({c1, A[0]}); if(verdic == 0) A.push_back(c1); else B.push_back(c1); break; } int c2 = q.front(); q.pop(); int verdic = use_machine({c1, A[0], c2}); if(verdic == 0){ A.push_back(c1); A.push_back(c2); } else if(verdic == 2){ B.push_back(c1); B.push_back(c2); } else{ int verdic2 = use_machine({A[0], c1}); if(verdic2 == 1){ A.push_back(c2); B.push_back(c1); } else{ A.push_back(c1); B.push_back(c2); } } } while(!q.empty()){ if(A.size() < B.size()){ //use B vector<int> m(min(2*B.size()-1, 2*q.size()+1)); for(int i = 0; i < (int)m.size(); i+=2) m[i] = B[i/2]; for(int i = 1; i < (int)m.size(); i+=2){ m[i] = q.front(); q.pop(); } int verdic = use_machine(m); ans += verdic/2; } else{ vector<int> m(min(2*A.size()-1, 2*q.size()+1)); for(int i = 0; i < (int)m.size(); i+=2) m[i] = A[i/2]; for(int i = 1; i < (int)m.size(); i+=2){ m[i] = q.front(); q.pop(); } int verdic = use_machine(m); ans += m.size()/2-verdic/2; } } return A.size()+ans; }