# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
739950 | rominanafu | Tropical Garden (IOI11_garden) | C++11 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
typedef long long ll;
int m;
pii s[150005];
bool vis[300005];
short p_fin[300005];
ll dist[300005];
int sig[300005];
int queries, caso, resp;
int calc_dist_fin (int act, int &fin) {
if (vis[act])
return INT_MAX;
if (dist[act] != -1)
return dist[act];
vis[act] = true;
dist[act] = calc_dist_fin(sig[act], fin) + 1;
p_fin[act] = p_fin[sig[act]];
return dist[act];
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
memset(s, -1, sizeof(s));
memset(dist, -1, sizeof(dist));
memset(p_fin, -1, sizeof(p_fin));
int n, fin;
cin >> n >> m; /// trail 0 > trail 1 > trail 2... (in beauty)
cin >> fin;
int a, b;
while (m--) {
cin >> a >> b;
if (s[a].first == -1) {
s[a].first = b;
} else if (s[a].second == -1) {
s[a].second = b;
}
if (s[b].first == -1) {
s[b].first = a;
} else if (s[b].second == -1) {
s[b].second = a;
}
}
/// armar grafo:
for(int i=0; i<n; i++) {
if (s[i].second == -1)
s[i].second = s[i].first;
sig[i] = s[i].first;
if (s[s[i].first].first == i) {
sig[i] += n;
}
sig[i+n] = s[i].second;
if (s[s[i].second].first == i) {
sig[i+n] += n;
}
}
dist[fin] = 0;
dist[fin+n] = 0;
p_fin[fin] = fin;
p_fin[fin+n] = fin+n;
for(int i=0; i<n*2; i++) {
if (dist[i] == -1) {
memset(vis, false, sizeof(vis));
dist[i] = calc_dist_fin(i, fin);
}
}
if (p_fin[sig[fin]] == 0) {
dist[fin] = INT_MAX;
} else {
dist[fin] = dist[sig[fin]] + 1;
p_fin[fin] = p_fin[sig[fin]];
}
if (p_fin[sig[fin+n]] == 0) {
dist[fin+n] = INT_MAX;
} else {
dist[fin+n] = dist[sig[fin+n]] + 1;
p_fin[fin+n] = p_fin[sig[fin+n]];
}
int x, c, restar;
cin >> queries;
while (queries--) {
cin >> c;
resp = 0;
for(int i=0; i<n; i++) {
if (p_fin[i] == -1) /// nunca llegó a P
continue;
caso = c;
if (dist[i] <= caso) {
x = i;
caso -= dist[x];
x = p_fin[x];
restar = dist[x];
x = p_fin[x];
restar = dist[x];
x = p_fin[x];
if (caso >= restar) {
caso -= (caso/restar) * restar;
}
while (caso > 0) {
caso -= dist[x];
x = p_fin[x];
}
if (caso == 0) {
resp++;
}
}
}
cout << resp << ' ';
}
return 0;
}
/**
7 8 5
4 5
5 6
0 1
1 2
2 3
3 6
3 4
4 6
11
1 2 3 4 5 6 7 8 9 10 11
**/