社区讨论

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 条回复,欢迎继续交流。

正在加载回复...