# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
661269 | 2022-11-25T06:29:00 Z | Alex_tz307 | Super Dango Maker (JOI22_dango3) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> //#include "dango3.h" using namespace std; const int kLog = 4; void Solve(int N, int M) { vector<vector<int>> groups(M); auto check = [&](const vector<int> &a) -> bool { vector<bool> mark(1 + N * M); for (const int &x : a) { mark[x] = true; } vector<int> q; for (int i = 1; i <= N * M; ++i) { if (!mark[i]) { q.emplace_back(i); } } int res = M - Query(q); return (res == 2); }; for (int i = 1; i <= N * M; ++i) { int colour = 0; if (i != 1) { for (int k = kLog; k >= 0; --k) { int newColour = (colour | (1 << k)); if (newColour < M) { groups[newColour - 1].emplace_back(i); if (check(groups[newColour - 1])) { colour = newColour; } groups[newColour - 1].pop_back(); } } } groups[colour].emplace_back(i); } for (int i = 0; i < M; ++i) { Answer(groups[i]); } }