好久没写题解了。。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 ;
}

最新文章

  1. 使input文本框随其中内容而变化长度的方法
  2. java Timer 定时每天凌晨1点执行任务
  3. [BZOJ4408][Fjoi 2016]神秘数
  4. Spring事务解析1-使用介绍
  5. .net平台下垃圾回收机制
  6. 使用MongoDB的开源项目
  7. 重拾C,一天一点点_4_随想
  8. pca图像识别
  9. 使用autoCompleteTextView以及MultiAutoCompleteTextView实现自动匹配输入内容
  10. 更新Appium中的WebDriverAgent
  11. Java基础-this和super的区别
  12. TypeScript入门教程
  13. Spark技术内幕: Shuffle详解(三)
  14. The 14th tip of DB Query Analyzer
  15. 在VirtualBox中安装BlackArch Linux
  16. Leetcode——Two Sum(easy)
  17. Python split()
  18. windows python3.7安装numpy问题的解决方法
  19. GPS定位基本原理浅析
  20. MySQL创建索引命令

热门文章

  1. jquery如此强大,为什么还要写原生呢?
  2. iOS tableview和 Collection复用机制
  3. C语言中一些不被熟知的特性
  4. CDH的安装
  5. Oracle数据库中插入日期型数据(to_date的用法)(转载)
  6. Python中range()和len()
  7. ValueError: &#39;format&#39; in __slots__ conflicts with class variable
  8. 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用
  9. Django学习日记05_模板_模板语言
  10. jQuery 属性(十二)