| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1364766 | ByeWorld | 버섯 세기 (IOI20_mushrooms) | C++20 | 0 ms | 0 KiB |
#include "mushrooms.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
#define USE use_machine
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 6e5+10;
const int MAXA = 5e4+10;
const int SQRT = 300;
const int INF = 2e9;
const int MOD = 1e9+87;
const int MOD2 = 1e9+7;
const int LOG = 30;
int n;
int count_mushrooms(int N) {
n = N;
vector<int> a = {0}, b;
for(int i=1; i<=min(n-1, 200); i++){
vector<int> m = {0, i};
if(USE(m) == 1) b.pb(i);
else a.pb(i);
}
if(n-1 <= 200){
return a.size();
}
// cout << a.size() << ' '<< b.size()<< ' ' << "pp\n";
int ans = a.size(), nw = 201;
while(true){
if(b.size() < a.size()){//pake a
vector<int> m;
int tot = 0, dep = 0;
while(nw <= n-1){
if(m.empty()) dep = nw;
m.pb(nw); m.pb(a[tot]);
tot++; nw++;
if(tot == a.size()){
// cout << m.size() << " msiz\n";
int ret = USE(m);
ans += tot-1-ret/2; // ret/2 = b
if(ret%2 == 1) b.pb(nw); // ada b di depan
else {
ans++; a.pb(nw);
}
m.clear();
tot = 0;
break;
}
}
if(!m.empty()){
// cout << m.size() << " msiz\n";
int ret = USE(m);
ans += tot-1-ret/2; // ret/2 = b
if(ret%2 == 1) b.pb(nw); // ada b di depan
else {
ans++; a.pb(nw);
}
else ans++;
}
} else {//pake b
vector<int> m;
int tot = 0, dep = 0;
while(nw <= n-1){
if(m.empty()) dep = nw;
m.pb(nw); m.pb(b[tot]);
tot++; nw++;
if(tot == b.size()){
int ret = USE(m);
ans += ret/2; // ret/2 = b
if(ret%2 == 1) ans++, a.pb(nw);
else {
b.pb(nw); // ada b di depan
}
m.clear();
tot = 0;
break;
}
}
if(!m.empty()){
int ret = USE(m);
ans += ret/2; // ret/2 = b
if(ret%2 == 1) ans++, a.pb(nw);
else {
b.pb(nw); // ada b di depan
}
}
}
}
return ans;
}
