20pts 输出不合规
查看原帖
20pts 输出不合规
799835
HHP_dokidoki楼主2023/9/9 14:03

sub0、sub1以及第41点全部显示输出不合规 向大佬们请教问题出在哪

code:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

#define N 100050

ll t,n,d,k;
ll fmx[N],fmn[N];

void build1(ll dep){
	ll now=1,fa=1;
	while (now<=dep){
		for (int i=1;i<=k;i++){
			printf("%lld ",fa);
		}
		now++;
		fa=1+(now-1)*k;
	}
	fa=1+(dep-1)*k;
	for (int i=1;i<=n-1-k*dep;i++){
		printf("%lld ",fa);
	}
	printf("\n");
}

void build2(int dep){
	ll now=1,fa=1;
	ll cnt=0;
	for (int i=1;i<=n-1-(dep-1)*k;i++){
		printf("%lld ",fa);
		cnt++;
	}
	now++;
	fa+=cnt;
	while (now<=dep){
		cnt=0;
		for (int i=1;i<=k;i++){
			printf("%lld ",fa);
			cnt++;
		}
		now++;
		fa+=cnt;
	}
	printf("\n");
}

ll Cnt[N];
void build3(ll dep){
	ll sum=0;
	for (int i=1;i<=dep;i++){
		Cnt[i]=k;
		sum+=i*k;
	}
	ll dx=d-sum;
	ll more=n-1-k*dep;
	ll now=2;
	Cnt[1]+=more;
	dx-=more;
//	printf("dep:%d dx:%d more:%d \n",dep,dx,more);
	while (dx&&now<=dep){
		if (dx&&Cnt[now-1]>k){
			int move=min(Cnt[now-1]-k,dx);
			dx-=move;
			Cnt[now]+=move;
			Cnt[now-1]-=move;
		}
		now++;
	}
	int fa=1;
	for (int i=1;i<=dep;i++){
		int cnt=0;
		for (int j=1;j<=Cnt[i];j++){
			printf("%lld ",fa);
			cnt++;
		}
		fa+=cnt;
	}
	printf("\n");
}

int main(){
	scanf("%lld",&t);
	while (t--){
		scanf("%lld%lld%lld",&n,&d,&k);
		int Mcnt=n-1,dep=1;
		fmx[1]=fmn[1]=n-1;
		for (int i=2;Mcnt>=2*k;i++){
			dep=i;
//			printf("dep:%d Mcnt:%d\n",dep,Mcnt);
			fmx[i]=fmx[i-1]+Mcnt-k;
			fmn[i]=fmn[i-1]+k*(i-1);
			Mcnt-=k;
//			printf("fmx[%d]:%d fmn[%d]:%d \n",i,fmx[i],i,fmn[i]);
		}
		bool flag=0;
		ll MinDep;
		for (int i=1;i<=dep;i++){
			if (d<=fmx[i]&&d>=fmn[i]){
				flag=1;
				MinDep=i;
				break;
			}
		}
		if (n==1){
			printf("NO\n");
		}else if (flag){
			printf("YES\n");
//			printf("dep:%d\n",MinDep);
			if (d==fmx[MinDep]){
				build1(MinDep);
			}else if (d==fmn[MinDep]){
				build2(MinDep);
			}else{
				build3(MinDep);
			}
		}else{
			printf("NO\n");
		}
	}
	return 0;
}
2023/9/9 14:03
加载中...