社区讨论
rz代码求调
P8776[蓝桥杯 2022 省 A] 最长不下降子序列参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m0rouilj
- 此快照首次捕获于
- 2024/09/07 13:12 去年
- 此快照最后确认于
- 2025/11/04 21:37 4 个月前
暴力代码被hack,实在调不出来了qaq
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,k,a[100005],b[100005],dp[100005],ma,flag[100005];
void solve(int t){
int m1=0,m2=0,t1=n-t-k+1,p=0;
flag[0]=1e9+1;
for(int i=1;i<=t-1;i++) dp[i]=1,b[i]=flag[i]=a[i];
for(int i=1;i<=t-1;i++)
for(int j=i+1;j<=t-1;j++)
if(b[i]<=b[j]){
if(dp[j]<=dp[i]+1){
if(dp[j]==dp[i]+1) flag[j]=min(flag[j],b[j]);
else flag[j]=b[j];dp[j]=dp[i]+1;
}
}
for(int i=1;i<=t-1;i++) m1=max(m1,dp[i]);
for(int i=1;i<=t-1;i++){
if(m1==dp[i]) flag[0]=min(flag[0],flag[i]);
}p=flag[0];
flag[0]=-1;
for(int i=1;i<=t1;i++) dp[i]=1,b[i]=flag[i]=a[t+k+i-1];
for(int i=1;i<=t1;i++)
for(int j=i+1;j<=t1;j++)
if(b[i]<=b[j]){
if(dp[j]<=dp[i]+1){
if(dp[j]==dp[i]+1) flag[j]=min(flag[j],flag[i]);
else flag[j]=flag[i];
dp[j]=dp[i]+1;
}
}
for(int i=1;i<=t1;i++) m2=max(m2,dp[i]);
for(int i=1;i<=t1;i++){
if(m2==dp[i]) flag[0]=max(flag[0],flag[i]);
}
// puts("");
// cout<<m1<<k<<m2<<'\n';
// cout<<p<<' '<<flag[0]<<'\n';
if(p<=flag[0]||t+k-1==n||t==1) ma=max(ma,m1+k+m2);
else ma=max(ma,max(m1+k,k+m2));
}
signed main(){
// freopen("sequence.in","r",stdin);
// freopen("sequence.out","w",stdout);
cin>>t;
// t=1;
while(t--){
ma=0;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
if(n==k||n>=5000) {cout<<n<<'\n';continue;}
for(int i=1;i+k-1<=n;i++){
solve(i);
}
cout<<ma<<'\n';
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...