Submission #1154159

#TimeUsernameProblemLanguageResultExecution timeMemory
1154159irmuunGift Exchange (JOI24_ho_t4)C++20
100 / 100
1424 ms46668 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() struct LazySegMax{ int n; vector<int>d,lazy; LazySegMax(int n):n(n){ d.resize(4*n); lazy.resize(4*n); } void push(int v){ d[v<<1]=max(d[v<<1],lazy[v]); lazy[v<<1]=max(lazy[v<<1],lazy[v]); d[v<<1|1]=max(d[v<<1|1],lazy[v]); lazy[v<<1|1]=max(lazy[v<<1|1],lazy[v]); lazy[v]=0; } int query(int v,int l,int r,int L,int R){ if(R<L||R<l||r<L) return 0; if(L<=l&&r<=R){ return d[v]; } push(v); int m=(l+r)>>1; return max(query(v<<1,l,m,L,R),query(v<<1|1,m+1,r,L,R)); } void update(int v,int l,int r,int L,int R,int val){ if(R<L||R<l||r<L) return; if(L<=l&&r<=R){ d[v]=val; lazy[v]=val; return; } push(v); int m=(l+r)>>1; update(v<<1,l,m,L,R,val); update(v<<1|1,m+1,r,L,R,val); d[v]=max(d[v<<1],d[v<<1|1]); } }; struct LazySegMin{ int n; vector<int>d,lazy; LazySegMin(int n):n(n){ d.resize(4*n); lazy.resize(4*n); fill(all(d),n+1); fill(all(lazy),n+1); } void push(int v){ //cout<<"pushed "<<v<<"\n"; d[v<<1]=min(d[v<<1],lazy[v]); lazy[v<<1]=min(lazy[v<<1],lazy[v]); d[v<<1|1]=min(d[v<<1|1],lazy[v]); lazy[v<<1|1]=min(lazy[v<<1|1],lazy[v]); lazy[v]=n+1; } int query(int v,int l,int r,int L,int R){ if(R<L||R<l||r<L) return n+1; if(L<=l&&r<=R){ return d[v]; } push(v); int m=(l+r)>>1; return min(query(v<<1,l,m,L,R),query(v<<1|1,m+1,r,L,R)); } void update(int v,int l,int r,int L,int R,int val){ if(R<L||R<l||r<L) return; if(L<=l&&r<=R){ d[v]=val; lazy[v]=val; return; } push(v); int m=(l+r)>>1; update(v<<1,l,m,L,R,val); update(v<<1|1,m+1,r,L,R,val); d[v]=min(d[v<<1],d[v<<1|1]); } }; struct segtree{ int n; vector<int>d; segtree(int n):n(n){ d.resize(4*n); } int query(int v,int l,int r,int L,int R){ if(R<L||R<l||r<L) return 0; if(L<=l&&r<=R){ return d[v]; } int m=(l+r)>>1; return max(query(v<<1,l,m,L,R),query(v<<1|1,m+1,r,L,R)); } void update(int v,int l,int r,int pos,int val){ if(r<pos||pos<l) return; if(l==r){ d[v]=val; return; } int m=(l+r)>>1; update(v<<1,l,m,pos,val); update(v<<1|1,m+1,r,pos,val); d[v]=max(d[v<<1],d[v<<1|1]); } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin>>n; int a[n+5],b[n+5]; for(ll i=1;i<=n;i++){ cin>>a[i]; } for(ll i=1;i<=n;i++){ cin>>b[i]; } int s[n+5]; { LazySegMax sg(2*n); for(int i=1;i<=n;i++){ s[i]=sg.query(1,1,2*n,b[i],a[i]); sg.update(1,1,2*n,b[i],a[i],i); } } int t[n+5]; { LazySegMin sg(2*n); for(int i=n;i>=1;i--){ t[i]=sg.query(1,1,2*n,b[i],a[i]); sg.update(1,1,2*n,b[i],a[i],i); if(t[i]>n+1) t[i]=n+1; //lazy } } int q; cin>>q; int l[q+5],r[q+5]; for(int i=1;i<=q;i++){ cin>>l[i]>>r[i]; } int order[q+5]; iota(order+1,order+q+1,1); sort(order+1,order+q+1,[&](int i,int j) { return l[i]<l[j]; }); segtree sg(n); vector<int>add[n+5]; for(int i=1;i<=n;i++){ add[s[i]].pb(i); } int c=0,d=1; vector<bool>ans(q+5,1); for(int j=1;j<=q;j++){ int L=l[order[j]],R=r[order[j]]; while(c<L){ for(int i:add[c]){ sg.update(1,1,n,i,t[i]); } c++; } while(d<L){ sg.update(1,1,n,d,0); d++; } if(sg.query(1,1,n,L,R)>R){ ans[order[j]]=false; } else{ ans[order[j]]=true; } } for(int i=1;i<=q;i++){ cout<<(ans[i]?"Yes\n":"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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...