题解:CF1687B Railway System
看到
然后,考虑模拟 Kruskal,那么难点在判断当前边是否是链接了已联通的连通块。
那么我们可以考虑询问当前最小生成森林上的边加上当前边。
如果相比之前(设此时最大生成森林权为
询问次数为
#include <bits/stdc++.h>
using namespace std;
int n, m;
pair<int, int> v[100010];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
string s;
for (int j = 1; j <= m; ++j)
if (j != i) s += '0';
else s += '1';
cout << "? " << s << endl;
cin >> v[i].first;
v[i].second = i;
}
sort(v + 1, v + 1 + m);
int la = v[1].first, sum = v[1].first;
string s;
for (int i = 1; i <= m; ++i)
if (i != v[1].second) s += '0';
else s += '1';
for (int i = 2; i <= m; ++i) {
string t = s;
t[v[i].second - 1] = '1';
cout << "? " << t << endl;
int val; cin >> val;
if (val - la != v[i].first) ;
else la = val, s = t, sum += v[i].first;
}
cout << "! " << la << endl;
return 0;
}