HDUOJ 6852 Increasing and Decreasing
Problem Description
Notice:Don’t output extra spaces at the end of one line.
Given n,x,y, please construct a permutation of length n, satisfying that:
- The length of LIS(Longest Increasing Subsequence) is equal to x.
- The length of LDS(Longest Decreasing Subsequence) is equal to y.
If there are multiple possible permutations satisfying all the conditions, print the lexicographically minimum one.
Input
The first line contains an integer T(1≤T≤100), indicating the number of test cases.
Each test case contains one line, which contains three integers n,x,y(1≤n≤1e5,1≤x,y≤n).
Output
For each test case, the first line contains "YES’’ or "NO’’, indicating if the answer exists. If the answer exists, output another line which contains n integers, indicating the permutation.
Sample Input
4
10 1 10
10 10 1
10 5 5
10 8 8
Sample Output
YES
10 9 8 7 6 5 4 3 2 1
YES
1 2 3 4 5 6 7 8 9 10
YES
1 2 3 5 4 10 9 8 7 6
NO
Thinking + structure~
It is easy to find that the length of LIS is the number of LDS, and the length of LDS is the number of LIS~
Then output -1 is n ≥ x ∗ y + 1 n\geq x*y+1n≥x∗and+1 和 n < x + y − 1 n<x+y-1 n<x+and−1
Consider the structure below, we can putnnaccording to the law found aboven is divided intoxxGroup x , but the question requires the smallest lexicographic order, that is, the following blocks should be as large as possible when dividing blocks, and the answer can be stored in the stack. The AC code is as follows:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll n,a,b;
int main(){
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&n,&a,&b);
if(n>=a*b+1||n<a+b-1) printf("NO\n");
else{
printf("YES\n");
stack<int>ans;
while(a){
if(n-b>=a-1){
for(int i=n-b+1;i<=n;i++) ans.push(i);
n-=b;
a--;
}else b=n+1-a;
}
while(!ans.empty()){
printf("%d",ans.top());
ans.pop();
if(!ans.empty()) printf(" ");
else printf("\n");
}
}
}
return 0;
}