https://www.luogu.org/problemnew/show/P1338

先打表看了一下规律,居然看出来n的位置是阶梯往前的.而每个阶梯的头头,必有后半段降序.

再仔细看一下居然每次交换后半段的没被交换过的元素和前半段的最后一个元素.

打了一个表,不清楚复杂度就交了,当时以为是n²的,因为逆序数最多有 \(C_n^2\) 但最后事实证明不是.

因为一开始找阶梯是n的,找到之后这个阶梯的长度最多也是n的,其实复杂度是两个n.

附带打表代码以及表:

#include<bits/stdc++.h>
using namespace std;
#define ll long long int main(){
int n;
while(cin>>n){
vector<int> v;
for(int i=1;i<=n;i++)
v.push_back(i);
int maxcnt=-1;
do{
int cnt=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(v[i]>v[j]){
cnt++;
}
}
}
if(cnt>maxcnt){
for(int i=0;i<n;i++)
printf("%d ",v[i]);
printf(" cnt=%d\n",cnt);
maxcnt=cnt;
}
}while(next_permutation(v.begin(),v.end()));
}
}
5
1 2 3 4 5 cnt=0
1 2 3 5 4 cnt=1
1 2 4 5 3 cnt=2
1 2 5 4 3 cnt=3
1 3 5 4 2 cnt=4
1 4 5 3 2 cnt=5
1 5 4 3 2 cnt=6
2 5 4 3 1 cnt=7
3 5 4 2 1 cnt=8
4 5 3 2 1 cnt=9
5 4 3 2 1 cnt=10 6
1 2 3 4 5 6 cnt=0
1 2 3 4 6 5 cnt=1
1 2 3 5 6 4 cnt=2
1 2 3 6 5 4 cnt=3
1 2 4 6 5 3 cnt=4
1 2 5 6 4 3 cnt=5
1 2 6 5 4 3 cnt=6
1 3 6 5 4 2 cnt=7
1 4 6 5 3 2 cnt=8
1 5 6 4 3 2 cnt=9
1 6 5 4 3 2 cnt=10
2 6 5 4 3 1 cnt=11
3 6 5 4 2 1 cnt=12
4 6 5 3 2 1 cnt=13
5 6 4 3 2 1 cnt=14
6 5 4 3 2 1 cnt=15

然后是构造表的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long int ans[50005];
int pos[50005]; int main(){
ll n,m;
while(cin>>n>>m){
//for(int cm=0;cm<=n*(n-1)/2;cm++){
//ll m=cm;
for(int i=1;i<=n;i++){
ans[i]=i;
pos[i]=i;
} /*if(m==0){
for(int i=1;i<=n;i++)
printf("%d%c",ans[i]," \n"[i==n]);
continue;
}*/ ll sum=0;
int p=0;
while(sum<=m){
p++;
sum+=p;
} sum-=p;
p--; for(int i=0;i<=p;i++){
ans[n-i]=(n-(p-i));
pos[n-(p-i)]=i;
} /*for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");*/ int curchange=n;
while(m>sum){
swap(ans[n-p-1],ans[curchange]);
m--;
curchange--;
} for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n"); //cout<<sum<<endl;
//}
}
}

洛谷 - P1338 - 末日的传说 - 打表的更多相关文章

  1. 洛谷 P1338 末日的传说 解题报告

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

  2. [洛谷P1338] 末日的传说

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

  3. 洛谷 P1338 末日的传说

    题目链接:https://www.luogu.org/problemnew/show/P1338 题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次, ...

  4. 洛谷 P1338 末日的传说 (字典序 + 逆序对)

    这道题需要对排列有深刻的理解和认识 给出逆序对的个数,求改逆序对个数的字典序最小的排列 那么既然是最小,那么一开始一段肯定是升序,一直到某个数后才开始改变 即1 2 3-- n-1 n a b c d ...

  5. 【洛谷P1338】末日的传说

    https://www.luogu.org/problemnew/show/P1338 [题目大意:从1到n的连续自然数,求其逆序对数为m的一个字母序最小的排列.] 最开始的思路是想从逆序对数入手,然 ...

  6. P1338 末日的传说

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

  7. P1338 末日的传说 逆序数对

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

  8. P1338 末日的传说[水题]

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

  9. 【洛谷】【前缀和+st表】P2629 好消息,坏消息

    [题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...

随机推荐

  1. 用python模拟TCP3次握手连接及发送数据

    源码如下: from scapy.all import * import logging logging.getLogger('scapy.runtime').setLevel(logging.ERR ...

  2. MonoTouch.Dialog简介

    新建一个Single View Application项目 添加程序集 MonoTouch.Dialog.dll引用 删除 MainStoryboard.storyboard 添加空类Task.cs ...

  3. Leetcode 002-Search Insert Position

    #Given a sorted array and a target value, return the index if the target is found. If not, return th ...

  4. js怎么select 选中的值

    var obj = document.getElementById(”SelectID”); var index = obj.selectedIndex; // 选中索引var text = obj. ...

  5. 九度OJ 1117:整数奇偶排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3174 解决:932 题目描述: 输入10个整数,彼此以空格分隔.重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到 ...

  6. select version();desc mysql.user;

    D:\wamp64\wamp\bin\mysql\mysql5.6.17\bin>mysql -hgoDev -uroot -ppasswordWarning: Using a password ...

  7. BitMapFactory.decodeFile 总是返回NULL的原因之一

    之前碰到过,顺便记录下来,如果出现这种情况,首先看看是否有对这个文件的读权限.

  8. 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转

    在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...

  9. Android Touch事件分发

    跟touch事件相关的3个方法: public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event public boolean onInt ...

  10. apk下载与安装

    public class MainActivity extends Activity { private File apkFile; @Override protected void onCreate ...