Submission #21012

#TimeUsernameProblemLanguageResultExecution timeMemory
21012model_codeLong Mansion (JOI17_long_mansion)C++11
100 / 100
569 ms73544 KiB
#include<bits/stdc++.h> using namespace std; template<class T> void chmin(T& a,const T& b) { if(a>b) a=b; } template<class T> void chmax(T& a,const T& b) { if(a<b) a=b; } typedef pair<int,int> pi; const int INF=5e8; const int MAX_N=500005; struct uf{ int par[MAX_N]; int size[MAX_N]; void init(){ memset(par,-1,sizeof(par)); for(int i=1;i<MAX_N;++i) size[i]=1; } int root(int a){ if(par[a]==-1) return a; return par[a]=root(par[a]); } void unite(int a,int b){ a=root(a);b=root(b); if(a==b) return; par[b]=a; size[a]+=size[b]; } bool same(int a,int b){ return root(a)==root(b); } }; uf u; int n,q; int ar[MAX_N]; vector<int> keys[MAX_N]; pi query[MAX_N]; bool vis[MAX_N]; pi memo[MAX_N]; vector<int> pos[MAX_N]; bool open(int id,int l,int r){ return (*lower_bound(pos[id].begin(),pos[id].end(),l)<=r); } pair<int,pi> rec(int p){//(id,(l,r)) if(vis[p]){ return {p,{p,p}}; } if(memo[p].first>=0){ return {-1,memo[p]}; } if(u.root(p)!=p){ return rec(u.root(p)); } vis[p]=1; int l=p,r=p; while(1){ if(l>0 && open(ar[l-1],l,r)){ auto range=rec(l-1); chmin(l,range.second.first); chmax(r,range.second.second); if(range.first>=0 && range.first!=p){ u.unite(range.first,p); vis[p]=false; return {range.first,{l,r}}; } continue; } if(r+1<n && open(ar[r],l,r)){ auto range=rec(r+1); chmin(l,range.second.first); chmax(r,range.second.second); if(range.first>=0 && range.first!=p){ u.unite(range.first,p); vis[p]=false; return {range.first,{l,r}}; } continue; } break; } vis[p]=0; return {-1, memo[p]={l,r} }; } int main(){ u.init(); cin>>n; for(int i=0;i<n-1;++i) scanf("%d",&ar[i]),--ar[i]; int sum=0; for(int i=0;i<n;++i){ int K;scanf("%d",&K); keys[i].resize(K); sum+=K; for(int j=0;j<K;++j){ scanf("%d",&keys[i][j]); --keys[i][j]; pos[keys[i][j]].push_back(i); } } for(int i=0;i<n;++i) pos[i].push_back(INF); memset(memo,-1,sizeof(memo)); for(int i=0;i<n;++i) rec(i); for(int i=0;i<n;++i) if(u.root(i)!=i){ memo[i]=memo[u.root(i)]; } cin>>q; for(int i=0;i<q;++i){ int l,r;scanf("%d%d",&l,&r);--l;--r; if(memo[l].first<=r && r<=memo[l].second) puts("YES"); else puts("NO"); } return 0; }

Compilation message (stderr)

long_mansion.cpp: In function 'int main()':
long_mansion.cpp:91:52: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   for(int i=0;i<n-1;++i) scanf("%d",&ar[i]),--ar[i];
                                                    ^
long_mansion.cpp:94:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     int K;scanf("%d",&K);
                         ^
long_mansion.cpp:98:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d",&keys[i][j]);
                              ^
long_mansion.cpp:111:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     int l,r;scanf("%d%d",&l,&r);--l;--r;
                                ^

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...