Wrong Answer 求助
查看原帖
Wrong Answer 求助
577880
cjh20090318楼主2023/8/14 19:52

Wrong Answer。

//the code is from chenjh
#include<cstdio>
#include<algorithm>
int n,k;
int a[3003][3003],f[3003][3003];
int H,T,q[3003];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)for(int j=1;j<=i;j++) scanf("%d",&a[i][j]),f[i][j]=a[i][j];
	int mk=std::__lg(k);
	for(int K=1;K<=mk;++K){
		for(int i=1,mi=n-(1<<K)+1,mj=1<<(K-1);i<=mi;i++){
			H=1,T=0;
			for(int j=1;j<=mj;q[++T]=j++)for(;H<=T && f[i+mj][q[T]]<f[i+mj][j];--T);
			for(int j=1;j<=i;j++){
				for(;H<=T && f[i+mj][q[T]]<f[i+mj][j+mj];--T);
				for(;H<=T && q[H]<j;++H);
				q[++T]=j+mj,f[i][j]=std::max(f[i][j],f[i+mj][q[H]]);
			}
		}
	}
	long long ans=0;
	if(k==(1<<mk))for(int i=1,mi=n-k+1;i<=mi;i++)for(int j=1;j<=i;j++)ans+=f[i][j];
	else{
		for(int i=1,mi=n-k+1,mj=k-(1<<mk);i<=mi;i++){
			H=1,T=0;
			for(int j=1;k<=mj;q[++T]=j++)for(;H<=T && f[i+mj][q[T]]<f[i+mj][j];--T);
			for(int j=1;j<=i;j++){
				for(;H<=T && f[i-mj][q[T]]<f[i+mj][j+mj];--T);
				for(;H<=T && q[H]<j;++H);
				q[++T]=j+mj,ans+=std::max(f[i][j],f[i+mj][q[H]]);
			}
		}
	}
	printf("%lld\n",ans);
	return 0;
}

2023/8/14 19:52
加载中...