제출 #861510

#제출 시각아이디문제언어결과실행 시간메모리
861510Ellinor경찰관과 강도 (BOI14_coprobber)C++14
100 / 100
608 ms20740 KiB
#include "coprobber.h"

#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("Ofast,inline") // Ofast = O3,fast-math,allow-store-data-races,no-protect-parens
#pragma GCC optimize ("unroll-loops")

#pragma GCC target("bmi,bmi2,lzcnt,popcnt")                      // bit manipulation
#pragma GCC target("movbe")                                      // byte swap
#pragma GCC target("aes,pclmul,rdrnd")                           // encryption
#pragma GCC target("avx,avx2,f16c,fma,sse3,ssse3,sse4.1,sse4.2")

typedef long long ll;
#define rep(i, a, b) for (int i = (a); i < int(b); i++)
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define pb push_back

// inline void fast() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); }

ll INF = 1e15;
ll mod = 1e9 + 7;

// #define int ll
#define float double

int n;
vector<vector<int>> adj;
int cat = -1;

vector<vector<vector<pii>>> dp;
queue<array<int, 3>> q;

vector<vector<int>> r_edges_left;

void sol(int C, int R, int T)
{
    // cerr << C << " " << R << " " << T << "\n";
    
    if (T == 1) {
        for (int i : adj[R]) {
            r_edges_left[C][i]--;
            // cerr << "-- " << C << " " << i << " status : " << r_edges_left[C][i] << "\n";
            if (r_edges_left[C][i] == 0 && dp[C][i][0].first == -1) {
                q.push({C, i, 0});
            }
        }
    }

    else if (T == 0) {
        if (dp[C][R][1].first == -1) {
            dp[C][R][1].first = 1;
            dp[C][R][1].second = C;
            q.push({C, R, 1});
        }
        dp[C][R][0].first = 1;
        for (int i : adj[C]) {
            if (dp[i][R][1].first == -1) {
                dp[i][R][1].first = 1;
                dp[i][R][1].second = C;
                q.push({i, R, 1});
            }
        }
    }
}


int start(int N, bool A[MAX_N][MAX_N])
{
    n = N;
    adj.assign(n, {});
    rep(i,0,n) {
        rep(j,i + 1,n) {
            if (A[i][j]) {
                adj[i].pb(j);
                adj[j].pb(i);
            }
        }
    }

    dp.assign(n, vector<vector<pii>>(n, vector<pii>(2, {-1, -1})));
    rep(i,0,n) {
        q.push({i, i, 0});
        q.push({i, i, 1});
        dp[i][i][0].first = 1;
        dp[i][i][1].first = 1;
    }

    r_edges_left.assign(n, vector<int>(n, -1));
    rep(i,0,n) {
        rep(j,0,n) {
            r_edges_left[i][j] = adj[j].size();
        }
    }

    while (!q.empty()) {
        auto x = q.front();
        q.pop();
        sol(x[0], x[1], x[2]);
    }

    // rep(i,0,n) {
    //     rep(j,0,n) {
    //         rep(k,0,2) {
    //             cerr << dp[i][j][k].first << " ";
    //         }
    //         cerr << endl;
    //     }
    //     cerr << endl;
    // }

    rep(i,0,n) {
        bool w = true;
        rep(j,0,n) {
            if (dp[i][j][1].first != 1) w = false;
        }
        if (w) {
            return cat = i;
        }
    }

    return -1;
}

int nextMove(int R)
{
    if (cat == R) return cat; //
    return cat = dp[cat][R][1].second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...