이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//khodaya khodet komak kon
# include "gardenlib.h"
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <pii, int> ppi;
typedef pair <int, pii> pip;
typedef pair <pii, pii> ppp;
typedef pair <ll, ll> pll;
# define A first
# define B second
# define endl '\n'
# define sep ' '
# define all(x) x.begin(), x.end()
# define kill(x) return cout << x << endl, 0
# define SZ(x) int(x.size())
# define lc id << 1
# define rc id << 1 | 1
# define fast_io ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
ll power(ll a, ll b, ll md) {return (!b ? 1 : (b & 1 ? a * power(a * a % md, b / 2, md) % md : power(a * a % md, b / 2, md) % md));}
const int xn = 5e5 + 10;
const int xm = - 20 + 10;
const int sq = 320;
const int inf = 1e9 + 10;
const ll INF = 1e18 + 10;
const ld eps = 1e-15;
const int mod = 1e9 + 7;//998244353;
const int base = 257;
struct edge{
int from, to, tabe;
};
int n, ptr, ans[xn], a[xn], q;
edge E[xn];
vector <int> adj[2][xn], g[xn], jad;
vector <pii> que[xn];
bool is_good[xn], mark[xn];
deque <int> dq;
void DFS(int v){
dq.push_back(v);
if (mark[v])
return;
mark[v] = true;
DFS(E[v].tabe);
}
void DFS2(int v, int rt, int h = 0){
jad.push_back(v);
mark[v] = true;
if (v == adj[0][E[v].from][0]){
for (int i = 0; i < q; ++ i){
int k = a[i];
if (k < h)
ans[i] += is_good[jad[h - k]];
else{
k -= h;
k = (k + rt) % SZ(dq);
ans[i] += is_good[dq[k]];
}
}
}
for (int u : g[v]){
if (mark[u])
continue;
DFS2(u, rt, h + 1);
}
jad.pop_back();
}
void count_routes(int N, int M, int P, int R[][2], int Q, int G[]){
//int N, M, P, Q;
//cin >> N >> M >> P;
n = N, q = Q;
for (int i = 0; i < M; ++ i){
int v, u;
//cin >> v >> u;
v = R[i][0], u = R[i][1];
adj[0][v].push_back(ptr);
adj[1][u].push_back(ptr);
E[ptr].from = v;
E[ptr].to = u;
ptr ++;
adj[0][u].push_back(ptr);
adj[1][v].push_back(ptr);
E[ptr].from = u;
E[ptr].to = v;
ptr ++;
}
for (int i = 0; i < n; ++ i)
sort(all(adj[0][i]));
for (int i = 0; i < ptr; ++ i){
int v = E[i].to;
if (adj[0][v][0] != (i ^ 1))
E[i].tabe = adj[0][v][0];
else if (1 < SZ(adj[0][v]))
E[i].tabe = adj[0][v][1];
else
E[i].tabe = adj[0][v][0];
g[E[i].tabe].push_back(i);
}
for (int u : adj[1][P])
is_good[u] = true;
//cin >> Q;
for (int _ = 0; _ < Q; ++ _){
int k = G[_];
a[_] = k - 1;
//cin >> k;
}
for (int i = 0; i < ptr; ++ i){
if (mark[i])
continue;
dq.clear();
DFS(i);
while (dq.front() != dq.back())
mark[dq.front()] = false, dq.pop_front();
dq.pop_back();
for (int j = 0; j < SZ(dq); ++ j){
int v = dq[j];
jad.clear();
DFS2(v, j);
}
}
for (int i = 0; i < Q; ++ i){
//cout << ans[i] << endl;
answer(ans[i]);
}
}
/*
int main(){
fast_io;
count_routes();
return 0;
}
*/
/*
5 5 2
1 0
1 2
3 2
1 3
4 2
2
3 1
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |