제출 #250378

#제출 시각아이디문제언어결과실행 시간메모리
250378tutisFile Paths (BOI15_fil)C++17
0 / 100
594 ms109180 KiB
/*input 2 4 22 2 0 1 1 5 2 13 2 10 1 4 0 7 */ #pragma GCC optimize ("O3") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; typedef long long ll; typedef long double ld; vector<int>dal[1000001]; bitset<100000000>aaa; bitset<100000000>bbb; int main() { ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0), cerr.tie(0); for (int i = 1; i <= 1000; i++) for (int j = i * i; j <= 1000000; j += i) dal[j].push_back(i); int n, m, k, s; cin >> n >> m >> k >> s; s++; ll p[n + 1], d[n + 1], l[n + 1]; p[0] = -1; d[0] = 1; vector<int>D = {1}; for (int i = 1; i <= n; i++) { cin >> p[i] >> l[i]; d[i] = d[p[i]] + 1 + l[i]; D.push_back(d[i]); } vector<ll>cikl; for (int i = 0; i <= n; i++) { for (int j = i; j != -1; j = p[j]) { ll x = j + ((d[i] - d[j] + s) << 20); aaa[x % 100000000] = true; bbb[x % 99999999] = true; } } sort(D.begin(), D.end()); sort(cikl.begin(), cikl.end()); function<bool(int, ll)>ok = [&](int v, ll ilg) { if (d[v] == ilg) return true; if (ilg <= 0) return false; if (v != 0 && ok(p[v], ilg - 1 - l[v])) return true; if (ilg - s >= 1 && binary_search(D.begin(), D.end(), ilg - s)) return true; if (ilg <= d[v] + s) return false; ilg -= d[v]; for (ll c : dal[ilg]) { ll x1 = v + (c << 20); ll x2 = v + ((ilg / c) << 20); if (aaa[x1 % 100000000] && bbb[x1 % 99999999]) return true; if (aaa[x2 % 100000000] && bbb[x2 % 99999999]) return true; } return false; }; while (m--) { int p, l; cin >> p >> l; if (ok(p, k - l)) cout << "YES\n"; else cout << "NO\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...