Gorilla and Permutation

题目链接

Gorilla 和 Noobish_Monk 发现了三个数字 n 、 m 和 k ( m<k )。他们决定构造一个长度为 n 的排列组合 † 。

对于这个排列,Noobish/Monk 想到了下面的函数: g(i) 是长度为 i 的前缀上的排列中所有不大于 m 的数字之和。同样,Gorilla 提出了函数 f ,其中 f(i) 是长度为 i 的前缀上不小于 k 的排列中所有数字之和。长度为 i 的前缀是由原始数组的前 i 个元素组成的子数组。

例如,如果 n=5 , m=2 , k=5 ,且排列为 [5,3,4,1,2] ,那么:

  • 𝑓(1)=5 ,因为 5≥5 ; 𝑔(1)=0 ,因为 5>2 ;
  • 𝑓(2)=5 ,因为 3<5 ; 𝑔(2)=0 ,因为 3>2 ;
  • 𝑓(3)=5 ,因为 4<5 ; 𝑔(3)=0 ,因为 4>2 ;
  • 𝑓(4)=5 ,因为 1<5 ; 𝑔(4)=1 ,因为 1≤2 ;
  • 𝑓(5)=5 ,因为 2<5 ; 𝑔(5)=1+2=3 ,因为 2≤2 。

帮助他们找出一个使 (∑𝑖=1𝑛𝑓(𝑖)−∑𝑖=1𝑛𝑔(𝑖)) 的值最大的排列。

† 长度为 n 的排列是由 n 个不同的整数组成的数组,这些整数的顺序从 1 到 n 不等。例如, [2,3,1,5,4] 是一个排列,但 [1,2,2] 不是排列(因为 2 在数组中出现了两次), [1,3,4] 也不是排列(因为 n=3 ,但 4 出现在数组中)。

输入

第一行包含一个整数 t ( 1≤t≤10^4 ) - 测试用例的数量。

每个案例的唯一一行包含三个整数 n , m, k ( 2≤n≤10^5 ; 1≤m<k≤n)--要构建的排列的大小和两个整数。

保证所有测试用例中 n 的总和不超过 2⋅10^5 。

输出

对于每个测试用例,输出排列组合,即满足问题条件的一组数字。如果有多个解决方案,则输出其中任何一个。

Example

input

3
5 2 5
3 1 3
10 3 8

output

5 3 4 1 2
3 2 1
10 9 8 4 7 5 6 1 2 3

Note

In the first example, (∑ni=1f(i)−∑ni=1g(i))=5⋅5−(0⋅3+1+3)=25−4=21

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[10000010];
signed main(){
	int t;
	cin>>t;
	while(t--){
		int n,m,k;
		cin>>n>>m>>k;
//		n-m+1  1-m 
		while(n){
			cout<<n<<" ";
			n--;
			if(n<=m)break;
		}
		for(int i=1;i<=m;i++){
			cout<<i<<" ";
		}
		cout<<endl;
	}
    return 0;
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值