Submission #1234769

#TimeUsernameProblemLanguageResultExecution timeMemory
1234769PenguinsAreCuteLong Mansion (JOI17_long_mansion)C++17
10 / 100
3094 ms27128 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3") 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); } } } void prop() { for(int x=1;x<n;x++) { val[x<<1] = max(val[x<<1],val[x]); val[x<<1|1] = max(val[x<<1|1],val[x]); } } int qry(int x) { return val[x+n]; } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); 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); } } 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); } l.prop(); r.prop(); 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...