제출 #1313811

#제출 시각아이디문제언어결과실행 시간메모리
1313811BigBadBully버섯 세기 (IOI20_mushrooms)C++20
91.13 / 100
4 ms504 KiB
#include <bits/stdc++.h> #include "mushrooms.h" using namespace std; const int inf = 1e9; #define pii pair<int,int> #define ff first #define ss second int count_mushrooms(int n) { int bl = 110; vector<int> v(n,1); v[0] = 0; bool dif = 0; int st = 1; vector<int> wh[2]; wh[0].push_back(0); function<void()> nxt = [&]() { int mxx =max(wh[0].size(),wh[1].size()); if(mxx>=2 && st < n-1) { for(int it = 0;it < 2; it++) if(wh[it].size()==mxx) { int x = use_machine({wh[it][0],st+1,wh[it][1],st}); v[st]=(x&1)^(it); wh[v[st]].push_back(st); v[++st]=((x&2)/2)^(it); wh[v[st]].push_back(st); break; } } else { v[st] = use_machine({st-1,st})^v[st-1]; wh[v[st]].push_back(st); } }; for(;st<n;st++) { nxt(); if(max(wh[0].size(),wh[1].size())>=bl) break; } st++; int sum = count(v.begin(),v.end(),0); function<int(int,int)> calc = [&](int l,int r) { vector<int> que; array<int,2> idx = {0,0}; bool gurt = 0; int dom = 0; function<void()>f = [&](){ for(int it = 0;it < 2;it++) if(wh[it].size()==max(wh[0].size(),wh[1].size())) { dom = it; que.push_back(wh[it][idx[it]++]); break; } }; for(int i = l; i <= r; i++) { f(); que.push_back(i); } int rl = use_machine(que); int val = (rl+1)/2; int len = r-l+1; wh[(rl%2)^(wh[1].size()>wh[0].size())].push_back(r); if(dom) return val; return len-val; }; for(int plus = max(wh[0].size(),wh[1].size());st<n;st+=plus) plus=max(wh[0].size(),wh[1].size()), sum+=calc(st,min<int>(st+max(wh[0].size(),wh[1].size())-1,n-1)); return sum; }
#Verdict Execution timeMemoryGrader output
Fetching results...