제출 #990326

#제출 시각아이디문제언어결과실행 시간메모리
990326xyzaaLong Mansion (JOI17_long_mansion)C++17
100 / 100
610 ms50256 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500008; int n, q, c[N], sz[N], L[N], R[N], cl[N], cr[N]; bool proc[N]; vector<int> key[N]; void dnc(int l, int r) { if (l > r) return; int mid = (l + r) / 2; if (proc[mid]) return; while (true) { if (L[mid] != 1 && cr[L[mid] - 1] <= R[mid]) { L[mid]--; if (proc[L[mid]]) { L[mid] = min(L[L[mid]], L[mid]); R[mid] = max(R[L[mid]], R[mid]); } } else if (R[mid] != n && cl[R[mid]] >= L[mid]) { R[mid]++; if (proc[R[mid]]) { L[mid] = min(L[R[mid]], L[mid]); R[mid] = max(R[R[mid]], R[mid]); } } else break; } proc[mid] = true; dnc(l, mid); dnc(mid + 1, r); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i < n; i++) cin >> c[i]; for (int i = 1; i <= n; i++) { cin >> sz[i]; L[i] = R[i] = i; for (int j = 0, x; j < sz[i]; j++) { cin >> x; key[x].push_back(i); } } for (int i = 1; i <= n - 1; i++) { auto it = upper_bound(key[c[i]].begin(), key[c[i]].end(), i); if (it == key[c[i]].begin()) cl[i] = -1; else cl[i] = *(--it); it = lower_bound(key[c[i]].begin(), key[c[i]].end(), i + 1); if (it == key[c[i]].end()) cr[i] = n + 1; else cr[i] = *it; } dnc(1, n); // for (int i = 1; i <= n; i++) cout << L[i] << ' ' << R[i] << '\n'; cin >> q; while (q--) { int x, y; cin >> x >> y; if (L[x] <= y && y <= R[x]) 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...
#Verdict Execution timeMemoryGrader output
Fetching results...