제출 #1260696

#제출 시각아이디문제언어결과실행 시간메모리
1260696minhpkLong Mansion (JOI17_long_mansion)C++20
100 / 100
256 ms79256 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int a; int z[1000005]; vector<int> pos[1000005]; struct dsu{ int par[1000005]; int sz[1000005]; int l[1000005]; int r[1000005]; void init(){ for (int i=1;i<=a;i++){ par[i]=i; sz[i]=1; l[i]=i; r[i]=i; } } int find(int u){ if (par[u]==u){ return u; } return par[u]=find(par[u]); } void join(int x,int y){ x=find(x); y=find(y); if (x==y){ return; } if (sz[x]<sz[y]){ swap(x,y); } l[x]=min(l[x],l[y]); r[x]=max(r[x],r[y]); sz[x]+=sz[y]; par[y]=x; } }; dsu d; int vis[1000005]; bool check(int x,int l,int r){ auto it=lower_bound(pos[x].begin(),pos[x].end(),l); if (it!=pos[x].end() && *it<=r){ return true; } return false; } void dfs(int i,int parent){ if (vis[i]==2){ int x=d.find(i); int p=d.find(parent); d.l[p]=min(d.l[p],d.l[x]); d.r[p]=max(d.r[p],d.r[x]); return; } if (vis[i]==1){ int x=d.find(i); int p=d.find(parent); d.join(x,p); return; } vis[i]=1; while (true){ int rt=d.find(i); int l=d.l[rt]; int r=d.r[rt]; bool t=false; if (l>1 && check(z[l-1],l,r)){ dfs(l-1,i); t=true; } if (r+1<=a && check(z[r],l,r)){ dfs(r+1,i); t=true; } if (!t){ break; } } vis[i]=2; } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> a; for (int i=1;i<a;i++){ cin >> z[i]; } for (int i=1;i<=a;i++){ int c; cin >> c; while (c--){ int x; cin >> x; pos[x].push_back(i); } } d.init(); for (int i=1;i<=a;i++){ dfs(i,i); } int q; cin >> q; while (q--){ int x,y; cin >> x >> y; x=d.find(x); if (d.l[x]<=y && y<=d.r[x]){ cout << "YES\n"; }else{ cout << "NO\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...