90分救助
查看原帖
90分救助
655609
dingchenjun楼主2024/10/13 12:12
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+100;
int n,nxt[MAXN],last[MAXN],tr[MAXN*4],a[MAXN],dp[MAXN];
void modify(int x, int l, int r, int id, int y) {
    if (l==r) {
        tr[x]=max(tr[x],y);
        return;
    }
    int mid=(l+r)>>1;
    if (id<=mid) {
        modify(x*2,l,mid,id,y);
    } else {
        modify(x*2+1,mid+1,r,id,y);
    }
    tr[x]=max(tr[x*2],tr[x*2+1]);
}
int query(int x, int l, int r, int ql, int qr) {
    if (l>=ql && r<=qr) {
        return tr[x];
    }
    if (l>qr || r<ql) {
        return 0;
    }
    int mid=(l+r)>>1;
    return max(query(x*2,l,mid,ql,qr),query(x*2+1,mid+1,r,ql,qr));
}
int main() {
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
    }
    for (int i=n; i>=1; i--) {
        last[i]=nxt[a[i]];
        nxt[a[i]]=i;
    }
    int ans=0;
    for (int i=1; i<=n; i++) {
        if (last[i]!=0) {
          dp[last[i]]=max({dp[i],query(1,1,n,1,a[i]-1)+2,query(1,1,n,a[i]+1,n)+2});
        }
        modify(1,1,n,a[i],dp[i]);
        ans=max(ans,dp[i]);
    }
    cout << ans;
    return 0;
}
/*
1 1 1 1 2 2 1 1 3
1 1 1
*/

wa第1,2个点,90分救助

2024/10/13 12:12
加载中...