题目描述

只要是参加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。

所有数据均有解。

Solution:

  这题构造的也是贼有意思。

  题意就是求$1$到$n$的排列中字典序最小的一个满足逆序对个数为$m$的排列。

  首先,一个简单的结论就是$1$到$n$的排列逆序对个数最多为$\frac{n\times (n-1)}{2}$(也就是严格降序排列的时候),那么构造的时候直接贪心,考虑每个数的位置,对于当前数$i$,若剩下的$n-i$个数能组成的最多逆序对个数$\frac{(n-i)\times (n-i-1)}{2}\geq m$,则直接将其放在前端,而在不满足的情况时,$i$可以放在剩下的$n-i$个位置,发现应该将其放在末端会使字典序更小(可以想一下:$n=5,m=2$时,答案显然为$1,2,4,5,3$而不是$1,2,5,3,4$),这样会产生$n-i$个逆序对,使$m-(n-i)$,直接$O(n)$模拟此过程就好了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
ll n,m,q[];
int main(){
ios::sync_with_stdio();
cin>>n>>m;
ll tp,lst=n,fst=;
For(i,,n) {
tp=1ll*(n-i)*(n-i-)/;
if(tp>=m) q[++fst]=i;
else q[lst--]=i,m-=(n-i);
}
For(i,,n) cout<<q[i]<<' ';
return ;
}

最新文章

  1. completionService
  2. 每天一个命令ls 2015/4/1
  3. NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename
  4. 实战使用Axure设计App,使用WebStorm开发(5) – 实现页面功能
  5. OGNL_一点
  6. 用 Docker 快速配置前端开发环境
  7. UVa 1401 (Tire树) Remember the Word
  8. add BOM to fix UTF-8 in Excel
  9. MongoDB用户
  10. Oracle 生成一张测试表并插入随机数据
  11. 有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
  12. 函数声明 和 var声明的优先级
  13. tomcat7 内存溢出 java.lang.OutOfMemoryError 处理方法
  14. Myeclipse 启动报错 Failed to create the java Virtual Machine
  15. AWS EC2 使用root账户密码登陆
  16. 【log4net】配置文件解释
  17. IDEA配置maven,jdk,编码
  18. 网络技术之TCP三次握手
  19. #pragma的一些用法
  20. LeetCode: Swap Nodes in Pairs 解题报告

热门文章

  1. javaScript 字符串与unicode码之间的相互转换,函数的封装
  2. 基于pygame的打砖块游戏,做到一半,不带做了
  3. python爬虫:爬取链家深圳全部二手房的详细信息
  4. SSH远程登录和端口转发详解
  5. 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象
  6. go学习笔记-面向对象(Methods, Interfaces)
  7. python2.7入门---运算符 &amp;案例
  8. docker学习(三) 安装docker的web可视化管理工具
  9. Koa基本使用
  10. 【面试题】2018年最全Java面试通关秘籍第五套!