分治40求调

B3637 最长上升子序列

wang_ly_ly @ 2023-12-11 22:43:44

写分治,求大佬看一下哪错了,有一个错误数据也行,谢谢

#include<iostream>
#include<algorithm>
using namespace std;
long long a[5003],dp[5003];
struct B{
    long long x,id;
}b[5003],c[5003];
bool tmp(B x1,B x2){
    return x1.x<x2.x;
}
void fenzhi(long long l,long long r){
    if(l==r){
        dp[l]=max(1ll,dp[l]);
        return;
    }
    long long mid=(l+r)/2;
    fenzhi(l,mid);
    for(long long i=l;i<=mid;i++){
        b[i].x=a[i];
        b[i].id=i;
    }
    for(long long i=mid+1;i<=r;i++){
        c[i].x=a[i];
        c[i].id=i;
    }
    sort(b+1+l,b+1+mid,tmp);
    sort(c+1+mid+1,c+1+r,tmp);
    long long x=l,maxx=-9999999;
    for(long long i=mid+1;i<=r;i++){
        while(x<=mid&&b[x].x<c[i].x){
            maxx=max(dp[x],maxx);
            x++;
        }
        dp[i]=max(dp[i],maxx+1);
    }
    for(int i=l;i<=r;i++)b[i].x=b[i].id=c[i].id=c[i].x=0;
    fenzhi(mid+1,r);
}
int main(){
    long long n;
    cin>>n;
    for(long long i=1;i<=n;i++){
        cin>>a[i];
    }
    fenzhi(1,n);
    long long ans=0;
    for(long long i=1;i<=n;i++)ans=max(ans,dp[i]);
    cout<<ans;
    return 0;
} 

by czr2012 @ 2023-12-12 08:29:30

@wang_ly_ly 这是最长上升子序列?为什么没有提交记录?


by Luzhuoyuan @ 2023-12-12 11:07:38

@wang_ly_ly

sort 是左闭右开区间,应该是 sort(b+l,b+1+mid,tmp);sort(c+1+mid,c+1+r,tmp);

还有,下面的循环是对 id 操作,while 中应改成 maxx=max(dp[b[x].id],maxx);,外面改成 dp[c[i].id]=max(dp[c[i].id],maxx+1);


by wang_ly_ly @ 2023-12-12 14:31:42

@Luzhuoyuan 对了,谢谢


|