제출 #1293376

#제출 시각아이디문제언어결과실행 시간메모리
1293376lambd47버섯 세기 (IOI20_mushrooms)C++20
92.24 / 100
4 ms508 KiB
#include<bits/stdc++.h>
#include "mushrooms.h"
using namespace std;

#define ll long long
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)


int count_mushrooms(int n) {
    vector<int> ids(n-1);
    iota(all(ids),1);
    reverse(all(ids));
    vector<int> tipo[2];
    tipo[0].clear();tipo[1].clear();
    tipo[0].push_back(0);
    vector<int> aux;
    int resp=0;
    while(!ids.empty() && sz(tipo[0])<2 && sz(tipo[1])<2){
        aux.clear();
        aux.push_back(0);
        aux.push_back(ids.back());
        int v=use_machine(aux);
        tipo[v].push_back(ids.back());
        ids.pop_back();
    }
    int at=0;
    if(sz(tipo[1])==2)at=1;
    int m=100;
    while(sz(ids)>1 && sz(tipo[0])<m && sz(tipo[1])<m){
        aux.clear();
        int a=ids.back();
        ids.pop_back();
        int b=ids.back();
        ids.pop_back();
        aux={tipo[at][0],a,tipo[at][1],b};
        int v=use_machine(aux);
        if(v&1){//ponta eh da cor oposta
            tipo[1^at].push_back(b);
        }else{
            tipo[at].push_back(b);
        }
        if(v&2){
            tipo[1^at].push_back(a);
        }else{
            tipo[at].push_back(a);
        }
    }
    if(sz(ids)==1){
        aux.clear();
        aux={0,ids.back()};
        ids.pop_back();
        resp+=1^use_machine(aux);
    }
    if(sz(ids)==0){
        return resp+sz(tipo[0]);
    }

    at=0;
    if(sz(tipo[1])>=m)at=1;

    while(!ids.empty()){
        int vida=sz(tipo[at])-1;
        aux.clear();
        while(vida>=0 && !ids.empty()){
            aux.push_back(tipo[at][vida]);
            aux.push_back(ids.back());
            ids.pop_back();
            vida--;
        }
        int v=use_machine(aux);
        int oposto=0;
        if(v&1){
            v++;
            oposto=1;
        }
        if(at==1){
            resp+=v/2;
            if(oposto==1){
                resp--;
                tipo[0].push_back(aux.back());
            }
            else{
                tipo[1].push_back(aux.back());
            }
        }
        else{
            resp+=sz(aux)/2-v/2;
            if(oposto==1){
                tipo[1].push_back(aux.back());
            }
            else{
                tipo[0].push_back(aux.back());
                resp--;
            }
        }
        if(sz(tipo[at^1])>sz(tipo[at]))at^=1;
    }
    return resp+sz(tipo[0]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...