# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
946883 | 2024-03-15T07:11:48 Z | mansur | Amusement Park (JOI17_amusement_park) | C++17 | 0 ms | 0 KB |
#include "Ioi.h" #include<bits/stdc++.h> using namespace std; #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define sz(a) (int)a.size() #define s second #define f first using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int Nn = 1e4; int dd[2][Nn], nxt[Nn], prv[Nn]; vector<int> gg[Nn]; int gett(int x, int k, int n) { for (int i = 0; i < n; i++) dd[k][i] = -1; queue<int> q; q.push(x); int s = x; while (sz(q)) { x = q.front(); q.pop(); for (int to: gg[x]) { if (dd[k][to] == -1) { dd[k][to] = dd[k][x] + 1; prv[to] = x; q.push(to); } } } int mx = s; for (int i = 0; i < n; i++) { if (dd[k][i] > dd[k][mx]) { mx = i; } } while (mx != s) { nxt[prv[mx]] = mx; mx = prv[mx]; } return mx; } long long Ioi(int N, int M, int A[], int B[], int p, int v, int T) { for (int i = 0; i < M; i++) { gg[A[i]].push_back(B[i]); gg[B[i]].push_back(A[i]); } int a = gett(0, 0, N); ll ans = 0; int b = gett(a, 1, N); for (int i = 1; i <= 60; i++) { ll b = (dd[1][p] % 60); if (v) ans += (1ll << b); bool ok = 0; for (int to: gg[p]) { if (dd[1][to] + 1 == dd[1][p]) { v = Move(to); p = to; ok = 1; break; } } if (!ok) { ans = 0; for (ll j = 0; j < 60; j++) { ans += (1ll << j) * v; v = Move(nxt[p]); p = nxt[p]; } return ans; } } return ans; }