我™心态炸了啊。 题目
#include<bits/stdc++.h>
#define N 100100
using namespace std;
int re,n,d,k,t,b,o,ans[N],cnt,first[N],p[N];
char c;
int read(){
re=0;
c=getchar();
while(c<'0'||c>'9'){
c=getchar();
}
while(c>='0'&&c<='9'){
re=(re<<3)+(re<<1)+(c^48);
c=getchar();
}
return re;
}
void write(int x){
if(x/10){
write(x/10);
}
putchar(x%10|48);
}
int main(){
t=read();
while(t--){
n=read();
d=read();
k=read();
if(n==1&&d==0){
putchar('Y');
putchar('E');
putchar('S');
putchar('\n');
putchar('\n');
continue;
}
b=1;
cnt=0;
o=true;
for(int j = 1;b<=n-k;j++){
if(j*k<n)break;
first[j]=b;
for(int i = b;i < n;i++){
ans[i]=j;
}
cnt+=n-b;
if(cnt==d){
putchar('Y');
putchar('E');
putchar('S');
putchar('\n');
for(int i = 1;i<n;i++){
write(first[ans[i]-1]+1);
putchar(' ');
}
putchar('\n');
o=false;
break;
}
else if(cnt>d&&j!=1){
for(int i = b;i<=b+cnt-d-1;i++){
ans[i]=j-1;
}
first[j]=b+cnt-d;
if(n-b-cnt+d<k){
break;
}
putchar('Y');
putchar('E');
putchar('S');
putchar('\n');
for(int i = 1;i<n;i++){
write(first[ans[i]-1]+1);
putchar(' ');
}
putchar('\n');
o=false;
break;
}
else if(cnt>d&&j==1){
break;
}
b+=k;
}
if(o){
putchar('N');
putchar('O');
putchar('\n');
}
}
return 0;
}