제출 #1323299

#제출 시각아이디문제언어결과실행 시간메모리
1323299nikaa123Tropical Garden (IOI11_garden)C++20
0 / 100
1 ms568 KiB
#include <bits/stdc++.h> #include "garden.h" #include "gardenlib.h" using namespace std; void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { vector <vector<pair<int,int>>> res(N); for (int i = 0; i < M; i++) { int u = R[i][0]; int v = R[i][1]; res[v].emplace_back(i,u); res[u].emplace_back(i,v); } for (int i = 0; i < N; i++) { sort(res[i].begin(),res[i].end()); } int to[2*N]; for (int i = 0; i < N; i++) { int best = res[i][0].second; int scbest = (res[i].size() > 1) ? res[i][1].second : best; if (res[best][0].second == i) { to[i] = best + N; } else { to[i] = best; } if (res[scbest][0].second == i) { to[i+N] = scbest + N; } else { to[i+N] = scbest; } } int clen = 0; int used[2*N]; for (int i = 0; i < 2*N; i++) used[i] = 0; int cur = P; used[cur] = 1; int cnt = 1; while (!used[to[cur]]) { cur = to[cur]; cnt++; } if (to[cur] == P) clen = cnt; int clen1 = 0; for (int i = 0; i < 2*N; i++) used[i] = 0; cur = P+N; used[cur] = 1; cnt = 1; while (!used[to[cur]]) { cur = to[cur]; cnt++; } if (to[cur] == P+N) clen1 = cnt; vector <vector<int>> v(2*N); for (int i = 0; i < 2*N; i++) { v[to[i]].emplace_back(i); } queue <int> q; q.push(P); int d[2*N]; for (int i = 0; i < 2*N; i++) d[i] = INT_MAX; d[P] = 0; while (!q.empty()) { int f = q.front(); q.pop(); for (auto to:v[f]) { if (d[to] > d[f] + 1) { d[to] = d[f] + 1; q.push(to); } } } q.push(P+N); int d1[2*N]; for (int i = 0; i < 2*N; i++) d1[i] = INT_MAX; d1[P+N] = 0; while (!q.empty()) { int f = q.front(); q.pop(); for (auto to:v[f]) { if (d1[to] > d1[f]+1) { d1[to] = d1[f] + 1; q.push(to); } } } bool ok[2*N]; bool ok1[2*N]; for (int q = 0; q < Q; q++) { int k = G[q]; for (int i = 0; i < 2*N; i++) { if (clen == 0) { ok[i] = (k == d[i]); continue; } ok[i] = (k >= d[i] && (k-d[i])%clen == 0); } for (int i = 0; i < 2*N; i++) { if (clen1 == 0) { ok1[i] = (k == d1[i]); continue; } ok1[i] = (k >= d1[i] && (k-d1[i])%clen1 == 0); } int ans = 0; for (int i = 0; i < N; i++) { ans += (ok[i] || ok[i+N] || ok1[i] || ok1[i+N]); } answer(ans); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...