题目描述

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

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

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

1, 2, 3, … N

第二天,日历自动变为

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

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

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

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

5 4

输出样例#1:

1 3 5 4 2

说明

对于10%的数据有N <= 10。

对于40%的数据有N <= 1000。

对于100%的数据有 N <= 50000。

所有数据均有解。

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

比如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>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const lli MAXN=50001;
inline void read(lli &n)
{char c='+';lli x=0;bool flag=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48,c=getchar();}flag==1?n=-x:n=x;
}
lli a[MAXN];
lli ed,bg;
int main()
{lli n,m;read(n);read(m);ed=n;bg=1;for(lli i=1;i<=n;i++){lli num=(n-i)*(n-i-1)/2;if(num>=m)a[bg++]=i;else a[ed--]=i,m-=(ed-bg+1);}for(lli i=1;i<=n;i++)printf("%lld ",a[i]);return 0;
}

  

P1338 末日的传说相关推荐

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

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

  2. 【简单数学】末日的传说

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

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

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

  4. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

  5. css动画在线生成,在线制作css动画——cssanimate

    熟悉CSS的人都知道,CSS可以实现很多漂亮的动画,特别是它的在线功能,能够帮助人们解决很多制作动画的效果.今天特别推荐一个在线CSS插件功能--cssanimate,这个最大的特色就是以图形界面方式 ...

  6. 炉石无限重新连接服务器,炉石传说:竟然还有这种无限资源的操作

    原标题:炉石传说:竟然还有这种无限资源的操作 不过令人惋惜的是,小劣对局,鱼人萨打机械猎比节奏贼优势更大,由于荣誉室的机制使得经典卡包对于玩家的吸引力越发减少了,而是他能提供一个源源不断的过牌,这张卡 ...

  7. 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

    import java.math.BigInteger; /* * 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序 ...

  8. 诺亚传说手游怎么用电脑玩 诺亚传说手游PC电脑版教程

    <诺亚传说手游>是一款经典的科幻之作,游戏是从端游戏中移植,是一款以即时战斗为背景的科幻类游戏,有着精致的3D场景打造带给玩家丰富的玩法体验,优秀的剧情让你感受游戏精彩魅力.下面小编就给亲 ...

  9. java二维数奇数组金字塔_金字塔内神秘的数字~世界末日真的存在?

    说到世界末日,大家一定对2012还记忆犹新,曾被说的玄乎奇迹,传的沸沸扬扬的2012世界末日最终也没有到来,到来的只是一堆借着世界末日的噱头炒起来的电影和一群赚的盆满钵满的导演.不过科学家们总是不甘寂 ...

最新文章

  1. 三句话回答C/C++面试题
  2. winrar 无法设置 xxx.aspx 的安全数据 -- 用批处理压缩文件在user账号下解压缩发生的错误...
  3. asp.net中将枚举绑定到下拉列表
  4. httpHandlers
  5. c语言c99标准_自学C语言之一
  6. iOS UI基础-7.0 UIScrollView
  7. dom4j的读写xml文件,读写xml字符串
  8. Diango博客--6.Markdown 文章自动生成目录
  9. sqlyog for MySQL远程连接的时候报错mysql 1130的解决方法
  10. python unittest 框架添加测试用例及运行
  11. 广东汕头市队赛? T1 模拟
  12. docker安装gamit_ubuntun10.10中安装gamit 10.40
  13. MySQL chartset
  14. 微信聊天内容制作生成器微信小程序源码_支持多种制作生成
  15. 开环单位增益带宽 , 与-3db的关系
  16. CTFshou wed文件上传
  17. 助你掌握搜索神器,10个实用的Elasticsearch查询技巧
  18. 毕业论文-马尔可夫随机场
  19. Java中对中国标准时间进行格式化(yyyy-MM-dd HH:mm:ss)两种方法
  20. 即时编译器真心大冒险之解释器

热门文章

  1. springboot:banner.txt
  2. 前端二十七:四彩边框
  3. 涂抹mysql笔记-mysql复制特性
  4. 呼叫中心团队管理浅谈
  5. 新成立的Scala中心将重点关注教育和Scala社区
  6. 11g 64位部分安装过程
  7. 用户体验思考之UI面试
  8. 如何在windows7和windows8双系统中卸载windows8
  9. linux环境双网卡主机路由配置
  10. docker部署项目 入门版