P1338 末日的传说

题目描述

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

  

时间: 2024-07-29 04:55:10

P1338 末日的传说的相关文章

【洛谷P1338】末日的传说

https://www.luogu.org/problemnew/show/P1338 [题目大意:从1到n的连续自然数,求其逆序对数为m的一个字母序最小的排列.] 最开始的思路是想从逆序对数入手,然后按顺序求出一个个的排列然后找逆序对数==m的那种排列,后来由于我是个蒟蒻...求逆序对数对我来说似乎很难了..只能放弃此题(唉..这大概就是蒟蒻吧..) 蒟蒻不会做,然后搜了一下题解就又感觉学到东西了(常常为学到一点皮毛沾沾自喜然后水水博客..这大概就是蒟蒻喜欢做的事吧.) [这题应该从字母序最小

2018-3刷题记录(to be continued)

3-1 P1880 [NOI1995]石子合并 3-2 P1508 Likecloud-吃.吃.吃 P1387 最大正方形 3-3 P1417 烹调方案 P1855 榨取kkksc03 P1736 创意吃鱼法 P1541 乌龟棋 3-4//留坑:高精.标签 P1203 [USACO1.1]坏掉的项链Broken Necklace P1582 倒水 P1338 末日的传说 P1372 又是毕业季I P1865 A % B Problem P1233 木棍加工 P1315 观光公交 P1080 国王

从“水下八关”的传说说起(人民邮电报专栏《乐游记》之17)

越不容易开启的隐藏关卡,越容易成为剧情的特殊分支,直接影响到游戏的结局,而这激发了玩家高亢的游戏热情,同时让游戏经久不衰. 文/张书乐 二周目.隐藏角色.隐藏关卡等等探宝式的游戏玩法,让游戏具有了更强的续航力.任何事物都有一个起源,而在我看来,这一切都源于与<魂斗罗>有关的"水下八关"传说,这个传说和中国游戏玩家关系很大. 在没有社交网络的时代,<魂斗罗>游戏非常流行.而在游戏第六关有一个bug(程序漏洞),会使敌兵的图形显示不正常,变成类似青蛙嘴的模样.在中国

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

关于炉石传说的NGUI问题

前几天,将炉石传说的开场动画搬了上去.看实现界面. 感觉这个人物还是很性感的==!! 播放动画之后便是切换到主界面 1.在NGUI插件下打开prefabs Toolsbar. 2.将prefabs Toolsbar的background添加 3.删除backgroundController 4.找到背景图片之后右键NGUI,创建图集制作 5.在hierarchy面板中选定UIroot之后 在scene中右键创建精灵. 6.在图集的预制体上update/add logo的图片. 注释:sprite

七剑传说可以在手机上面玩吗

"流云,浮世繁生都只是一片虚妄而已,你有何必为了她如此执着呢?"星辰珠的声音响起,他竟然也学起了流云的腔调,就好像是得道高僧一般.http://dz9925.com "遮天大手,统统都给我拿住炼化!"http://fh9925.com 犹如晴天霹雳,突然乍响,震得周围的人一阵耳鸣.两人碰撞后,尘埃漫天,爆发出了震天的轰鸣声,宛如一道晴天霹雳直接落在了大地之上.http://yygj2255.com 惊天的剧烈撞击发生,光束直接激射在了禅掌的掌心,发出了一道道虚空震荡

炉石传说JJC英雄简评 &amp;&amp; JJC combo收集:Ver 1.0

? 1 2 3 4 5 6 7 /*-----------------------------------------------------------------------------  *  author:Rainboy and his GL 南柯CHY  *  wirte date:2014-04-29  * # LastUpdated: 2014-04-29 15:42  * ? Copyright 2014 Rainboy and his GL 南柯CHY.  All Rights

NOI2002银河英雄传说

原先就看过这道题,觉得很复杂. 不知道为什么今天一看觉得好水啊-- 难道这就是并查集的启发式合并? 数组d[i]表示i到其父节点的距离,即中间隔了多少船舰. 数组sum[i]记录以i为根的集合总共有多少个元素,将新节点插入的时候距离设为sum[i]就好了. 代码: 1 var fa,d,sum:array[0..30001] of longint; 2 t,i,xx,yy,x,y:longint; 3 ch:string[1]; 4 function find(x:longint):longin

CCF - 201609-3 - 炉石传说

问题描述 试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: * 玩家会控制一些角色,每个角色有自己的生命值和攻击力.当生命值小于等于 0 时,该角色死亡.角色分为英雄和随从. *