[hdu5225][BC#40]Tom and permutation

  好久没写题解了。。GDKOI被数位DP教做人了一发,现在终于来填数位DP的大坑了>_<。

  发现自己以前写的关于数位DP的东西...因为没结合图形+语文水平拙计现在已经完全看不懂了嗯。

  看来看去感觉还是这篇关于数位DP的介绍靠谱:http://wenku.baidu.com/view/d2414ffe04a1b0717fd5dda8.html

  想题的时候结合图形食用效果更佳。

  题意是说,对于一个给定的n的排列,要求出 (所有字典序<给定排列的排列)的逆序对个数和。

  预处理出f[i]表示i的所有排列中,逆序对的个数。(事实上也是i个数的所有排列中逆序对的个数)

  然后像那篇论文里面的姿势处理就好了。

  每次把逆序对分为三种:已确定的数和后面的数之间的逆序对、已确定的数之间的逆序对,后面的数之间的逆序对。

  前两种可以放到一起统计(和后面的数的具体顺序无关),第三种就是预处理出来的东西。

  顺便在hdu上压了发代码最短= =(空间实在无力>_<

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ll long long
 4 using namespace std;
 5 const ll modd=1000000007;
 6 ll f[101],a[101];//a数组存阶乘的值
 7 ll i,j;
 8 int n,x;
 9 bool u[101];
10 inline ll run(){
11     ll ans=0,now=0,mn;
12     memset(u,0,n+1);
13     for(i=1;i<=n;i++){
14         scanf("%d",&x);u[x]=1;
15         for(j=1,mn=0;j<x;j++)
16             if(!u[j])ans+=f[n-i]+a[n-i]*(now+mn),ans%=modd,mn++;
17         for(j=1;j<x;j++)if(!u[j])now++;
18     }
19     return ans;
20 }
21 int main(){
22     a[1]=1;f[1]=0;
23     for(i=2;i<=100;i++){
24         a[i]=a[i-1]*i%modd;
25         f[i]=(i*f[i-1]+a[i-1]*(i-1)*i/2)%modd;
26     }
27     while(scanf("%d",&n)==1)printf("%lld\n",run());
28     return 0;
29 }

时间: 2024-08-19 02:41:16

[hdu5225][BC#40]Tom and permutation的相关文章

hdu5225 Tom and permutation(BestCoder Round #40)

Tom and permutation Accepts: 120 Submissions: 422 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 Tom学会了通过写程序求出一个1-n的排列的逆序对数,但他的老师给了他一个难题: 给出一个1-n的排列,求所有字典序比它小的1-n的排列的逆序对数之和. Tom一时不知道该怎么做,所以他来找你帮他解决这个问题. 因为数可能很大,

hdu 5225 Tom and permutation(回溯)

题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 100; const int mod = 1e9+7; int N, ans, V[maxn + 5], A[maxn + 5]; ll S[maxn + 5], L[m

HDU5225 Tom and permutation(排列组合)

题意: Tom学会了通过写程序求出一个1-n的排列的逆序对数,但他的老师给了他一个难题: 给出一个1-n的排列,求所有字典序比它小的1-n的排列的逆序对数之和. Tom一时不知道该怎么做,所以他来找你帮他解决这个问题. 因为数可能很大,答案对109+7取模. 从前往后推,先计算1-k的所有排列可以产生逆序总数, 先假设db[2]为1-2的结果,那么我们来看3的排列,他是由1[2,3],2[1,3],3[1,2]三项组成,[]为所有排列的意思,第一项中[2,3]组合对结果贡献db[2],前面的1小

HDU - 5225 Tom and permutation

题目大意:Tom学会了通过写程序求出一个1-n的排列的逆序对数,但他的老师给了他一个难题: 给出一个1-n的排列,求所有字典序比它小的1-n的排列的逆序对数之和. Tom一时不知道该怎么做,所以他来找你帮他解决这个问题. 因为数可能很大,答案对109+7取模. 解题思路:从1到n枚举k,表示当前要计算的排列与读入的排列前k-1项相同,而第k项不同.对于每一个k,再枚举一个t,表示当前要计算的排列的第k项是t,所以t要比读入的排列的第k项小,并且不与前k-1个数中的任意一个数相等. 那么,剩下的n

递归练习1

感觉自己这方面很弱,都是看着题解做的orz.. fzu2038 Another Postman Problem(递归求解) 题意:n个点n-1条边组成无向连通图,求每个点到其他所有点的路径总和的和. 题解:每条边的访问次数为边两端点数乘积的两倍.递归遍历每个点的每条边即可. 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 using namespace std; 5 const int N=1e5+

范磊 C++ 第6章 面向对象

1 // section_6.cpp : Defines the entry point for the console application. 2 //范磊C++ 第6章 面向对象 3 4 #include "stdafx.h" 5 #include "iostream" 6 7 8 9 //6.3.7 对象只能调用类中存在的方法(函数) 10 using std :: cout; 11 class Human 12 { 13 public: 14 void w

gdutcode 1195: 相信我这是水题 GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,

1195: 相信我这是水题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 821  Solved: 219 Description GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,萌萌的师弟师妹们们经常会让pigofzhou帮他们Debug,因为师弟师妹们打代码使用编程语言的种类千奇百怪,pigofzhou为此很头疼.现在假设师弟师妹们只喜欢Java或者C++或者C,因为他希望所有人都学相同的编程语言,只有这样pigofzhou教

第10、11周-警察与厨师

问题及代码: /*copyright 计算机与控制工程学院 完成日期:2016年5月8日 作者:马艳艳 问题描述:各个成员函数,只要输出相关的信息即可,暂不深究其业务功能 ?请为各个类增加构造函数 ?在实现中,可以增加需要的其他函数 ?自行编制main函数,完成初步的测试 输入描述:无 输出描述:成员信息 */ #include <iostream> using namespace std; class Person { public: Person(int ,string ,string);

Leetcode题解(20)

59. Spiral Matrix II 题目 这道题copy网上的代码 1 class Solution { 2 private: 3 int step[4][2]; 4 bool canUse[100][100]; 5 public: 6 void dfs(int dep, vector<vector<int> > &matrix, int direct, int x, int y) 7 { 8 for(int i = 0; i < 4; i++) 9 { 10