Submission #1337030

#TimeUsernameProblemLanguageResultExecution timeMemory
1337030Math4Life2020Super Dango Maker (JOI22_dango3)C++20
22 / 100
247 ms1060 KiB
#include "dango3.h"
#include <bits/stdc++.h>
using namespace std;
using ll = int; using pii = pair<ll,ll>;

void Solve(int N, int M) {
    vector<ll> vleft; 
    for (ll i=1;i<=(N*M);i++) {
        vleft.push_back(i);
    }
    ll ngrp = N; //number of groups left
    vector<vector<ll>> vgf; //final groups (by index)
    while (vleft.size()!=0) {
        if (vleft.size()==M) {
            vgf.push_back(vleft);
            vleft.clear();
            break;
        }
        vector<ll> vqdef;
        for (ll T=0;T<vgf.size();T++) {
            vqdef.push_back(vgf[T][0]);
        }
        ll dmin = 0; ll dmax = vleft.size();
        while (dmin<dmax) {
            ll dq = (dmin+dmax)/2;
            vector<ll> vq1 = vqdef;
            for (ll i=0;i<dq;i++) {
                vq1.push_back(vleft[i]);
            }
            if (Query(vq1)>=1) {
                dmax = dq;
            } else {
                dmin = dq+1;
            }
        }
        for (ll i=0;i<(dmin-1);i++) {
            vqdef.push_back(vleft[i]);
        }
        vector<ll> vg0;
        vg0.push_back(vleft[dmin-1]);
        ll xc = dmin;
        while (vg0.size()<M) {
            ll qmin = xc; ll qmax = vleft.size()-1;
            while (qmin<qmax) {
                ll qq = (qmin+qmax)/2;
                vector<ll> vq1 = vqdef;
                for (ll t=xc;t<=qq;t++) {
                    vq1.push_back(vleft[t]);
                }
                if (Query(vq1)>=1) {
                    qmax = qq;
                } else {
                    qmin = qq+1;
                }
            }
            vg0.push_back(vleft[qmin]);
            xc = qmin+1;
        }
        set<ll> vlset;
        for (ll x: vleft) {
            vlset.insert(x);
        }
        for (ll x: vg0) {
            vlset.erase(vlset.find(x));
        }
        vleft.clear();
        for (ll x: vlset) {
            vleft.push_back(x);
        }
        vgf.push_back(vg0);
    }
    for (ll m=0;m<M;m++) {
        vector<ll> A;
        for (ll n=0;n<N;n++) {
            A.push_back(vgf[n][m]);
        }
        Answer(A);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...