제출 #584551

#제출 시각아이디문제언어결과실행 시간메모리
584551MohammadAghil경찰관과 강도 (BOI14_coprobber)C++17
60 / 100
856 ms262144 KiB
#include <bits/stdc++.h>
#include "coprobber.h"
using namespace std;

typedef long long ll;
typedef pair<int, int> pp;

#define rep(i,l,r) for(int i = (l); i < (r); i++)
#define per(i,r,l) for(int i = (r); i >= (l); i--)
#define sz(x) (int)x.size()
#define ff first
#define ss secounf 
#define all(x) begin(x), end(x)
#define pb push_back

const ll mod = 1e9+7, maxn = 5e2+1, inf = ll(1e9)+5;


struct state{
     int u, v, id;
     bool nb;
     state(){}
     state(int u, int v, int nb): u(u), v(v), nb(nb){ 
          id = (u*maxn + v)<<1|nb; 
     }
     state(int id): id(id){
          nb = id&1, id >>= 1;
          v = id%maxn, u = id/maxn;
     }
};

int n, cnt[maxn*maxn];
vector<int> adjr[maxn*maxn*2];
// bool win[maxn*maxn*2];
bitset<maxn*maxn*2> win;
int nxt[maxn*maxn], out[maxn*maxn];

void calc(){
     vector<int> winners;
     rep(i,0,n) rep(t,0,2) winners.pb(state(i, i, t).id), win[winners.back()] = true;
     while(sz(winners)){
          int r = winners.back(); winners.pop_back();
          state R(r);
          for(int c: adjr[r]){
               if(win[c]) continue;
               if(c&1) cnt[c>>1]++;
               state S(c); c >>= 1;
               if(S.nb){
                    if(cnt[c] == out[c]) {
                         winners.pb(S.id);
                         win[winners.back()] = true;
                    }
               }else winners.pb(S.id), nxt[c] = R.u, win[winners.back()] = true;
          }
     }
}

void add_edge(state a, state b){
     adjr[b.id].pb(a.id);
     if(a.id&1) out[a.id>>1]++;
}

state cr;

int nextMove(int r){
     cr = state(cr.u, r, 0);
     cr = state(nxt[cr.id>>1], r, 1);
     return cr.u;
}

int start(int n, bool A[MAX_N][MAX_N]){ ::n = n;
     rep(i,0,n) rep(j,0,n) {
          if(A[i][j]){
               rep(a,0,n) {
                    add_edge(state(a, i, 1), state(a, j, 0));
                    add_edge(state(i, a, 0), state(j, a, 1));
               }
          }
     }
     rep(i,0,n) rep(j,0,n) add_edge(state(i, j, 0), state(i, j, 1));
     rep(i,0,n) {
          add_edge(state(n, n, 0), state(i, n, 1)); 
          rep(j,0,n) add_edge(state(i, n, 1), state(i, j, 0));
     }
     calc();
     if(!win[state(n, n, 0).id]) return -1;
     cr = state(nxt[state(n, n, 0).id>>1], n, 1);
     return cr.u;
}

// int main(){
//      cin.tie(0) -> sync_with_stdio(0);
//      cin >> n;
//      rep(i,0,n) rep(j,0,n) {
//           bool k; cin >> k;
//           if(k){
//                rep(a,0,n) {
//                     add_edge(state(a, i, 1), state(a, j, 0));
//                     add_edge(state(i, a, 0), state(j, a, 1));
//                }
//           }
//      }
//      rep(i,0,n) rep(j,0,n) add_edge(state(i, j, 0), state(i, j, 1));
//      rep(i,0,n) {
//           add_edge(state(n, n, 0), state(i, n, 1)); 
//           rep(j,0,n) add_edge(state(i, n, 1), state(i, j, 0));
//      }
//      calc();
//      rep(i,0,n) rep(j,0,n) {
//           int ID = state(i, j, 0).id;
//           if(!win[ID]) cout << -1 << ' ';
//           else cout << i << ',' << j << ',' << nxt[ID] << ' ';
//           if(j == n-1) cout << '\n';
//      }
//      if(!win[state(n, n, 0).id]) return -1;
//      cr = state(nxt[state(n, n, 0).id], n, 1);


//      cout << '#' << cr.u << endl;
//      while(cr.u - cr.v || cr.u == n){
//           int a; cin >> a;
//           cout << '#' << nextMove(a) << endl;
//      }
//      return 0;
// }

/*
4
0 1 0 1
1 0 1 0 
0 1 0 1
1 0 1 0

3
0 1 1
1 0 1 
1 1 0

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...