题目链接:https://www.luogu.org/problemnew/show/P1338
转载自:https://www.luogu.org/blog/user11765/solution-p1338

题目描述

只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了。

在古老东方的幻想乡,人们都采用一种奇特的方式记录日期:他们用一些特殊的符号来表示从1开始的连续整数,1表示最小而N表示最大。创世纪的第一天,日历就被赋予了生命,它自动地开始计数,就像排列不断地增加。

我们用1-N来表示日历的元素,第一天日历就是

1, 2, 3, … N

第二天,日历自动变为

1, 2, 3, … N, N-1

……每次它都生成一个以前未出现过的“最小”的排列——把它转为N+1进制后数的数值最小。

日子一天一天地过着。有一天,一位预言者出现了——他预言道,当这个日历到达某个上帝安排的时刻,这个世界就会崩溃……他还预言到,假如某一个日期的逆序达到一个值M的时候,世界末日就要降临。

什么是逆序?日历中的两个不同符号,假如排在前面的那个比排在后面的那个更大,就是一个逆序,一个日期的逆序总数达到M后,末日就要降临,人们都期待一个贤者,能够预见那一天,到底将在什么时候到来?

输入输出格式

输入格式:

只包含一行两个正整数,分别为N和M。

输出格式:

输出一行,为世界末日的日期,每个数字之间用一个空格隔开。

我们考虑把这个问题缩小范围。

比如n=5,在决定了最小的数“1”的位置之后,剩下的几个数是2 3 4 5,但是他们

具体是多少没必要关心,我们只要关心他们的相对大小关系。

所以考虑完当前最小的数,算出这个数对答案的贡献,然后减掉这个贡献,

就可以转而解决一个更小的子问题。(即n-->n-1)

回到题目上,要求是求一个有m个逆序对的字典序最小的排列。

我们知道一个长度为n的排列最多有(n-1)*n/2个逆序对,也知道一个排列的逆序对数越多,排列字典序越大。

所以如果当前m不比当前的(n-2)*(n-1)/2(也就是减少一个数之后的最多的逆序对数)大,

就可以直接把当前的最小数放在最前面,这肯定是最优的。

反之,则考虑最小数的放置位置。

假设当前排列长为n,最小数为a,则a有n种放法,放在从左到右第i个位置时会生成i-1个逆序对

(因为它左边有i-1个比他大)。

因为m大于n-1长度排列最多所能产生的逆序数,所以a不可能放在最前面,否则不满足条件。

怎么办呢?想到之前说的逆序对越多字典序越大,我们就必须让剩下的数能构成的逆序对数尽量小,所以a要放到最后,这样m减少的最多。

放完了a,问题就变成了n-1和m-(a的贡献)的子问题,递归求解即可。时间复杂度O(n)。

#include<cstdio>
typedef long long ll;
ll n,m,a[50005];
int main(){scanf("%lld%lld",&n,&m);ll lst=n,fst=1;for(int i=1;i<=n;i++){ll t=(ll)(n-i)*(n-i-1)/2;if(t>=m)a[fst++]=i;//放头上else a[lst--]=i,m-=(lst-fst+1);//放最后}for(int i=1;i<=n;i++)printf("%lld ",a[i]);return 0;
}

洛谷P1338(末日的传说)相关推荐

  1. 洛谷p1338末日的传说(思维好题,数学)

    题目链接:https://www.luogu.org/problemnew/show/P1338 题目暴力全排列是肯定不行的. 比较难想啊,关键抓住字典序小也就是小的数尽量往前排,找剩余的逆序对数! ...

  2. #模拟#洛谷 1338 末日的传说

    题目 就是求 1 ∼ n 1\sim n 1∼n排列逆序对总数为 m m m,字典序最小 分析 一开始最大逆序对总数为 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n∗(n−1)/2 ( ...

  3. 洛谷 P1196 银河英雄传说

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  4. P1338 末日的传说

    题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...

  5. 洛谷P1196 银河英雄传说

    题目大意: 一些战舰,初始时每个都在自己编号对应的队列中,现在有两个操作 : M a b:把a战舰所在的队列顺序不变的接到b战舰所在队列尾部 C a b:询问a b在同一个队列之间的距离 如果a b不 ...

  6. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  7. 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)

    题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...

  8. 洛谷 P2357 守墓人

    洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...

  9. 2021寒假——洛谷刷题计划(35题)

    (希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...

  10. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

最新文章

  1. 利用七牛云实现简单的图床
  2. [转贴]IT外包服务商如何构建高效率的服务台运营机制
  3. java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现
  4. 程序员工资倒挂,IT 行业薪资潜规则如何规避?
  5. IntelliJ Idea取消Could not autowire. No beans of 'xxxx' type found的错误提示
  6. 将java.util.Date转换为java.time.LocalDate
  7. 多线程编程:线程死锁的原因以及解决方法
  8. 从病毒手里抢时间:百度研究院研发RNA测序算法检测速度提升120倍
  9. Android Camera setRecordingHint函数 在部分手机上的问题。
  10. 13.4 Shelve模块
  11. c语言教师工资管理系统源程序设计,C语言教师工资管理系统
  12. 引起相变的无序结构域(IDRs)怎么预测?跟踪热点,提升文章档次!
  13. 英文论文评审意见_艾德思:英文论文审稿意见模板
  14. 飞马哥:正确推广模式框架的解析
  15. 【机器学习】【决策树】ID3算法,Python代码实现生成决策树的系统
  16. 计算机本地连接没有有效ip配置,本地连接没有有效的ip配置,详细教您本地连接没有有效的ip配置怎么解决...
  17. 极限编程:价值观、原则和实践
  18. 录音分享以及重命名功能小结
  19. CentOS上的硬盘分区
  20. 直插电阻通过色环读取电阻阻值,误差与温度系数方法总结

热门文章

  1. mysql lookup3,引用函数(三):lookup
  2. TPM管理解决制造型企业成本大问题的常用手段
  3. ELK 可视化分析热血电影《长津湖》15万+影评
  4. 如何写好一份 30 K offer 的简历(建议收藏)
  5. 混合云存储跨云灾备方案之跨云备份
  6. python 抢票程序_程序员硬核Python抢票教程”,帮你抢回家车票
  7. 利用css修改图标颜色
  8. Android系统优化的那些年那些事
  9. 服务器硬盘sas速度多少,R710服务器6块硬盘(SAS 300G 15000转)做完Raid5后读写速度没有一台普通台式机硬盘的读写速度快...
  10. fcitx5 使用搜狗皮肤