# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
130655 | 2019-07-15T19:13:29 Z | tutis | Amusement Park (JOI17_amusement_park) | C++17 | 0 ms | 0 KB |
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; mt19937_64 rng(1561561); int bitas[11000]; vector<int>adj[11000]; set<int>aplankyta; int t = 0; void dfs(int v) { t++; t %= 60; bitas[v] = t; if (aplankyta.count(v)) return; aplankyta.insert(v); for (int x : adj[v]) { dfs(x); } } long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) { vector<int>PP(N); iota(PP.begin(), PP.end(), 0); shuffle(PP.begin(), PP.end(), mt19937_64(15651)); for (int i = 0; i < M; i++) { adj[A[i]].push_back(B[i]); adj[B[i]].push_back(A[i]); } for (int i = 0; i < N; i++) shuffle(adj[i].begin(), adj[i].end(), rng); dfs(0); ll X = 0; vector<int>stak = {P}; set<int>bitai; set<int>aplankyti; while (true) { X |= V * (1ll << bitas[P]); bitai.insert(bitas[P]); aplankyti.insert(P); if (bitai.size() == 60) break; int v1 = -1; for (int j : adj[P]) if (aplankyti.count(j) == false) v1 = j; if (v1 == -1) { stak.pop_back(); v1 = stak.back(); } else { stak.push_back(v1); } V = Move(v1); P = v1; } return X; }