Submission #1270658

#TimeUsernameProblemLanguageResultExecution timeMemory
1270658BuzzyBeezFile Paths (BOI15_fil)C++20
100 / 100
329 ms92464 KiB
#include <bits/allocator.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2") #include <bits/stdc++.h> using namespace std; vector<int> divisors(long long n) { vector<int> res; if (n <= 0) return res; for (int i = 1; i * i <= n; ++i) if (n % i == 0) { res.push_back(i); if (i * i < n) res.push_back(n / i); } return res; } const int N = 1e6; int s, k; int id_D[3008], id_F[3008]; int f[N + 8]; vector<pair<int, int>> adj[6008]; long long d[6008]; vector<int> anc[6008], des[6008]; bool stop[6008], ans[6008]; void DFS_prep(int u) { if (u > 1) anc[u].push_back(u); if (!stop[u]) des[u].push_back(u); for (pair<int, int> edge : adj[u]) { // cout << u << ' ' << edge.first << endl; d[edge.first] = d[u] + edge.second; anc[edge.first] = anc[u]; DFS_prep(edge.first); for (int i : des[edge.first]) des[u].push_back(i); } } void modify(int u, int c) { if (u == 1) return; for (int v : des[u]) if (0 < d[v] - d[u] + s && d[v] - d[u] + s <= N) f[d[v] - d[u] + s] += c; } void solve(int u) { if (k == d[u]) { ans[u] = 1; // cout << u << ' ' << d[u] << "!!" << endl; return; } // cout << u << ' ' << d[u] << "!!" << endl; // cout << ">> "; // for (int i : anc[u]) cout << i << ' '; // cout << endl; for (int d : divisors(k - d[u])) ans[u] |= (f[d] > 0); } void DFS(int u) { modify(u, +1); int v; for (pair<int, int> edge : adj[u]) { v = edge.first; if (stop[v]) solve(v); else DFS(v); } modify(u, -1); } map<long long, int> mp; void solve_simple_case(int u) { // d[v1] + s + d[u] - d[v2] = k <=> exist v1 :: d[v1] = k - d[u] + d[a (in anc[u])] - s if (ans[u]) return; long long t; for (int a : anc[u]) if (a != u) { t = k - d[u] + d[a] - s; if (mp[t]) { ans[u] = 1; return; } } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, p, len; cin >> n >> m >> k >> s; ++s; int buff = 2; adj[1].emplace_back(2, 1); for (int i = 1; i <= n; ++i) { cin >> p >> len; ++len; p += buff; adj[p].emplace_back(i + buff, len); } for (int i = n + 1; i <= n + m; ++i) { cin >> p >> len; p += buff; adj[p].emplace_back(i + buff, len); stop[i + buff] = 1; } DFS_prep(1); DFS(1); for (int i = 2; i <= n + buff; ++i) mp[d[i]] = 1; for (int i = n + 1; i <= n + m; ++i) solve_simple_case(i + buff); for (int i = n + 1; i <= n + m; ++i) cout << (ans[i + buff] ? "YES\n" : "NO\n"); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...