Submission #59752

#TimeUsernameProblemLanguageResultExecution timeMemory
59752BenqFile Paths (BOI15_fil)C++11
100 / 100
325 ms27132 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i=a; i<(b); i++) #define F0R(i, a) for (int i=0; i<(a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() const int MOD = 1000000007; const ll INF = 1e18; const int MX = 6001; int n,m,k,s,p[MX],l[MX]; ll depth[MX]; vi child[MX]; bitset<MX> ans; bitset<1000001> root; void dfs0(int x, ll cdepth) { cdepth += l[x]; depth[x] = cdepth; for (int i: child[x]) dfs0(i,cdepth); } void genCyc(int x, int ori, ll cdepth, vi& CYC) { if (x > n) return; if (cdepth <= k) CYC.pb(cdepth); for (int i: child[x]) genCyc(i,ori,cdepth+l[i],CYC); } int cyc[1000001]; void DFS(int cur) { if (cur > n) { ll need = k-depth[cur]; if (need == 0) { ans[cur] = 1; return; } for (int t = 1; t*t <= need; t++) if (need%t == 0) if (cyc[t] || cyc[need/t]) ans[cur] = 1; } vi CYC; genCyc(cur,cur,s,CYC); for (int i: CYC) cyc[i] ++; for (int i: child[cur]) DFS(i); for (int i: CYC) cyc[i] --; } void case0() { dfs0(0,0); DFS(0); } void case1() { F0R(i,n+1) if (depth[i]+s <= k) root[depth[i]+s] = 1; FOR(i,n+1,n+m+1) { vi v = {l[i]}; int x = p[i]; while (x) { v.pb(v.back()+l[x]); x = p[x]; } for (int x: v) if (x <= k && root[k-x]) ans[i] = 1; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k >> s; s ++; FOR(i,1,n+1) { cin >> p[i] >> l[i]; l[i] ++; child[p[i]].pb(i); } FOR(i,n+1,n+m+1) { cin >> p[i] >> l[i]; l[i] ++; child[p[i]].pb(i); } case0(); case1(); FOR(i,n+1,n+m+1) { if (ans[i]) cout << "YES"; else cout << "NO"; cout << "\n"; } } /* Look for: * the exact constraints (multiple sets are too slow for n=10^6 :( ) * special cases (n=1?) * overflow (ll vs int?) * array bounds */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...