#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#define int long long
#define L LLONG_MAX
using namespace std;
long long n,t;
const int nmax=2e5+1;
int nxt1[nmax],nxt2[nmax],a[nmax],b[nmax],lazy[4*nmax];
pair<int,int> tree[4*nmax];
vector<pair<int,int>> save;
vector<pair<int,int>> order;
void build(int id,int l,int r)
{
    if(l==r)
    {
        tree[id].first=a[l];
        tree[id].second=b[l];
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    tree[id].first=max(tree[id*2].first,tree[id*2+1].first);
    tree[id].second=min(tree[id*2].second,tree[id*2+1].second);
}
void down(int id,int l,int r)
{
    if(lazy[id]==0) return;
    tree[id].first=lazy[id];
    if(l!=r)
    {
        lazy[id*2]=lazy[id];
        lazy[id*2+1]=lazy[id];
    }
    lazy[id]=0;
}
void update(int id,int l,int r,int a,int b,int val)
{
    down(id,l,r);
    if(b<l||a>r) return;
    if(a<=l && r<=b)
    {
        lazy[id]=val;
        down(id,l,r);
        return;
    }
    int mid=(l+r)/2;
    update(id*2,l,mid,a,b,val);
    update(id*2+1,mid+1,r,a,b,val);
    tree[id].first=max(tree[id*2].first,tree[id*2+1].first);
}
int get(int id,int l,int r,int a)
{
    down(id,l,r);
    if(a<l || r<a) return 0;
    if(l==r) return tree[id].first;
    int mid=(l+r)/2;
    return get(id*2,l,mid,a)+get(id*2+1,mid+1,r,a);
}
int get1(int id,int l,int r,int a,int b)
{
    down(id,l,r);
    if(b<l||r<a) return 0;
    if(a<=l && r<=b) return tree[id].first;
    int mid=(l+r)/2;
    return max(get1(id*2,l,mid,a,b),get1(id*2+1,mid+1,r,a,b));
}
int get2(int id,int l,int r,int a,int b)
{
    down(id,l,r);
    if(b<l||r<a) return L;
    if(a<=l && r<=b) return tree[id].second;
    int mid=(l+r)/2;
    return min(get2(id*2,l,mid,a,b),get2(id*2+1,mid+1,r,a,b));
}
long long UPPER1(long long x)
{
    long long l=-1,r=save.size();
    while(l+1<r)
    {
        long long mid=(l+r)/2;
        if(save[mid].first>x) r=mid;
        else l=mid;
    }
    return r;
}
long long UPPER2(long long l,long long r,long long val)
{
    l--; r++;
    while(l+1<r)
    {
        long long mid=(l+r)/2;
        if(save[mid].second<=val) l=mid;
        else r=mid;
    }
    return r;
}
int getid1(int val,int id)
{
    int l=UPPER1(val-1),r=UPPER1(val);
    if(l==r) return -1;
    int p=UPPER2(l,r-1,id);
    if(p==r) return -1;
    else return save[p].second;
}
int getid2(int val,int id)
{
    int l=UPPER1(val-1),r=UPPER1(val);
    if(l==r) return -1;
    int p=UPPER2(l,r-1,id-1)-1;
    if(p<l) return -1;
    else return save[p].second;
}
void buildnxt1()
{
    for(int i=1;i<=n;i++) nxt1[i]=getid1(b[i],i);
}
void buildnxt2()
{
    for(int i=n;i>=1;i--) nxt2[i]=getid2(b[i],i);
}
void reset()
{
    for(int i=1;i<=4*n;i++)
    {
        tree[i].first=0;
        tree[i].second=L;
        lazy[i]=0;
    }
}
void solve()
{
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
        save.push_back({a[i],i});
    }
    for(int i=1;i<=n;i++) 
    {
        cin >> b[i];
        order.push_back({b[i],i});
    }
    
    sort(save.begin(),save.end());
    sort(order.begin(),order.end());
    buildnxt1();
    buildnxt2();
    
    reset();
    build(1,1,n);
    int ans=0;
    for(int i=0;i<=n-1;i++)
    {
    	bool flag=false;
        //if(b[i-1]==b[i]) continue;
        int cur=get(1,1,n,order[i].second);
        if(cur>order[i].first) continue;
        if(cur==order[i].first) 
        {
        	ans++;
        	continue;
        }
        if(cur<order[i].first)
        {
            if(get1(1,1,n,order[i].second,nxt1[order[i].second])<=b[order[i].second] && get2(1,1,n,order[i].second,nxt1[order[i].second])>=b[order[i].second] && nxt1[order[i].second]!=-1)
            {
                update(1,1,n,order[i].second,nxt1[order[i].second],b[order[i].second]);
                flag=true;
            }
            if(get1(1,1,n,nxt2[order[i].second],order[i].second)<=b[order[i].second] && get2(1,1,n,nxt2[order[i].second],order[i].second)>=b[order[i].second] && nxt2[order[i].second]!=-1)
            {
                update(1,1,n,nxt2[order[i].second],order[i].second,b[order[i].second]);
                flag=true;
            }
            if(flag) ans++;
        }
    }
    cout << ans;
}
signed main()
{
    //freopen("","r",stdin);
    //freopen("","w",stdout);
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int t=1;
    while(t--) 
    {
        solve();
        
        reset();
        save.clear();
        order.clear();
        for(int i=1;i<=n;i++)
        {
            nxt1[i]=0;
            nxt2[i]=0;
        }
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |