Submission #1081606

#TimeUsernameProblemLanguageResultExecution timeMemory
1081606GrindMachineCounting Mushrooms (IOI20_mushrooms)C++17
39.17 / 100
8 ms600 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define pb push_back #define endl '\n' #define conts continue #define ff first #define ss second #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define sz(a) (int)a.size() #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &x, T y){ x = min(x,y); } template<typename T> void amax(T &x, T y){ x = max(x,y); } template<typename A,typename B> string to_string(pair<A,B> p); string to_string(const string &s){ return "'"+s+"'"; } string to_string(const char* s){ return to_string((string)s); } string to_string(bool b){ return b?"true":"false"; } template<typename A> string to_string(A v){ string res = "{"; trav(x,v){ res += to_string(x)+","; } if(res.back() == ',') res.pop_back(); res += "}"; return res; } template<typename A,typename B> string to_string(pair<A,B> p){ return "("+to_string(p.ff)+","+to_string(p.ss)+")"; } #define debug(x) cout << "[" << #x << "]: "; cout << to_string(x) << endl const int MOD = 1e9 + 7; const int N = 1e5 + 5; const int inf1 = 1e9 + 5; const ll inf2 = (ll)1e18 + 5; #include "mushrooms.h" int count_mushrooms(int n) { int B = min(n,80); vector<int> a(B); rep1(i,B-1){ vector<int> v = {i-1,i}; a[i] = a[i-1]^use_machine(v); } vector<int> v0,v1; rep(i,B){ if(!a[i]){ v0.pb(i); } else{ v1.pb(i); } } int ptr = B-1; int ans = count(all(a),0); while(ptr < n-1){ int siz = max(sz(v0),sz(v1)); if(sz(v0) > sz(v1)){ while(ptr < n-1){ vector<int> v; for(int i = ptr+1; i < n; ++i){ if(sz(v) >= siz) break; ptr = i; v.pb(i); } vector<int> ask; rep(i,sz(v)){ ask.pb(v0[i]); ask.pb(v[i]); } int res = use_machine(ask); int sum = (sz(v)-1)*2+1; res = sum-res; if(res&1){ ans++; v0.pb(v.back()); } else{ v1.pb(v.back()); } ans += res/2; } } else{ while(ptr < n-1){ vector<int> v; for(int i = ptr+1; i < n; ++i){ if(sz(v) >= siz) break; ptr = i; v.pb(i); } vector<int> ask; rep(i,sz(v)){ ask.pb(v1[i]); ask.pb(v[i]); } int res = use_machine(ask); if(res&1){ ans++; v0.pb(v.back()); } else{ v1.pb(v.back()); } ans += res/2; } } } return ans; // for (int i = 0; i < n; i++) // m.push_back(i); // int c1 = use_machine(m); // m = {0, 1}; // int c2 = use_machine(m); // return c1+c2; }
#Verdict Execution timeMemoryGrader output
Fetching results...