题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5225

bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=580&pid=1002

题解:

数组a保存输入

考虑当前位i,对于1<=j<i,使得x[j]=a[j],对于第i位,枚举1<=x[i]<a[i],并且x[i]!=x[j](1<=j<i),这样,对于i<j<=n的部分,任意排列都是满足条件的

这样,我们每次计算逆序对可以分为三个部分:

1~i-1的贡献:

  计算出所有的a[j](即x[j])>a[k]的个数(1<=j<=i-1,j<k<=n)cnt1(可预处理出来)

第i位的贡献:

  计算出所有的x[i]>a[k] (i<k<=n) cnt2

由上面两部分得:1~i的贡献:cnt12 =(cnt1+cnt2)*(n-i)!

最后考虑i+1~n的逆序对:

  在后n-i个位置中,有一半的排列方式中,第j小的数在第k小的数(j>k)的前面。共有(n-i)!种排列方式,所以对于一对数,有(n-i)!/2种排列方式中是逆序对。共有(n-i)*(n-i-1)/2对数,所有这类逆序对共(n-i)*(n-i-1)*(n-i)!/4对。

  即cnt3=(n-i)*(n-i-1)*(n-i)!/4

综上:第i位的答案是cnt12+cnt3;

注意:

  cnt3=(n-i)*(n-i-1)*(n-i)!/4,这里的4要在取模之前处理掉!!!取模之前处理掉!!!取模之前处理掉!!!

  总共4天提交了11次,CE了2次,wa了6次,ac了3次,最后一次ac告诉我,三天前错的地方就只有一个!除4没有提前处理!!!

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = + ;
const int mod = 1e9 + ;
typedef long long LL; int arr[maxn], used[maxn]; int n; LL cnt[maxn];
void pre_for_solve() {
memset(cnt, , sizeof(cnt));
for (int i = ; i <= n; i++) {
cnt[i] = cnt[i - ];
for (int j = i + ; j <= n; j++) {
if (arr[i]>arr[j]) cnt[i]++;
}
}
} LL fac[maxn], fac2[maxn];
void get_fac() {
memset(fac, , sizeof(fac));
memset(fac2, , sizeof(fac2));
//求1*3*4*...*n
fac[] = , fac[] = , fac[] = ;
for (int i = ; i < maxn; i++) {
fac[i] = fac[i - ] * i%mod;
}
//求1*2*3...*n
fac2[] = ;
for (int i = ; i<maxn; i++) {
fac2[i] = fac2[i - ] * i%mod;
}
} void init() {
memset(used, , sizeof(used));
} int main() {
get_fac();
while (scanf("%d", &n) == && n) {
init();
for (int i = ; i <= n; i++) scanf("%d", arr + i);
pre_for_solve();
LL ans = ;
for (int i = ; i <= n; i++) {
for (int x = ; x<arr[i]; x++) {
if (!used[x]) {
//cnt1
LL sum = cnt[i - ];
//cnt2
for (int xx = ; xx <= n; xx++) {
if (!used[xx] && x>xx) sum++;
}
//cnt12
sum = sum*fac2[n - i] % mod;
//cnt3
LL tmp = fac[n - i] * (n - i)*(n - i - ) / % mod;
//cnt12+cnt3
sum = (sum + tmp) % mod;
ans += sum;
ans %= mod;
}
}
used[arr[i]] = ;
}
printf("%lld\n", ans);
}
return ;
}

HDU 5225 枚举的更多相关文章

  1. hdu 5225 Tom and permutation(回溯)

    题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algo ...

  2. hdu 4770(枚举 + dfs爆搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 思路:由于最多只有15个".",可以直接枚举放置的位置,然后判断是否能够全部 ...

  3. hdu 3006 枚举集合能够产生的全部并集的集合

    http://acm.hdu.edu.cn/showproblem.php? pid=3006 刚买的CHERRY键盘 手感真好 可惜不习惯 写代码老是打错.一个题写了一上午,都是各种按错键DEBUG ...

  4. hdu 5129 (枚举) The E-pang Palace

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5128. 给你n个点,问能否组成两个不相交的与坐标轴平行的矩形,能就输出两矩形的面积和,不能就输出一个字符串 ...

  5. hdu 4282 枚举,非二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4282 对于方程X^Z + Y^Z + XYZ = K,已知K求此方程解的个数,其中要求X<Y,Z>1 ...

  6. hdu 4681(枚举+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 思路:首先预处理出串C在A,B中的所有的位置,然后从前向后求一次最长公共子序列,从后向前求一次最 ...

  7. hdu 4421(枚举+2-sat)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4421 思路:枚举32位bit,然后2-sat判断可行性,这里给出2-sat矛盾关系构图: 1.a&am ...

  8. HDU 5965 枚举模拟 + dp(?)

    ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...

  9. hdu 5228 枚举

    题意:在前往ZJOI2015一试的路上,ZCC在同Fsygd打德州扑克时输光了所有的筹码.不过ZCC最近学会了一些黑技术.现在,他能够在游戏过程中更换任何他想要更换的牌.ZCC想要通过更换尽量少的牌得 ...

随机推荐

  1. 如何使用gitbash 把你的代码托管到github

    1.如果你没有创建仓库 mkdir vuex-playList cd vuex-playList git init touch README.md git add README.md git comm ...

  2. js如何获取键盘高度

    在移动端或混合app开发中,js如何获取键盘高度,直接贴上代码吧 input是一个html input 标签 var timer = { id:null, run:function (callback ...

  3. Hive配置项的含义详解

    关于MetaStore:metastore是个独立的关系数据库,用来持久化schema和系统元数据. hive.metastore.local:控制hive是否连接一个远程metastore服务器还是 ...

  4. restful api编写规范

    Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...

  5. skyline画折现bug代码

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>加 ...

  6. Linux入门第二天——基本命令入门(中)

    一.文件搜索命令 1.文件搜索命令:locate 速度很快(具体见Linux工具网址的对比),注意无法找到新建的文件(原理暂不展开) locate命令其实是“find -name”的另一种写法,但是要 ...

  7. 20155306 2016-2017-2 《Java程序设计》第十周学习总结

    20155306 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java和Android开发学习(网络) 网络概览 计算机网络体系结构的通信协议划分为七层, ...

  8. 20155313 实验一《Java开发环境的熟悉》实验报告

    一.实验内容 1.使用JDK编译.运行简单的Java程序 2.使用IDEA 编辑.编译.运行.调试Java程序. 二.练习 题目:实现学生信息管理. 具体代码: import java.util.*; ...

  9. 20155322 2016-2017-2《Java程序设计》课程总结

    学号 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业一:浅谈对师生关系的看法以及对未来学习生活的展望 预备作业二:学习娄老师<做中学> ...

  10. 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试

    20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...