제출 #1337035

#제출 시각아이디문제언어결과실행 시간메모리
1337035Math4Life2020Super Dango Maker (JOI22_dango3)C++20
100 / 100
198 ms1288 KiB
#include "dango3.h"
#include <bits/stdc++.h>
using namespace std;
using ll = int; using pii = pair<ll,ll>;


mt19937 gen(9218309128309);

vector<ll> shuffle(vector<ll> v0) {
    vector<pii> v1;
    for (ll x: v0) {
        v1.push_back({gen(),x});
    }
    sort(v1.begin(),v1.end());
    vector<ll> v2;
    for (pii p0: v1) {
        v2.push_back(p0.second);
    }
    return v2;
}

void Solve(int N, int M) {
    vector<ll> vleft; 
    for (ll i=1;i<=(N*M);i++) {
        vleft.push_back(i);
    }
    vleft = shuffle(vleft);
    while (vleft.size()!=0) {
        if (vleft.size()==M) {
            Answer(vleft);
            vleft.clear();
            break;
        }
        ll dmin = 0; ll dmax = vleft.size();
        while (dmin<dmax) {
            ll dq = (dmin+dmax)/2;
            vector<ll> vq1;
            for (ll i=0;i<dq;i++) {
                vq1.push_back(vleft[i]);
            }
            if (Query(vq1)>=1) {
                dmax = dq;
            } else {
                dmin = dq+1;
            }
        }
        vector<ll> ap; ap.push_back(vleft[dmin-1]);
        for (ll t=(dmin-2);t>=0;t--) {
            vector<ll> vq = ap;
            for (ll i=0;i<t;i++) {
                vq.push_back(vleft[i]);
            }
            if (Query(vq)==0) {
                ap.push_back(vleft[t]);
            }
        }
        Answer(ap);
        set<ll> vlset;
        for (ll x: vleft) {
            vlset.insert(x);
        }
        for (ll x: ap) {
            vlset.erase(vlset.find(x));
        }
        vleft.clear();
        for (ll x: vlset) {
            vleft.push_back(x);
        }
        vleft = shuffle(vleft);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...