洛谷P1338 末日的传说
题目描述
只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了。
在古老东方的幻想乡,人们都采用一种奇特的方式记录日期:他们用一些特殊的符号来表示从1开始的连续整数,1表示最小而N表示最大。创世纪的第一天,日历就被赋予了生命,它自动地开始计数,就像排列不断地增加。
我们用1-N来表示日历的元素,第一天日历就是
1, 2, 3, … N
第二天,日历自动变为
1, 2, 3, … N, N-1
……每次它都生成一个以前未出现过的“最小”的排列——把它转为N+1进制后数的数值最小。
日子一天一天地过着。有一天,一位预言者出现了——他预言道,当这个日历到达某个上帝安排的时刻,这个世界就会崩溃……他还预言到,假如某一个日期的逆序达到一个值M的时候,世界末日就要降临。
什么是逆序?日历中的两个不同符号,假如排在前面的那个比排在后面的那个更大,就是一个逆序,一个日期的逆序总数达到M后,末日就要降临,人们都期待一个贤者,能够预见那一天,到底将在什么时候到来?
输入输出格式
输入格式:
只包含一行两个正整数,分别为N和M。
输出格式:
输出一行,为世界末日的日期,每个数字之间用一个空格隔开。
输入输出样例
5 4
1 3 5 4 2
说明
对于10%的数据有N <= 10。
对于40%的数据有N <= 1000。
对于100%的数据有 N <= 50000。
所有数据均有解。
数论
这个讲得太详细了:https://www.luogu.org/blog/user11765/solution-p1338
我们考虑把这个问题缩小范围。
比如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<stdio.h>
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("%d ", a[i]);return 0;
}
洛谷P1338 末日的传说相关推荐
- 洛谷p1338末日的传说(思维好题,数学)
题目链接:https://www.luogu.org/problemnew/show/P1338 题目暴力全排列是肯定不行的. 比较难想啊,关键抓住字典序小也就是小的数尽量往前排,找剩余的逆序对数! ...
- #模拟#洛谷 1338 末日的传说
题目 就是求 1 ∼ n 1\sim n 1∼n排列逆序对总数为 m m m,字典序最小 分析 一开始最大逆序对总数为 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n∗(n−1)/2 ( ...
- 洛谷 P1196 银河英雄传说
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- P1338 末日的传说
题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...
- 洛谷P1196 银河英雄传说
题目大意: 一些战舰,初始时每个都在自己编号对应的队列中,现在有两个操作 : M a b:把a战舰所在的队列顺序不变的接到b战舰所在队列尾部 C a b:询问a b在同一个队列之间的距离 如果a b不 ...
- 洛谷 - 试炼场(全部题目备份)
整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...
- 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)
题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...
- 洛谷 P2357 守墓人
洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...
- 2021寒假——洛谷刷题计划(35题)
(希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
最新文章
- 【机器视觉案例】(10) AI视觉搭积木,手势移动虚拟物体,附python完整代码
- 设置vue运行npm run dev时候,项目在浏览器自动打开页面的方法
- 开博首发2017年1月13日开博大吉
- python小结教学_python教学
- 利用XML实现通用WEB报表打印 卢彦
- C# params的用法详解
- ES curator离线安装与部署
- Redis夺命连环11问
- 织梦dedecms响应式自媒体图片新闻资讯网站模板
- Go语言基础进阶—程序结构—变量
- 子类能不能继承父类的成员变量
- spring boot示例_Spring Boot REST示例
- android内存占用分析,Android内存优化————虚引用与弱引用的使用及内存分析工具...
- 线性代数matlab的心得体会,关于线性代数心得体会
- 离散数学——容斥原理
- Java实现找零问题
- hdu计算机网络实验,计算机网络实验报告(杭电).doc
- php 字符查询_php中几个常用的字符串查找函数
- hiveserver2 和beeline_Beeline连接Hiveserver2错误
- 智能门锁-手机应用相机国产、非国产统计参数对比分析
热门文章
- 解决only integer scalar arrays can be converted to a scalar index
- oracle jdbc驱动jar包下载,oracle各个版本所需要的ojdbc jar驱动包以及版本对应关系...
- Microservice Patterns 下载
- QT 信号与槽不在同一个线程 connect
- 动作频频,BAT欲瓜分10万亿互联网医疗市场蛋糕?
- 搜狗皮肤.php,搜狗皮肤制作
- 量子计算机 并行,核磁共振量子计算机与并行量子计算
- windows xp 下载老版本的chrome浏览器
- 将系统临时文件夹恢复到原来默认的目录
- 汽车零部件行业需求分析及解决方案