제출 #1345405

#제출 시각아이디문제언어결과실행 시간메모리
1345405Francisco_MartinMonster-Go (EGOI25_monstergo)C++20
100 / 100
0 ms344 KiB
//EGOI 2025 Monster-Go
//https://qoj.ac/contest/2343/problem/13167

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;

int main(){
    ll n, offset=0; vector<array<ll,4>> blocks;
    cin >> n;
    auto binom=[&](ll a,ll b){
        ll res=1;
        for(int i=1; i<=b; i++) res=res*(a-i+1)/i;
        return res;
    };
    for(auto d:{1,2,3,4,6,12}) for(int i=0; 12+i*d<=50; i++){
        blocks.push_back({d,i,binom(12/d+i,i),12+i*d});
    }
    vll dp(n+1,1e18), from(n+1,-1); dp[0]=0;
    vector<array<ll,4>> res(n+1), ans; ll cur=n;
    for(int i=0; i<n; i++) for(auto a:blocks){
        ll nxt=i+a[2];
        if(nxt<=n && dp[i]+a[3]<=50 && dp[i]+a[3]<dp[nxt]){
            dp[nxt]=dp[i]+a[3]; from[nxt]=i; res[nxt]=a;
        }
    }
    while(cur>0) ans.push_back(res[cur]), cur=from[cur];
    for(auto [d,k,tot,cost]:ans){
        ll x=12/d+k; 
        for(int mask=0; mask<(1<<x); mask++) if(__builtin_popcount(mask)==12/d){
            for(int i=0; i<x; i++) if((mask>>i)&1){
                for(int j=0; j<d; j++) cout << offset+i*d+j << " ";
            }
            cout << "\n";
        }
        offset+=x*d;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...