Submission #230729

#TimeUsernameProblemLanguageResultExecution timeMemory
230729emil_physmathFile Paths (BOI15_fil)C++17
100 / 100
429 ms976 KiB
#include <unordered_map> #include <algorithm> #include <iostream> #include <cstdio> #include <limits> #include <vector> #include <map> using namespace std; vector<int> chld[6001]; int tin[6001], tout[6001], p[6001], len[6001], depth[6001]; inline bool Upper(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; } void DFS(int v) { static int time = 0; tin[v] = ++time; for (int to: chld[v]) DFS(to); tout[v] = time; } int main() { int n, m, des; cin >> n >> m >> des; int sym; cin >> sym; ++sym; p[0] = -1; for (int i = 1; i <= n + m; ++i) { scanf("%d%d", &p[i], &len[i]); chld[p[i]].push_back(i); ++len[i]; depth[i] = depth[p[i]] + len[i]; } DFS(0); vector<int> pref; pref.reserve(n + m); vector<int> prefv; prefv.reserve(n + m); vector<int> stNodes; for (int i = 0; i <= n; ++i) stNodes.push_back(i); sort(stNodes.begin(), stNodes.end(), [](int u, int v) { return depth[u] < depth[v]; }); for (int i = n + 1; i <= n + m; ++i) { pref.clear(); prefv.clear(); for (int j = i; j != -1; j = p[j]) { prefv.push_back(j); pref.push_back(depth[j]); } reverse(pref.begin(), pref.end()); reverse(prefv.begin(), prefv.end()); bool ans = pref.back() == des; for (int from = 0; !ans && from <= n; ++from) if (binary_search(pref.begin(), prev(pref.end()), depth[from] + sym + pref.back() - des)) { ans = true; break; } if (des - pref.back() > 0) { for (int x = 1; !ans && x * x <= des - pref.back(); ++x) for (int y = 0; !ans && y <= 1; ++y, x = (des - pref.back()) / x) { if ((des - pref.back()) % x) continue; int i = 0; for (int from: stNodes) { // depth[from] - depth[to] + sym == x // depth[to] = depth[from] + sym - x while (i + 1 < pref.size() && pref[i + 1] <= depth[from] + sym - x) ++i; if (pref[i] != depth[from] + sym - x) continue; if (Upper(prefv[i], from)) { ans = true; break; } } } } printf(ans ? "YES\n" : "NO\n"); } }

Compilation message (stderr)

fil.cpp: In function 'int main()':
fil.cpp:74:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                         while (i + 1 < pref.size() && pref[i + 1] <= depth[from] + sym - x)
                                ~~~~~~^~~~~~~~~~~~~
fil.cpp:32:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &p[i], &len[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...