結果
| 問題 | No.3400 Nana's Plus Permutation Game (7 + 7) ÷ 7 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-07 22:14:45 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 6,087 bytes |
| 記録 | |
| コンパイル時間 | 2,468 ms |
| コンパイル使用メモリ | 217,908 KB |
| 実行使用メモリ | 26,368 KB |
| 平均クエリ数 | 20104.03 |
| 最終ジャッジ日時 | 2025-12-07 22:16:09 |
| 合計ジャッジ時間 | 83,296 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 36 RE * 41 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
struct Weighted_dsu {
public:
Weighted_dsu() : _n(0) {}
Weighted_dsu(int n) : _n(n), num_component(n), parent_or_size(n, -1), diff_weight(n) {}
bool merge(int a, int b, long long w) {
assert(0 <= a && a < _n);
assert(0 <= b && b < _n);
int x = leader(a), y = leader(b);
w += diff_weight[a] - diff_weight[b];
if(x == y) return w == 0;
if (-parent_or_size[x] < -parent_or_size[y]) std::swap(x, y), w *= -1;
parent_or_size[x] += parent_or_size[y];
parent_or_size[y] = x;
diff_weight[y] = w;
num_component--;
return true;
}
long long diff(int a, int b) {
assert(same(a, b));
return diff_weight[b] - diff_weight[a];
}
bool same(int a, int b) {
assert(0 <= a && a < _n);
assert(0 <= b && b < _n);
return leader(a) == leader(b);
}
int leader(int a) {
assert(0 <= a && a < _n);
if (parent_or_size[a] < 0) return a;
int r = leader(parent_or_size[a]);
diff_weight[a] += diff_weight[parent_or_size[a]];
return parent_or_size[a] = r;
}
int size() {
return num_component;
}
int size(int a) {
assert(0 <= a && a < _n);
return -parent_or_size[leader(a)];
}
std::vector<std::vector<int>> groups() {
std::vector<int> leader_buf(_n), group_size(_n);
for (int i = 0; i < _n; i++) {
leader_buf[i] = leader(i);
group_size[leader_buf[i]]++;
}
std::vector<std::vector<int>> result(_n);
for (int i = 0; i < _n; i++) {
result[i].reserve(group_size[i]);
}
for (int i = 0; i < _n; i++) {
result[leader_buf[i]].push_back(i);
}
result.erase(
std::remove_if(result.begin(), result.end(),
[&](const std::vector<int>& v) { return v.empty(); }),
result.end());
return result;
}
int _n, num_component;
std::vector<int> parent_or_size;
std::vector<int> diff_weight;
};
//#define DBG
#ifndef DBG
int ask(int u, int v){
int res;
cout << "1 " << u + 1 << ' ' << v + 1 << endl;
cin >> res;
if(res == -1) return -1;
res--;
return res;
}
#else
vector<int> a = {2, 3, 4, 1, 5};
int ask(int u, int v){
int res;
cout << "1 " << u + 1 << ' ' << v + 1 << endl;
int vl = a[u] + a[v];
for(int i = 0; i < a.size(); i++){
if(a[i] == vl) return i;
}
return -1;
}
#endif
void solve(){
int n;
#ifndef DBG
cin >> n;
#else
n = a.size();
#endif
auto check = [&](vector<int> ans){
int n = ans.size();
vector<bool> used(n + 1);
for(int i = 0; i < n; i++){
if(ans[i] > n) return false;
if(used[ans[i]]) return false;
used[ans[i]] = true;
}
return true;
};
vector<vector<tuple<int,int,int>>> T;
vector<int> cand(n, -1);
Weighted_dsu uf(n);
vector<bool> used(n, true);
auto f = [&](int p){
int cnt = 0;
vector<bool> es(n);
vector<tuple<int,int,int>> T2;
used[p] = false;
for(int i = 0; i < n; i++){
if(i == p) continue;
int u = ask(p, i);
T2.emplace_back(p, i, u);
if(u == -1){
cnt++;
}else{
es[i] = true;
}
}
for(auto [p, u, v] : T2){
es[v] = false;
}
for(int i = 0; i < n; i++){
if(!used[i]) continue;
if(!es[i]) used[i] = false;
}
T.emplace_back(T2);
};
for(int i = 0; i < 3; i++){
int p = -1;
for(int j = 0; j < n; j++){
if(used[j]){
p = j;
break;
}
}
if(p != -1){
f(p);
}
}
auto dfs = [&](auto dfs, int turn, Weighted_dsu uf) -> bool {
if(turn == T.size()){
int mn = 0;
vector<int> ans(n);
for(int v = 0; v < n; v++){
ans[v] = uf.diff(0, v);
mn = min(mn, ans[v]);
}
for(int v = 0; v < n; v++){
ans[v] -= mn - 1;
}
if(check(ans)){
cout << "2";
for(int i = 0; i < n; i++) cout << ' ' << ans[i];
cout << endl;
return true;
}else{
return false;
}
}
int pos = get<0>(T[turn][0]);
int cnt0 = 0, cnt1 = 0;
for(auto [p, u, v] : T[turn]){
if(v == -1) cnt1++;
else cnt0++;
}
if(cnt1 == cnt0){
{
auto uf2 = uf;
cand[pos] = cnt1;
for(auto [p, u, v] : T[turn]){
if(v == -1) continue;
uf2.merge(u, v, cnt1);
if(cand[u] != -1) uf2.merge(p, v, cand[u]);
}
if(dfs(dfs, turn + 1, uf2)) return true;
}
{
auto uf2 = uf;
cand[pos] = cnt1 + 1;
for(auto [p, u, v] : T[turn]){
if(v == -1) continue;
uf2.merge(u, v, cnt1 + 1);
if(cand[u] != -1) uf2.merge(p, v, cand[u]);
}
if(dfs(dfs, turn + 1, uf2)) return true;
}
cand[pos] = -1;
}else{
if(cnt1 > cnt0) cnt1++;
cand[pos] = cnt1;
for(auto [p, u, v] : T[turn]){
if(v == -1) continue;
uf.merge(u, v, cnt1);
if(cand[u] != -1) uf.merge(p, v, cand[u]);
}
if(dfs(dfs, turn + 1, uf)) return true;
cand[pos] = -1;
}
return false;
};
assert(dfs(dfs, 0, uf));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--) solve();
}