제출 #1257719

#제출 시각아이디문제언어결과실행 시간메모리
1257719tolbiSuper Dango Maker (JOI22_dango3)C++20
2 / 100
688 ms948 KiB
#include "dango3.h"
#include <bits/stdc++.h>
using namespace std;
#define coutarr(x) for (auto &it : x) cout<<it<<" ";cout<<endl;
const int X = 32;
//Query Count: N * N * M / X + N * M * X
vector<int> concat(vector<int> a, vector<int> b){
	vector<int> ret = a;
	for (auto it : b) ret.push_back(it);
	for (auto &it : ret) it++;
	return ret;
}
void Solve(int N, int M) {
	vector<int> ord(N * M);
	iota(ord.begin(), ord.end(), 0);
	mt19937 ayahya(chrono::high_resolution_clock().now().time_since_epoch().count());
	for (int i = N * M - 1; i >= 0; i--){
		swap(ord[i], ord[ayahya()%(i+1)]);
	}
	swap(N,M);
	vector<bool> decided(N * M, false);
	vector<vector<int>> dango(M);
	for (int i = 0; i < M; i++){
		vector<int> cur;
		for (int _ = 0; _ < N * M; _++){
			int j = ord[_];
			if (decided[j]) cur.push_back(j);
		}
		vector<int> h;
		function<void(int,int,int)> solve = [&](int l, int r, int c)->void{
			if (c == 0) return;
			vector<int> fail;
				for (int i = 0; i < h.size(); i++){
					fail.push_back(h[i]);
					if (Query(concat(cur, fail))){
						decided[h[i]] = true;
						fail.pop_back();
					}
				}
				return;
		};
		for (int _ = 0; _ < N * M; _++){
			int j = ord[_];
			if (decided[j]) continue;
			h.push_back(j);
		}
		if (h.size() > 0){
			solve(0,h.size()-1,Query(concat(cur,h)));
			for (auto it : h){
				if (decided[it]) dango[i].push_back(it);
				else cur.push_back(it);
			}
			h.clear();
		}
	}
	for (int i = 0; i < N; i++){
		vector<int> a;
		for (int j = 0; j < M; j++){
			a.push_back(dango[j][i]+1);
		}
		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...