Submission #824818

#TimeUsernameProblemLanguageResultExecution timeMemory
824818QwertyPiCop and Robber (BOI14_coprobber)C++14
60 / 100
1115 ms262144 KiB
#include "coprobber.h"
#include <bits/stdc++.h>

using namespace std;

struct state{
    int u, v, t;
    int operator()() const {
        return u * MAX_N * 2 + v * 2 + t;
    }
    string print() const {
        string r;
        r += "(";
        r += to_string(u);
        r += ", ";
        r += to_string(v);
        r += ", ";
        r += to_string(t);
        r += ")";
        return r;
    }
};

int N;
bool w[MAX_N * MAX_N * 2];
state nxt[MAX_N * MAX_N * 2];
vector<int> G[MAX_N * MAX_N * 2], H[MAX_N * MAX_N * 2];
int deg[MAX_N * MAX_N * 2];
bool added[MAX_N * MAX_N * 2];
int A[MAX_N][MAX_N];

void add_edge(const state& u, const state& v){
    // cout << "Edge: " << u.print() << " -> " << v.print() << endl;
    G[u()].push_back(v()); if(w[v()] == true) deg[u()]++;
    H[v()].push_back(u());
}

int pos = -1;
int start(int N, bool A[MAX_N][MAX_N])
{
    ::N = N;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            ::A[i][j] = A[i][j];
        }
    }

    for(int u = 0; u < N; u++){
        for(int v = 0; v < N; v++){
            for(int t = 0; t < 2; t++){
                state st {u, v, t};
                if(u == v) w[st()] = true;
            }
        }
    }
    for(int u = 0; u < N; u++){
        for(int v = 0; v < N; v++){
            for(int t = 0; t < 2; t++){
                state st {u, v, t};
                if(u == v) continue;
                if(t == 0){
                    for(int i = 0; i < N; i++){
                        if(A[u][i] || i == u){
                            state st2 {i, v, !t};
                            add_edge(st, st2);
                        }
                    }
                }else{
                    for(int i = 0; i < N; i++){
                        if(A[v][i]){
                            state st2 {u, i, !t};
                            add_edge(st, st2);
                        }
                    }
                }
            }
        }
    }

    vector<int> det;
    
    for(int u = 0; u < N; u++){
        for(int v = 0; v < N; v++){
            for(int t = 0; t < 2; t++){
                state st {u, v, t};
                bool alr_win = false;
                if(t == 0){
                    for(int i = 0; i < N; i++){
                        if(A[u][i] && i == v) alr_win = true;
                    }
                }
                if(u != v && (G[st()].size() == deg[st()] || alr_win)){
                    det.push_back(st()); added[st()] = true;
                }
            }
        }
    }

    while(det.size()){
        int k = det.back(); det.pop_back();
        int u = k / 2 / MAX_N;
        int v = k / 2 % MAX_N;
        int t = k % 2;
        state st {u, v, t};
        if(t == 0){
            bool exist_win = false;
            for(int i = 0; i < N; i++){
                if(A[u][i] || i == u){
                    state st2 {i, v, !t};
                    exist_win |= w[st2()];
                    if(w[st2()]) nxt[st()] = st2;
                }
            }
            w[st()] = exist_win;
        }else{
            bool all_win = true;
            for(int i = 0; i < N; i++){
                if(A[v][i]){
                    state st2 {u, i, !t};
                    all_win &= w[st2()];
                }
            }
            w[st()] = all_win;
        }

        for(auto st2 : H[st()]){
            if(added[st2]) continue;
            deg[st2]++; 
            if(deg[st2] == G[st2].size()) added[st2] = true, det.push_back(st2);
            else if((!t) == 0 && w[st()] == 1) added[st2] = true, det.push_back(st2);
            else if((!t) == 1 && w[st()] == 0) added[st2] = true, det.push_back(st2);
        }
    }

    for(int i = 0; i < N; i++){
        bool all_win = true;
        for(int j = 0; j < N; j++){
            state st {i, j, 0};
            all_win &= w[st()];
        }
        if(all_win){
            pos = i;
            return i;
        }
    }
    return -1;
}

int nextMove(int R)
{
    state st {pos, R, 0};
    state st2 = nxt[st()];
    pos = st2.u;
    return pos;
}

Compilation message (stderr)

coprobber.cpp: In function 'int start(int, bool (*)[500])':
coprobber.cpp:92:46: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   92 |                 if(u != v && (G[st()].size() == deg[st()] || alr_win)){
      |                               ~~~~~~~~~~~~~~~^~~~~~~~~~~~
coprobber.cpp:129:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |             if(deg[st2] == G[st2].size()) added[st2] = true, det.push_back(st2);
      |                ~~~~~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...