제출 #250550

#제출 시각아이디문제언어결과실행 시간메모리
250550opukittpceno_hhr경찰관과 강도 (BOI14_coprobber)C++17
60 / 100
750 ms262148 KiB
#ifndef COPROBBER_H #define COPROBBER_H #include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <algorithm> #include <string> #include <cmath> #include <cstdio> #include <iomanip> #include <fstream> #include <cassert> #include <cstring> #include <unordered_set> #include <unordered_map> #include <numeric> #include <ctime> #include <bitset> #include <complex> #include <chrono> #include <random> #include <functional> #define MAX_N 500 // modify the following functions // you can define global variables and functions using namespace std; vector<int> loose; vector<int> win; vector<int> cnt; vector<int> turn; vector<int> used; vector<vector<int>> g; vector<vector<int>> ig; void dfs(int v) { used[v] = 1; for (auto i : ig[v]) { if (used[i]) continue; if (loose[v]) { win[i] = 1; turn[i] = v; dfs(i); } else { cnt[i]--; if (cnt[i] == 0) { loose[i] = 1; dfs(i); } } } } int Nn, Cn; int start(int N, bool a[MAX_N][MAX_N]) { loose.clear(); win.clear(); cnt.clear(); g.clear(); ig.clear(); turn.clear(); used.clear(); int n = N; Nn = N; Cn = -1; loose.resize(2 * n * n); win.resize(2 * n * n); cnt.resize(2 * n * n); g.resize(2 * n * n); ig.resize(2 * n * n); turn.resize(2 * n * n, -1); used.resize(2 * n * n); for (int k = 0; k < 2 * n * n; k++) { int t = k / (n * n); int st = k % (n * n); int i = st / n; int j = st % n; if (t == 0) { //our move for (int to = 0; to < n; to++) { if (a[i][to] || i == to) { g[k].push_back(n * n + (to * n + j)); } } } else { //robber move for (int to = 0; to < n; to++) { if (a[j][to]) { g[k].push_back(i * n + to); } } } cnt[k] = (int)g[k].size(); } for (int i = 0; i < n; i++) { loose[n * n + i * n + i] = 1; } for (int i = 0; i < n; i++) { win[i * n + i] = 1; } for (int i = 0; i < 2 * n * n; i++) { for (auto j : g[i]) { ig[j].push_back(i); } } for (int i = 0; i < 2 * n * n; i++) { if (!used[i] && (win[i] || loose[i])) { dfs(i); } } for (int i = 0; i < n; i++) { int ok = 1; for (int j = 0; j < n; j++) { ok &= win[i * n + j]; } if (ok) { Cn = i; return i; } } return -1; } int nextMove(int r) { if (!win[Cn * Nn + r]) { return -1; } int next_state = turn[Cn * Nn + r]; next_state %= (Nn * Nn); Cn = next_state / Nn; return Cn; } #endif // COPROBBER_H
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...