제출 #1234654

#제출 시각아이디문제언어결과실행 시간메모리
1234654emptypringlescanLong Mansion (JOI17_long_mansion)C++17
0 / 100
127 ms23176 KiB
#include <bits/stdc++.h> using namespace std; int n; int cor[500005]; vector<int> keys[500005]; pair<int,int> ans[500005]; vector<pair<int,int> > lw,rw; void dnc(int l, int r, vector<pair<int,int> > lft, vector<pair<int,int> > rgt){ //only consider walls blocking [l,r] if(l>r) return; int m=(l+r)/2; vector<pair<int,int> > monol,monor; for(int i=(int)lft.size()-1; i>=0; i--){ if(lft[i].first>m) continue; if(!monol.empty()&&monol.back().second>=lft[i].second) continue; monol.push_back(lft[i]); } for(int i=0; i<(int)rgt.size(); i++){ if(rgt[i].second<m) continue; if(!monor.empty()&&monor.back().first<=rgt[i].first) continue; monor.push_back(rgt[i]); } int c1=0,c2=0; for(int i=m; i>=l; i--){ while(true){ if(c1>=(int)monol.size()||c2>=(int)monor.size()) break; if(monol[c1].first<=i&&monor[c2].first<=monol[c1].first&&monor[c2].second<=monol[c1].second) break; if(monol[c1].first>i) c1++; else if(monor[c2].first>monol[c1].first) c2++; else c1++; } if(c1<(int)monol.size()&&c2<(int)monor.size()){ ans[i].first=max(ans[i].first,monol[c1].first); ans[i].second=min(ans[i].second,monor[c2].second); } } c1=0,c2=0; for(int i=m; i<=r; i++){ while(true){ if(c1>=(int)monol.size()||c2>=(int)monor.size()) break; if(monor[c2].second>=i&&monol[c1].second>=monor[c2].second&&monol[c1].first>=monor[c2].first) break; if(monor[c2].second<i) c2++; else if(monol[c1].second<monor[c2].second) c1++; else c2++; } if(c1<(int)monol.size()&&c2<(int)monor.size()){ ans[i].first=max(ans[i].first,monol[c1].first); ans[i].second=min(ans[i].second,monor[c2].second); } } if(l!=r){ vector<pair<int,int> > tmpl,tmpr; for(auto i:lft) if(i.first<m) tmpl.push_back(i); for(auto i:rgt) if(i.second<m) tmpr.push_back(i); dnc(l,m-1,tmpl,tmpr); tmpl.clear(); tmpr.clear(); for(auto i:lft) if(i.first>m) tmpl.push_back(i); for(auto i:rgt) if(i.second>m) tmpr.push_back(i); dnc(m+1,r,tmpl,tmpr); } } int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i=1; i<n; i++) cin >> cor[i]; for(int i=1; i<=n; i++){ int m; cin >> m; for(int j=0; j<m; j++){ int x; cin >> x; keys[i].push_back(x); } } int prev[n+5]; memset(prev,0,sizeof(prev)); for(int i=1; i<n; i++){ for(int j:keys[i]) prev[j]=i; if(prev[cor[i]]!=i) rw.push_back({prev[cor[i]]+1,i}); } rw.push_back({0,n}); for(int i=0; i<=n; i++) prev[i]=n+1; for(int i=n; i>1; i--){ for(int j:keys[i]) prev[j]=i; if(prev[cor[i-1]]!=i) lw.push_back({i,prev[cor[i-1]]-1}); } lw.push_back({1,n+1}); for(int i=1; i<=n; i++) ans[i]={1,n}; dnc(1,n,lw,rw); //for(int i=1; i<=n; i++) cout << ans[i].first << ' ' << ans[i].second << '\n'; int q; cin >> q; while(q--){ int a,b; cin >> a >> b; if(b>=ans[a].first&&b<=ans[a].second) 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...