洛谷 P3672 小清新签到题 [DP 排列]

传送门

题意:给定自然数n、k、x,你要求出第k小的长度为n的逆序对对数为x的1~n的排列

$n \le 300, k \le 10^13$


 

一下子想到hzc讲过的DP

从小到大插入,后插入不会对前插入造成影响,$f[i][j]$表示$1..n$排列$j$个逆序对的方案数,枚举插在哪里

然后从前向后选择满足要求的字典序最小的构造就行了

一开始没注意$DP$方程是$O(n^4)$的T了一次,以后一定要跑一下极限数据

加上前缀和优化

然后会爆long long,但我们只关心与k相比大小,所以$>k$变成$k+1$就行了

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long ll;
const int N=301, M=N*(N-1)/2;
inline ll read(){
    char c=getchar();ll x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}

int n, x, m, a[N], vis[N];
ll f[N][M], k, s[2][M];
void dp(){
    f[0][0]=1;
    int p=0;
    for(int i=0; i<=m; i++) s[p][i]=1;
    for(int i=1; i<=n; i++, p^=1)
        for(int j=0; j<=m; j++) { 
            int l=max(0, j-(i-1)), r=j;
            ll _= l==0 ? s[p][r] : s[p][r]-s[p][l-1];
            f[i][j]= _>k ? k+1 : _;

            s[p^1][j]=f[i][j];
            if(j!=0) s[p^1][j]+= s[p^1][j-1];
        }
}
int main(){
    //freopen("in","r",stdin);
    n=read(); k=read(); x=read();
    m=x;
    dp();
    //printf("\n%lf\n", (double)clock()/CLOCKS_PER_SEC);
    for(int i=n; i>=1; i--) { 
        ll cnt=0;
        for(int j=1; j<=n; j++) if(!vis[j]) { 
            int c=j-1;
            for(int t=1; t<j; t++) c-= vis[t];
            if(f[i-1][x-c] + cnt>= k) {a[n-i+1]=j; vis[j]=1; x-= c; k-= cnt; break;}
            cnt+= f[i-1][x-c];
        }
    }
    for(int i=1; i<=n; i++) printf("%d ",a[i]);
    //printf("\n%lf", (double)clock()/CLOCKS_PER_SEC);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值