ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LuoguP7852 「EZEC-9」Yet Another Easy Problem 题解

2021-12-15 21:36:18  阅读:161  来源: 互联网

标签:LuoguP7852 数字 int 题解 交换 Another printf leqslant 字典


Content

给定 \(n,m\),你需要输出一个长度为 \(n\) 的排列,满足该排列进行不超过 \(m\) 次交换操作可以得到的最小的字典序最大。

数据范围:\(T\) 组数据,\(1\leqslant T\leqslant 10^5\),\(1\leqslant n\leqslant 10^5\),\(\sum n\leqslant 10^5\),\(0\leqslant m\leqslant n\)。

Solution

算是一道比较小清新的构造题,接下来教你如何弄出正确的构造方案。

首先,要如何分配这 \(m\) 次交换,使得 \(m\) 次交换后的数列字典序最小?经分析不难得知,第 \(i\) 次交换的时候就应该把数字 \(i\) 和第 \(i\) 个位置上的数字进行交换,才能够达到最小字典序的目的。

那么如何构造出数列使得 \(m\) 次交换后的数列的最小字典序最大?既然 \(m\) 次交换后前面交换完的数已经是字典序最小了,那么就应当使得后面的部分的字典序最大。同时,为了尽可能多地消耗交换次数,不应该将数字 \(i(1\leqslant i\leqslant m)\) 放在第 \(i\) 个位置上面。

那么构造方案就呼之欲出了:\(\{n,1,2,\dots,m,n-1,n-2,\dots,m+1\}\)。这样构造既可以保证前 \(m\) 个要交换的数字不在自己的数字所表示的位置上面,又可以在 \(m\) 次交换之后使得最小字典序最大。因为后面的数不用进行交换,我们就先按照字典序最大给它排列好了,这样交换完以后后面的 \(n-m\) 个数字就一定可以保证是字典序最大的(前 \(m\) 个数字已经确定是 \(1,2,\dots,m\) 了)。

Code

namespace Solution {
    const int N = 1e5 + 7;
    int n, m;

    iv Main() {
        MT {
            read(n, m);
            if(n == m) F(int, i, 1, n) printf("%d%c", i, " \n"[i == n]);
            else {
                printf("%d", n);
                F(int, i, 1, m) printf(" %d", i);
                R(int, i, n - 1, m + 1) printf(" %d", i);
                puts("");
            }
        }
        return;
    }
}

标签:LuoguP7852,数字,int,题解,交换,Another,printf,leqslant,字典
来源: https://www.cnblogs.com/Eason-AC/p/15695203.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有