# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
367656 | rocks03 | 버섯 세기 (IOI20_mushrooms) | C++14 | 11 ms | 512 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#pragma GCC target("avx2")
//#pragma GCC optimization("O3")
//#pragma GCC optimization("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ff first
#define ss second
#define pb push_back
#define SZ(x) ((int)(x).size())
#define all(x) x.begin(), x.end()
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int use_machine(vector<int>);
int count_mushrooms(int N){
vector<int> a = {0}, b;
int ind = 1;
vector<int> ask = {0, 1};
int ans = use_machine(ask);
++ind;
if(ans == 0) a.pb(1);
else b.pb(1);
if(N == 2) return SZ(a);
if(SZ(a) < 2){
ask = {0, 2};
ans = use_machine(ask);
if(ans == 1) b.pb(2);
else a.pb(2);
++ind;
}
const int BOUND = 104;
while(ind + 1 <= N - 1 && max(SZ(a), SZ(b)) < BOUND){
if(SZ(a) >= SZ(b)){
ask = {ind, a[0], ind + 1, a[1]};
ans = use_machine(ask);
if(ans == 0){
a.pb(ind); a.pb(ind + 1);
} else if(ans == 1){
b.pb(ind); a.pb(ind + 1);
} else if(ans == 2){
a.pb(ind); b.pb(ind + 1);
} else if(ans == 3){
b.pb(ind); b.pb(ind + 1);
}
ind += 2;
} else{
ask = {ind, b[0], ind + 1, b[1]};
ans = use_machine(ask);
if(ans == 0){
b.pb(ind); b.pb(ind + 1);
} else if(ans == 1){
a.pb(ind); b.pb(ind + 1);
} else if(ans == 2){
b.pb(ind); a.pb(ind + 1);
} else if(ans == 3){
a.pb(ind); a.pb(ind + 1);
}
ind += 2;
}
}
if(ind == N) return SZ(a);
if(ind + 1 == N){
ask = {0, N - 1};
ans = use_machine(ask);
if(ans == 1) b.pb(N - 1);
else a.pb(N - 1);
++ind;
return SZ(a);
}
int answer = SZ(a);
while(ind <= N - 1){
if(SZ(a) >= SZ(b)){
ask.clear();
rep(i, 0, SZ(a)){
if(ind > N - 1) break;
ask.pb(a[i]);
ask.pb(ind);
++ind;
}
ans = use_machine(ask);
answer += SZ(ask) / 2 - (ans + 1) / 2;
if(ans & 1){
b.pb(ask.back());
} else{
a.pb(ask.back());
}
} else{
ask.clear();
rep(i, 0, SZ(b)){
if(ind > N - 1) break;
ask.pb(b[i]);
ask.pb(ind);
++ind;
}
ans = use_machine(ask);
answer += (ans + 1) / 2;
if(ans & 1){
a.pb(ask.back());
} else{
b.pb(ask.back());
}
}
}
return answer;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |