[hdu5225][BC#40]Tom and permutation
2024-10-15 07:54:51
好久没写题解了。。GDKOI被数位DP教做人了一发,现在终于来填数位DP的大坑了>_<。
发现自己以前写的关于数位DP的东西...因为没结合图形+语文水平拙计现在已经完全看不懂了嗯。
看来看去感觉还是这篇关于数位DP的介绍靠谱:http://wenku.baidu.com/view/d2414ffe04a1b0717fd5dda8.html
想题的时候结合图形食用效果更佳。
题意是说,对于一个给定的n的排列,要求出 (所有字典序<给定排列的排列)的逆序对个数和。
预处理出f[i]表示i的所有排列中,逆序对的个数。(事实上也是i个数的所有排列中逆序对的个数)
然后像那篇论文里面的姿势处理就好了。
每次把逆序对分为三种:已确定的数和后面的数之间的逆序对、已确定的数之间的逆序对,后面的数之间的逆序对。
前两种可以放到一起统计(和后面的数的具体顺序无关),第三种就是预处理出来的东西。
顺便在hdu上压了发代码最短= =(空间实在无力>_<
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const ll modd=;
ll f[],a[];//a数组存阶乘的值
ll i,j;
int n,x;
bool u[];
inline ll run(){
ll ans=,now=,mn;
memset(u,,n+);
for(i=;i<=n;i++){
scanf("%d",&x);u[x]=;
for(j=,mn=;j<x;j++)
if(!u[j])ans+=f[n-i]+a[n-i]*(now+mn),ans%=modd,mn++;
for(j=;j<x;j++)if(!u[j])now++;
}
return ans;
}
int main(){
a[]=;f[]=;
for(i=;i<=;i++){
a[i]=a[i-]*i%modd;
f[i]=(i*f[i-]+a[i-]*(i-)*i/)%modd;
}
while(scanf("%d",&n)==)printf("%lld\n",run());
return ;
}
最新文章
- 使input文本框随其中内容而变化长度的方法
- java Timer 定时每天凌晨1点执行任务
- [BZOJ4408][Fjoi 2016]神秘数
- Spring事务解析1-使用介绍
- .net平台下垃圾回收机制
- 使用MongoDB的开源项目
- 重拾C,一天一点点_4_随想
- pca图像识别
- 使用autoCompleteTextView以及MultiAutoCompleteTextView实现自动匹配输入内容
- 更新Appium中的WebDriverAgent
- Java基础-this和super的区别
- TypeScript入门教程
- Spark技术内幕: Shuffle详解(三)
- The 14th tip of DB Query Analyzer
- 在VirtualBox中安装BlackArch Linux
- Leetcode——Two Sum(easy)
- Python split()
- windows python3.7安装numpy问题的解决方法
- GPS定位基本原理浅析
- MySQL创建索引命令
热门文章
- jquery如此强大,为什么还要写原生呢?
- iOS tableview和 Collection复用机制
- C语言中一些不被熟知的特性
- CDH的安装
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
- Python中range()和len()
- ValueError: &#39;format&#39; in __slots__ conflicts with class variable
- 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用
- Django学习日记05_模板_模板语言
- jQuery 属性(十二)