线段树88分TLE求条
查看原帖
线段树88分TLE求条
983519
Laisira楼主2024/7/5 17:03
#include<bits/stdc++.h>
#define Maxn 100005 
using namespace std;
int a[Maxn],b[Maxn];
int f[Maxn][2],l[Maxn],r[Maxn];
int st[Maxn],top;
struct Tree {
    int val[Maxn<<2];
    #define lson x<<1,l,mid 
    #define rson x<<1|1,mid+1,r 
    void merge(int x,int l,int r,int u,int w) {
        if(l == r)return val[x]=max(val[x],w),void();
        int mid=l+r>>1;
        if(u<=mid) merge(lson,u,w);
        else merge(rson,u,w);
        val[x]=max(val[x<<1],val[x<<1|1]);
    }
    int query(int x,int l,int r,int L,int R) {
        if(L<=l&&r<=R)return val[x];
        int mid=l+r>>1,ans=0;
        if(L<=mid)ans=max(ans,query(lson,L,R));
        if(mid<R)ans=max(ans,query(rson,L,R));
        val[x]=max(val[x<<1],val[x<<1|1]);
        return ans;
    }
} tr[2];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,tot = 0;
    cin>>n; a[0]=INT_MAX;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int j=1;j<=n;j++)
        cin>>b[j];
    for(int j=1;j<=n;j++)
        if(a[j]==b[j])
            l[j]=r[j]=j;
    for(int i=1;i<=n;i++) {
        while(a[st[top]] < a[i]&&top) {if(!r[st[top]])r[st[top]] = i;top--;}
		if(!l[i]&&top)l[i] = st[top];
        while(a[st[top]] == a[i]&&top){if(!r[st[top]])r[st[top]] = i;top--;}
        st[++top] = i;
    }
    for(int i=1;i<=n;i++) {
        if(a[l[i]] != b[i])l[i] = 0;
        if(a[r[i]] != b[i])r[i] = n+1;
    }
    for(int i=1;i<=n;i++) {
        int L = i,R = i;
        while(L>0&&a[L]<=b[i]&&a[L]!=b[i])L --;
        while(R<=n&&a[R]<=b[i]&&a[R]!=b[i])R ++;
        if(a[L] == b[i])l[i] = L;else l[i] = 0;
        if(a[R] == b[i])r[i] = R;else r[i] = n+1;
    }
    for(int i=1;i<=n;i++) {
        if(l[i] != 0)
            f[i][0]=max({f[i][0],tr[0].query(1,1,n,1,l[i])+1,tr[1].query(1,1,n,1,l[i])+1});
        if(r[i] != n+1)
            f[i][1]=max({f[i][1],tr[0].query(1,1,n,1,n)+1,tr[1].query(1,1,n,1,r[i])+1});
        tr[0].merge(1,1,n,l[i],f[i][0]);
        tr[1].merge(1,1,n,r[i],f[i][1]);
    } int maxn = 0;
    for(int i=1;i<=n;i++)
        maxn=max({maxn,f[i][0],f[i][1]});
    cout << maxn;
    return 0;
}
2024/7/5 17:03
加载中...