C. No More Inversions :Codeforces Round 102 (Rated for Div. 2)

该博客讨论了一种数组操作的问题,其中给定一个包含1到k的全排列数组p,目标是找到一个p使得根据a数组转换得到的b数组的倒置数目不超过n,并保持b的最大字典序。文章解析了如何通过分析数组的对称性来简化问题,最终得出解决方案,并提供了相应的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C. No More Inversions

在这里插入图片描述

大致题意:

一个a数组,内容为1 2 3 4 … k-1 k k-2 … k-(n-k)
有一个数组p,大小为k,且里面的值为k的一个全排列。(a[i]∈[0,k]) 问寻找一个数组p,使得对于i∈[1,n]
有b[i]=p[a[i]]满足b数组的倒置数目不能超过n,且让b的字典序最大(一个倒置为存在一个i,j,i<j使得a[i]>a[j]
即逆序数)

思路:

看将数组a分为两个部分

  1. 1 2 3 4 … k-(n-k)-1
  2. K-(n-k) k-(n-k)+1 … k k-1 … k-(n-k) 注意到第二部分数组a是关于k对称的,也就是说对于任意i,j∈[k-(n-k) k]取不同值,都存在一个倒置,a[i] a[j] a‘[j]
    a’i a[i] a`[j]不倒置 则a[j] a’[i]必倒置 这样 无论在第二部分中
    也即p中下表为k-(n-k)到k之间取值如何 b和a数组中的倒置数目始终相同 无需考虑 看第一部分 需要让b和a数组一样 才能保证倒置一样
    又考虑到最大字典序,所以第二部分逆序输出即可。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<cstdio>
#include<cmath>
#include<stdlib.h>

using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6+50;

int main(){
	int t;
	cin >> t;
	while(t--){
		int n,k;
		cin >> n >> k;
		for(int i = 1;i < 2*k-n;i++)	cout << i << ' ';
// 2*k-n即可 k-(n-k)的变形
		for(int i = k;i >= 2*k-n;i--)		cout << i << ' ';
//空格格式要求不是很严格
		cout << endl;
	} 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值