# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
739952 | rominanafu | Tropical Garden (IOI11_garden) | C++11 | 345 ms | 11076 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 "garden.h"
#include "gardenlib.h"
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
typedef long long ll;
pii s[150005];
bool vis[300005];
short p_fin[300005];
ll dist[300005];
int sig[300005];
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];
}
void count_routes(int n, int m, int fin, int R[][2], int queries, int G[])
{
memset(s, -1, sizeof(s));
memset(dist, -1, sizeof(dist));
memset(p_fin, -1, sizeof(p_fin));
int a, b;
for(int i=0; i<m; i++) {
a = R[i][0];
b = R[i][1];
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;
}
}
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]] == -1) {
dist[fin] = INT_MAX;
p_fin[fin] = -1;
} else {
dist[fin] = dist[sig[fin]] + 1;
p_fin[fin] = p_fin[sig[fin]];
}
if (p_fin[sig[fin+n]] == -1) {
dist[fin+n] = INT_MAX;
p_fin[fin+n] = -1;
} else {
dist[fin+n] = dist[sig[fin+n]] + 1;
p_fin[fin+n] = p_fin[sig[fin+n]];
}
int x, resp, caso, restar;
for(int k=0; k<queries; k++) {
resp = 0;
for(int i=0; i<n; i++) {
if (p_fin[i] == -1) /// nunca llegó a P
continue;
caso = G[k];
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++;
}
}
}
answer(resp);
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |