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 对了,谢谢