QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#339386 | #4218. Hidden Graph | hos_lyric | RE | 0ms | 0kb | C++14 | 3.3kb | 2024-02-27 10:39:44 | 2024-02-27 10:39:44 |
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
int N;
vector<int> A, B;
vector<vector<int>> graph;
void ae(int u, int v) {
A.push_back(u);
B.push_back(v);
graph[u].push_back(v);
graph[v].push_back(u);
}
int main() {
scanf("%d", &N);
graph.assign(N, {});
for (int n = 0; n < N; ++n) {
// (K+1)-coloring of [0, n)
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> que;
vector<int> deg(n);
for (int u = 0; u < n; ++u) {
que.emplace(deg[u] = graph[u].size(), u);
}
int K = 0;
vector<int> us;
vector<int> vis(n, 0);
for (; que.size(); ) {
const int c = que.top().first;
const int u = que.top().second;
que.pop();
if (deg[u] == c) {
chmax(K, deg[u]);
us.push_back(u);
vis[u] = 1;
for (const int v : graph[u]) if (!vis[v]) {
que.emplace(--deg[v], v);
}
}
}
vector<int> colors(N, -1);
reverse(us.begin(), us.end());
for (const int u : us) {
vector<int> used(K + 1, 0);
for (const int v : graph[u]) if (~colors[v]) {
used[colors[v]] = 1;
}
for (int k = 0; k < K + 1; ++k) if (!used[k]) {
colors[u] = used[k];
break;
}
assert(~colors[u]);
}
vector<vector<int>> uss(K + 1);
for (int u = 0; u < n; ++u) {
uss[colors[u]].push_back(u);
}
// add n: at most (K+1) failure
for (int k = 0; k < K + 1; ++k) {
set<int> se(uss[k].begin(), uss[k].end());
for (; se.size(); ) {
printf("? %d %d", 1 + (int)se.size(), n + 1);
for (const int u : se) printf(" %d", u + 1);
puts("");
fflush(stdout);
int a, b;
scanf("%d%d", &a, &b);
--a;
--b;
if (a < 0) {
break;
} else {
if (a != n) swap(a, b);
assert(a == n);
ae(n, b);
assert(se.erase(b));
}
}
}
}
printf("! %d\n", (int)A.size());
for (int i = 0; i < (int)A.size(); ++i) {
printf("%d %d\n", A[i] + 1, B[i] + 1);
}
fflush(stdout);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
3 1 2 1 2
output:
? 2 2 1 ? 3 3 1 2