제출 #625815

#제출 시각아이디문제언어결과실행 시간메모리
625815ETK죄수들의 도전 (IOI22_prison)C++17
100 / 100
10 ms1492 KiB
#include <bits/stdc++.h>
#include "prison.h"
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define pii pair<int,int>
#define vi vector<int>
#define fi first
#define se second
#define pb push_back
#define ALL(x) x.begin(),x.end()
#define sz(x) int(x.size())
#define ll long long
using namespace std;
vector <vi> ans;
/*
when we go into node p,the previous number was in the range [L,R],
and (dep,id) represents the next node that we will travel to if our number is in [l,r].
Thus for [L,l],[r,R] we can already decide the answer, otherwise we need to keep moving.
*/
void work(int p,int dep,int id,int L,int R,int l,int r){
    int u = 3 * dep + id;
    //assert(u <= 20);
    rep(i,l,r)ans[p][i] = u;
    rep(i,L,l)ans[u][i] = -1 - ans[u][0];
    rep(i,r,R)ans[u][i] = -2 + ans[u][0];
    l++,r--;
    if(r - l < 0)return;
    if(r - l < 2){
        work(u,dep + 1,1,l - 1,r + 1,l,r);
        return;
    }
    if(r - l < 4){
        work(u,dep + 1,1,l - 1,r + 1,l,(l + r) / 2);
        work(u,dep + 1,2,l - 1,r + 1,(l + r) / 2 + 1,r);
        return;
    }
    int m1 = (l + l + r) / 3,m2 = (l + r + r) / 3;
    work(u,dep + 1,1,l - 1,r + 1,l,m1);
    work(u,dep + 1,2,l - 1,r + 1,m1 + 1,m2);
    work(u,dep + 1,3,l - 1,r + 1,m2 + 1,r);
}
vector <vi> devise_strategy(int n){
    rep(i,0,20){
        ans.pb(vi(n + 1,0));
        if((i + 2) % 6 < 3)ans[i][0] = 1;
    }
    work(0,-1,3,1,n,1,n);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...