社区讨论

求 hack

P15267「UTOI 1B」Chaotic Time Trio参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mlhvnya2
此快照首次捕获于
2026/02/11 18:19
4 周前
此快照最后确认于
2026/02/13 15:50
3 周前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 2e5 + 5;

int t, n, a[N], sum0, sum1;
vector<int> s, v;
vector<pair<int, int>> ans;
bool flag = 0;
bool vis[10];

bool A(int op){
    if(sum0 >= 2 && op == 1){
        sum0 -= 2;
        ans.push_back({0, 0});
        sum1++;
        return 1;
    }
    if(sum0 >= 1 && sum1 >= 1 && op == 2){
        sum0--, sum1--;
        ans.push_back({0, 1});
        s.push_back(2);
        return 1;
    }
    if(sum1 >= 2 && op == 3){
        sum1 -= 2;
        ans.push_back({1, 1});
        sum0++;
        return 1;
    }
    if(sum0 >= 1 && s.size() && op == 4){
        sum0--;
        ans.push_back({0, s.back()});
        sum1++;
        s.pop_back();
        return 1;
    }
    if(sum1 >= 1 && s.size() && op == 5){
        sum1--;
        ans.push_back({1, s.back()});
        sum0++;
        s.pop_back();
        return 1;
    }
    if(s.size() >= 2 && op == 6){
        ans.push_back({s.back(), s[s.size() - 2]});
        sum0++;
        s.pop_back(), s.pop_back();
        return 1;
    }
    return 0;
}

void dfs(int u){
    if(flag) return ;
    if(u == 7){
        sum0 = sum1 = 0;
        s.clear(), ans.clear();
        for(int i = 1; i <= n; i++){
            if(a[i] == 0) sum0++;
            else if(a[i] == 1) sum1++;
            else s.push_back(a[i]);
        }
        for(int i = 1; i < n; i++){
            bool f = 0;
            for(int j = 0; j < v.size(); j++){
                if(A(v[j])){
                    f = 1;
                    break;
                }
            }
            if(!f) break;
        }
        if(sum0 != 1 || sum1 || s.size()){
            return ;
        }
        for(pair<int, int> p : ans) cout << p.first << ' ' << p.second << '\n';
        flag = 1;
        return ;
    }
    for(int i = 1; i <= 6; i++){
        if(!vis[i]){
            v.push_back(i), vis[i] = 1;
            dfs(u + 1);
            v.pop_back(), vis[i] = 0;
        }
    }
}

void solve(){
    cin >> n;
    int f = 0;
    for(int i = 1; i <= n; i++) cin >> a[i], f |= (a[i] != 0);
    if(!f){
        if(n == 1){
            return ;
        }
        if(n < 4){
            cout << "-1\n";
            return ;
        }
        cout << "0 0\n";
        int pre = a[1];
        for(int i = 2; i <= n - 2; i++){
            cout << pre << ' ' << a[i] << '\n';
            pre = (pre == 0 ? 1 : (pre == 1 ? 2 : 1));
        }
        cout << pre << ' ' << 1 << '\n';
        return ;
    }
    flag = 0, dfs(1);
    if(!flag) cout << "-1\n";
}

int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> t;
    while(t--) solve();
    return 0;
}
上述代码在赛时过了,本人不太清楚他的先后顺序,就想了这个投机取巧的办法。但奇怪的是当把特殊性质 A 的判断删掉后性质 A 的第二个点会错,只有 90 分。
本人想询问一下问题所在,解决必关。
⎛⎝≥⏝⏝≤⎛⎝
注意:(不要讲些什么这肯定错了的话语,带点依据可以吗……)。

回复

1 条回复,欢迎继续交流。

正在加载回复...