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;
}