1 条题解

  • 0
    @ 2026-5-7 14:36:07
    #include <bits/stdc++.h>
    
    #include "coprobber.h"
    using namespace std;
    const int MAXN = 510;
    int n, id[MAXN][MAXN][2], tot, val[MAXN][MAXN][2], hd, tl, deg[MAXN];
    int num[MAXN][MAXN][2], now, nxt[MAXN][MAXN];
    tuple<int, int, int> qu[MAXN * MAXN * 2];
    vector<int> g[MAXN];
    int start(int _n, bool a[MAX_N][MAX_N]) {
        n = _n;
        for(int i=1;i<=n;++i)
    		for(int j=1;j<=n;++j)
    			if(a[i-1][j-1])g[i].push_back(j);
        for(int i=1;i<=n;++i)
    		for(int j=0;j<2;++j)
    			val[i][i][j]=1,qu[++tl]=make_tuple(i,i,j);
        hd = 1;
        while (hd <= tl) {
            int u, v, d;
            tie(u, v, d) = qu[hd++];
            if (!d) {
                for (auto w : g[v]) {
                    if (++num[u][w][1] == (int)g[w].size()) {
                        val[u][w][1] = 1;
                        qu[++tl] = {u, w, 1};
                    }
                }
            } else {
                if (!val[u][v][0]) {
                    val[u][v][0] = 1;
                    nxt[u][v] = u;
                    qu[++tl] = {u, v, 0};
                }
                for (auto w : g[u]) {
                    if (val[w][v][0]) continue;
                    val[w][v][0] = 1;
                    nxt[w][v] = u;
                    qu[++tl] = {w, v, 0};
                }
            }
        }
        for (int i = 1; i <= n; ++i) {
            bool flag = false;
            for (int j = 1; j <= n; ++j) {
                if (!val[i][j][0]) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                now = i;
                return i - 1;
            }
        }
        return -1;
    }
    int nextMove(int r) {
        now = nxt[now][r + 1];
        return now - 1;
    }
    
    • 1

    信息

    ID
    10557
    时间
    1500ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者