# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
587049 | MohamedFaresNebili | 열대 식물원 (Tropical Garden) (IOI11_garden) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "garden.h"
#include "gardenlib.h"
/// #pragma GCC optimize ("Ofast")
/// #pragma GCC target ("avx2")
/// #pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
using ii = pair<ll, ll>;
using vi = vector<int>;
#define ff first
#define ss second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lb lower_bound
const int oo = 1000 * 1000 * 1000 + 7;
void answer(int X) { cout << X << " "; }
int C[2], to[300005], D[300005], DD[300005];
int vis[300005], Vis[300005];
vector<int> adj[300005], E[300005];
void solve(int v) {
queue<int> Q; Q.push(v); D[v] = 0; int u = v;
while(vis[u] == 0) {
vis[u] = 1; u = to[u];
}
while(vis[u] != 2) {
vis[u] = 2; u = to[u]; C[0]++;
}
if(vis[v] != 2) C[0] = -1;
while(!Q.empty()) {
int A = Q.front(); Q.pop();
for(auto e : adj[A]) {
if(D[e] <= D[A] + 1) continue;
D[e] = D[A] + 1; Q.push(e);
}
}
}
void Solve(int v) {
queue<int> Q; Q.push(v); DD[v] = 0; int u = v;
while(Vis[u] == 0) {
Vis[u] = 1; u = to[u];
}
while(Vis[u] != 2) {
Vis[u] = 2; u = to[u]; C[1]++;
}
if(Vis[v] != 2) C[1] = -1;
while(!Q.empty()) {
int A = Q.front(); Q.pop();
for(auto e : adj[A]) {
if(DD[e] <= DD[A] + 1) continue;
DD[e] = DD[A] + 1; Q.push(e);
}
}
}
void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) {
memset(to, -1, sizeof to);
fill(D, D + 2 * N, oo); fill(DD, DD + 2 * N, oo);
for(int l = 0; l < M; l++) {
int U = R[l][0], V = R[l][1];
if(E[U].size() < 2) E[U].pb(V);
if(E[V].size() < 2) E[V].pb(U);
}
for(int l = 0; l < N; l++) {
D[l] = DD[l] = oo;
for(int i = 0; i < E[l].size(); i++) {
int U = E[l][i];
if(i == 0) {
to[l] = U;
if(E[U][0] == l && E[U].size() > 1)
to[l] = U + N, U += N;
adj[U].pb(l);
continue;
}
to[l + N] = U;
if(E[U][0] == l && E[U].size() > 1)
to[l + N] = U + N, U += N;
adj[U].pb(l + N);
}
}
solve(P); Solve(P + N);
for(int l = 0; l < Q; l++) {
int T = G[l]; int res = 0;
for(int i = 0; i < N; i++) {
if(C[0] == -1 && D[i] == T) res++;
else if(C[0] > 0 && T >= D[i] && (T - D[i]) % C[0] == 0) res++;
else if(C[1] == -1 & DD[i] == T) res++;
else if(C[1] > 0 && T >= DD[i] && (T - DD[i]) % C[1] == 0) res++;
}
answer(res);
}
}