제출 #538028

#제출 시각아이디문제언어결과실행 시간메모리
5380288e7Long Mansion (JOI17_long_mansion)C++17
100 / 100
410 ms49036 KiB
//Challenge: Accepted #include <bits/stdc++.h> using namespace std; #ifdef zisk void debug(){cout << endl;} template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);} template<class T> void pary(T l, T r) { while (l != r) cout << *l << " ", l++; cout << endl; } #else #define debug(...) 0 #define pary(...) 0 #endif #define ll long long #define maxn 500005 #define pii pair<int, int> #define ff first #define ss second #define io ios_base::sync_with_stdio(0);cin.tie(0); vector<int> pos[maxn]; int c[maxn]; pii ans[maxn]; pii merge(pii x, pii y){return {min(x.ff, y.ff), max(x.ss, y.ss)};} bool vis[maxn]; struct DSU{ pii ran[maxn]; int par[maxn]; void init(int n) { for (int i = 1;i <= n;i++) par[i] = i, ran[i] = {i, i}; } int find(int a) { return a == par[a] ? a : (par[a] = find(par[a])); } pii getran(int a) { return ran[find(a)]; } void Union(int a, int b) { a = find(a), b = find(b); ran[b] = merge(ran[b], ran[a]); par[a] = b; } } d; bool key(int x, int l, int r) { int il = lower_bound(pos[x].begin(), pos[x].end(), l) - pos[x].begin(); int ir = upper_bound(pos[x].begin(), pos[x].end(), r) - pos[x].begin(); return ir > il; } int tot; bool solve(int n, int par) { while (true) { n = d.find(n); pii r = d.getran(n); if (r.ff > 1 && key(c[r.ff-1], r.ff, r.ss)) { if (d.find(par) == d.find(r.ff-1)) return true; if (solve(r.ff-1, n)) { d.Union(r.ff-1, n); } else { d.ran[n] = merge(d.ran[n], d.ran[r.ff-1]); } } else if (r.ss < tot && key(c[r.ss], r.ff, r.ss)) { if (d.find(par) == d.find(r.ss+1)) return true; if (solve(r.ss+1, n)) { d.Union(r.ss+1, n); } else { d.ran[n] = merge(d.ran[n], d.ran[r.ss+1]); } } else { break; } } return false; } int main() { io int n; cin >> n; tot = n; for (int i = 1;i <= n - 1;i++) cin >> c[i]; for (int i = 1;i <= n;i++) { int bi; cin >> bi; for (int j = 0;j < bi;j++) { int x;cin>> x; pos[x].push_back(i); } } d.init(n); for (int i = 1;i <= n;i++) { if (vis[d.find(i)]) continue; solve(i, 0); vis[d.find(i)] = 1; } for (int i = 1;i <= n;i++) { ans[i] = d.getran(i); } int q; cin >> q; while (q--) { int x, y; cin >> x >> y; cout << (y <= ans[x].ss && y >= ans[x].ff ? "YES" : "NO") << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...