# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1003450 | PoPularPlusPlus | 버섯 세기 (IOI20_mushrooms) | C++17 | 6 ms | 448 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define all(x) x.begin(),x.end()
#define vf first
#define vs second
pair<int,int> cal(int tp , int type){
pair<int,int> p = mp(0,0);
if(type == 0){
if(tp % 2 == 1){
p.vf = 1;
}
if(tp >= 2){
p.vs = 1;
}
}
else {
if(tp % 2 == 0){
p.vf = 1;
}
if(tp < 2){
p.vs = 1;
}
}
return p;
}
int cal1(int tp , int type , int tot){
int res = 0;
if(type == 0){
if(tp % 2 == 0)res++;
tot--;
res += tot;
res -= tp/2;
}
else {
if(tp % 2 == 1)res++;
res += tp/2;
}
return res;
}
int count_mushrooms(int n) {
if(n == 2){
return 1 + (use_machine({0,1}) == 0 ? 1 : 0);
}
int ans = 1;
vector<int> ask;
ask.pb(0);
ask.pb(1);
int tp = use_machine(ask);
vector<int> a , b;
a.pb(0);
pair<int,int> p;
int start = 2;
int type = 0;
if(tp == 0){
a.pb(1);
ans++;
p = mp(0 , 1);
}
else {
b.pb(1);
start++;
ask.pop_back();
ask.pb(2);
tp = use_machine(ask);
if(tp == 0){
a.pb(2);
ans++;
p = mp(0,2);
}
else {
b.pb(2);
p = mp(1,2);
type = 1;
}
}
while(a.size() < 130 && b.size() < 130 && start < n){
if(start + 1 == n){
tp = use_machine({0 , start});
if(tp == 0){
ans++;
}
start++;
}
else {
tp = use_machine({start,p.vf,start + 1,p.vs});
pair<int,int> val = cal(tp , type);
if(val.vf == 0){
ans++;
a.pb(start);
}
else {
b.pb(start);
}
start++;
if(val.vs == 0){
ans++;
a.pb(start);
}
else {
b.pb(start);
}
start++;
}
}
if(start >= n){
return ans;
}
while(start < n){
int rem = n - start;
if(rem > max(a.size(),b.size())){
ask.clear();
for(int i = start , j = 0; j < max(a.size(), b.size()); i++,j++){
ask.pb(start++);
if(a.size() >= b.size()){
ask.pb(a[j]);
}
else ask.pb(b[j]);
}
tp = use_machine(ask);
ans += cal1(tp , (a.size() >= b.size() ? 0 : 1),ask.size()/2);
}
else {
ask.clear();
for(int i = start , j = 0; i < n; i++,j++){
ask.pb(start++);
if(a.size() >= b.size()){
ask.pb(a[j]);
}
else ask.pb(b[j]);
}
tp = use_machine(ask);
ans += cal1(tp , (a.size() >= b.size() ? 0 : 1),ask.size()/2);
}
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |