HDUOJ 6852 Increasing and Decreasing

HDUOJ 6852 Increasing and Decreasing

Topic link

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+1nxand+1 n < x + y − 1 n<x+y-1 n<x+and1
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;
}

Guess you like

Origin blog.csdn.net/qq_43765333/article/details/108677557