# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
952172 | vjudge1 | Tropical Garden (IOI11_garden) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, m, p, Q, fir[N], sec[N], to[N], q[N], dis[N], cnt[N], sum[N], ans[N];
void add(int u, int v) {
if (!fir[u])
fir[u] = v;
else if (!sec[u])
sec[u] = v;
}
void dfs(int p, int ed) {
if (dis[p] != -1)
return;
dis[p] = -1e9;
if (to[p] == ed)
dis[p] = 1;
else {
dfs(to[p], ed);
if (dis[to[p]] <= -1e8)
dis[p] = -1e9;
else
dis[p] = dis[to[p]] + 1;
}
}
int main() {
scanf("%d %d %d", &n, &m, &p);
p++;
for (int i = 1, u, v; i <= m; i++) {
scanf("%d %d", &u, &v);
u++, v++;
add(u, v);
add(v, u);
}
for (int i = 1; i <= n; i++) {
to[i] = (fir[fir[i]] == i) * n + fir[i];
if (!sec[i])
to[i + n] = to[i];
else
to[i + n] = (fir[sec[i]] == i) * n + sec[i];
}
scanf("%d", &Q);
for (int i = 1; i <= Q; i++) scanf("%d", &q[i]);
for (int i = 0; i <= 1; i++) {
memset(dis, -1, sizeof(dis));
memset(sum, 0, sizeof(sum));
memset(cnt, 0, sizeof(cnt));
int now = i * n + p;
for (int j = 1; j <= n; j++) dfs(j, now);
dfs(now, now);
for (int j = 1; j <= n; j++)
if (dis[j] > 0) {
sum[dis[j]]++;
if (dis[now] > 0)
cnt[dis[j] % dis[now]]++;
}
if (dis[now] > 0)
for (int j = dis[now]; j < 2 * n; j++) sum[j] += sum[j - dis[now]];
for (int j = 1; j <= Q; j++)
if (q[j] < 2 * n)
ans[j] += sum[q[j]];
else if (dis[now] > 0)
ans[j] += cnt[q[j] % dis[now]];
}
for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
}