1 条题解

  • 0
    @ 2025-5-16 18:45:41

    方法思路

    逆序数分析

    逆序数是衡量序列中元素相对顺序的指标。最大逆序数为 n(n1)/2n(n-1)/2,此时序列为完全降序排列。

    最小逆序数为 00,此时序列为完全升序排列。

    构造最小排列

    为了构造满足条件的最小排列,我们需要在保证逆序数恰好为 mm 的前提下,使排列尽可能小。

    具体步骤

    确定一个分割点 spsp,使得前 sp1sp-1 个数的逆序数不超过 mm

    k=nspk = n - sp 个数按升序排列,这部分不贡献逆序数。

    k+1k+1 个数选择适当的数值,使得剩余逆序数恰好由后 spsp 个数的降序排列贡献。

    关键计算

    计算分割点 spsp,使得 sp(sp1)/2m<sp(sp+1)/2sp(sp-1)/2 ≤ m < sp(sp+1)/2

    确定第 k+1k+1 个数的位置,以调整逆序数到精确值 mm

    C++代码实现:

    #include <stdio.h>
    int n,m;
    int main(){
    	int i,j,sp;
    	while(scanf("%d%d",&n,&m)==2) {
    		if(n==-1&&m==-1) break;
    		sp=1;
    		while(sp*(sp-1)/2<m) sp++;
    		int k=n-sp;
    		for(i=1; i<=k; i++) printf("%d ",i);
    		int first=m-(sp-1)*(sp-2)/2;
    		printf("%d ",first+1+k);
    		for(i=sp; i>1; i--) {
    			if(i==first+1) continue;
    			printf("%d ",i+k);
    		}
    		printf("%d\n",i+k);
    	}
    	return 0;
    }
    • 1

    信息

    ID
    1086
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者