1009.Increasing and Decreasing
模拟
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
const int mod=1e9+7;
int main()
{
int t,n,x,y;
int a[maxn];
cin>>t;
while(t--)
{
scanf("%d %d %d",&n,&x,&y);
if(x+y>n+1)
{
printf("NO\n");
continue;
}
if(x+y==n&&(x==1||y==1))
printf("NO");
else if(x+y==n)
{
printf("YES\n");
int flag=0;
if(x>2)
{
printf("1");
flag=1;
}
for(int i=2;i<=x-2;i++)
{
if(flag)
printf(" ");
flag=1;
printf("%d",i);
}
for(int i=x;i>=max(1,x-1);i--)
{
if(flag)
printf(" ");
flag=1;
printf("%d",i);
}
for(int i=1;i<=y;i++)
{
if(flag)
printf(" ");
flag=1;
printf("%d",n-i+1);
}
}
else if(x+y==n+1)
{
printf("YES\n");
int flag=0;
if(x>1)
{
printf("1");
flag=1;
}
for(int i=2;i<x;i++)
{
if(flag)
printf(" ");
printf("%d",i);
}
if(flag)
printf(" ");
flag=1;
printf("%d",n);
for(int i=x+1;i<=n;i++)
{
if(flag)
printf(" ");
flag=1;
printf("%d",n-(i-x));
}
}
else if((ll)x*y>=(ll)n)
{
printf("YES\n");
int r=n,l=n-y;
while(r-y>=x-1)
{
for(int i=1;i<=y;i++)
a[l+i]=r--;
l-=y;
x--;
}
l=x-1;
int rr=r;
for(int i=1;i<=rr-x+1;i++)
a[l+i]=r--;
for(int i=1;i<=l;i++)
a[i]=i;
printf("%d",a[1]);
for(int i=2;i<=n;i++)
printf(" %d",a[i]);
}
else
printf("NO");
printf("\n");
}
return 0;
}