Submission #736256

#TimeUsernameProblemLanguageResultExecution timeMemory
736256bgnbvnbvLong Mansion (JOI17_long_mansion)C++14
100 / 100
984 ms155300 KiB
#include<bits/stdc++.h> #define TASKNAME "codeforce" #define pb push_back #define pli pair<int,int> #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); using namespace std; using ll=long long; const ll maxN=5e5+10; const ll inf=1e18; const ll mod=1e9+7; ll n,c[maxN],l[maxN],r[maxN]; ll mn[4*maxN],mx[maxN*4]; vector<ll>vec[maxN],pos[maxN]; void update(ll pos,ll val,ll id=1,ll l=1,ll r=n) { if(l==r) { mn[id]=mx[id]=val; return; } ll mid=l+r>>1; if(pos<=mid) update(pos,val,id*2,l,mid); else update(pos,val,id*2+1,mid+1,r); mx[id]=max(mx[id*2],mx[id*2+1]); mn[id]=min(mn[id*2],mn[id*2+1]); } ll bs1(ll i,ll val,ll id=1,ll l=1,ll r=n) { if(r<i||mx[id]<val) return r+1; if(l==r) return l; ll mid=l+r>>1; ll cc=bs1(i,val,id*2,l,mid); if(cc==mid+1) return bs1(i,val,id*2+1,mid+1,r); else return cc; } ll bs2(ll i,ll val,ll id=1,ll l=1,ll r=n) { if(l>i||mn[id]>val) return l-1; if(l==r) return l; ll mid=l+r>>1; ll cc=bs2(i,val,id*2+1,mid+1,r); if(cc==mid) return bs2(i,val,id*2,l,mid); else return cc; } ll bit[maxN]={0}; void upd(ll i,ll x) { while(i<=n) { bit[i]+=x; i+=i&(-i); } } ll get(ll i,ll j) { swap(i,j); j--; ll ans=0; while(i>0) { ans+=bit[i]; i-=i&(-i); } while(j>0) { ans-=bit[j]; j-=(j&(-j)); } return ans; } ll q; vector<ll>xoa[maxN]; ll ans[maxN]; vector<pli>nho[maxN],lon[maxN]; void solve() { cin >> n; for(int i=1;i<n;i++) { cin >> c[i]; } for(int i=1;i<=n;i++) { ll k; cin >> k; vec[i].resize(k); for(int j=0;j<k;j++) { cin >> vec[i][j]; pos[vec[i][j]].pb(i); } } cin >> q; for(int i=1;i<=q;i++) { ll l,r; cin >> l >> r; if(l>r) { nho[l].pb({r,i}); } else lon[l].pb({r,i}); } for(int i=1;i<n;i++) { r[i]=upper_bound(pos[c[i]].begin(),pos[c[i]].end(),i)-pos[c[i]].begin(); if(r[i]==pos[c[i]].size()) r[i]=n+1; else r[i]=pos[c[i]][r[i]]; } r[n]=n+1; for(int i=2;i<=n;i++) { l[i]=lower_bound(pos[c[i-1]].begin(),pos[c[i-1]].end(),i)-pos[c[i-1]].begin()-1; if(l[i]<0) l[i]=0; else l[i]=pos[c[i-1]][l[i]]; } l[1]=0; for(int i=1;i<=n;i++) update(i,r[i]); for(int i=n;i>=1;i--) { if(l[i]==0) { xoa[0].pb(i); update(i,-inf); continue; } ll x=bs1(l[i],i); xoa[x].pb(i); update(i,-inf); } for(int i=1;i<=n;i++) { upd(i,1); } for(int i=n;i>=1;i--) { for(auto zz:xoa[i]) { upd(zz,-1); } for(auto zz:lon[i]) { ans[zz.se]=get(i+1,zz.fi); //cout << zz.fi<<'\n'; } } for(auto zz:xoa[0]) { upd(zz,-1); } for(auto zz:xoa[n+1]) upd(zz,-1); xoa[0].clear(); for(int i=1;i<=n;i++) upd(i,1),xoa[i].clear(),update(i,l[i]); for(int i=1;i<=n;i++) { if(r[i]==n+1) { update(i,inf); continue; } ll x=bs2(r[i],i); xoa[x].pb(i); update(i,inf); } for(int i=1;i<=n;i++) { for(auto zz:xoa[i]) { upd(zz,-1); } for(auto zz:nho[i]) { ans[zz.se]=get(zz.fi,i-1); } } for(int i=1;i<=q;i++) { if(ans[i]>0) cout <<"NO\n"; else cout <<"YES\n"; } } int main() { fastio //freopen(TASKNAME".INP","r",stdin); //freopen(TASKNAME".OUT","w",stdout); solve(); }

Compilation message (stderr)

long_mansion.cpp: In function 'void update(ll, ll, ll, ll, ll)':
long_mansion.cpp:23:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   23 |     ll mid=l+r>>1;
      |            ~^~
long_mansion.cpp: In function 'll bs1(ll, ll, ll, ll, ll)':
long_mansion.cpp:33:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |     ll mid=l+r>>1;
      |            ~^~
long_mansion.cpp: In function 'll bs2(ll, ll, ll, ll, ll)':
long_mansion.cpp:42:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |     ll mid=l+r>>1;
      |            ~^~
long_mansion.cpp: In function 'void solve()':
long_mansion.cpp:109:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |         if(r[i]==pos[c[i]].size()) r[i]=n+1;
      |            ~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...