제출 #1234765

#제출 시각아이디문제언어결과실행 시간메모리
1234765PenguinsAreCuteLong Mansion (JOI17_long_mansion)C++17
10 / 100
3092 ms26996 KiB
#include <bits/stdc++.h> using namespace std; struct seg { int n; vector<int> val; seg(int _n): n(_n), val(2*_n,-1e9) {} void up(int l, int r, int v) { for(l+=n,r+=n+1;l<r;l>>=1,r>>=1) { if(l&1) { val[l] = max(val[l], v); l++; } if(r&1) { r--; val[r] = max(val[r], v); } } } int qry(int x) { int ans = -1e9; for(x+=n;x;x>>=1) ans = max(ans, val[x]); return ans; } }; int main() { int n; cin >> n; int c[n-1]; for(int i=0;i<n-1;i++) { cin >> c[i]; c[i]--; } set<int> occ[n]; for(int i=0;i<n;i++) { int b; cin >> b; for(int a;b--;) { cin >> a; occ[a-1].insert(i); } } // in any "locked" range, // l >= f[r] // r <= g[l] int f[n], g[n]; for(int i=0;i<n;i++) { if(i==0) g[i] = n-1; else { auto it = lower_bound(occ[c[i-1]].begin(),occ[c[i-1]].end(),i); if(it==occ[c[i-1]].end()) g[i] = n-1; else g[i] = (*it) - 1; } if(i==n-1) f[i] = 0; else { auto it = upper_bound(occ[c[i]].begin(),occ[c[i]].end(),i); if(it == occ[c[i]].begin()) f[i] = 0; else f[i] = (*--it) + 1; } } vector<int> ginv[n], finv[n]; for(int i=0;i<n;i++) { finv[f[i]].push_back(i); ginv[g[i]].push_back(i); } seg l(n), r(n); set<int> val; for(int lft=n;lft--;) { val.insert(lft); if(lft != n - 1) for(auto rgt: finv[lft + 1]) if(val.find(rgt) != val.end()) val.erase(rgt); auto it = upper_bound(val.begin(),val.end(),g[lft]); if(it != val.begin()) l.up(lft, *--it, lft); } val.clear(); for(int rgt=0;rgt<n;rgt++) { val.insert(rgt); if(rgt != 0) for(auto lft: ginv[rgt - 1]) if(val.find(lft) != val.end()) val.erase(lft); auto it = lower_bound(val.begin(),val.end(),f[rgt]); if(it != val.end()) r.up(*it, rgt, -rgt); } int q; cin >> q; while(q--) { int x, y; cin >> x >> y; x--; y--; if(l.qry(x) <= y && y <= -r.qry(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...