HDU 5225 枚举
题目链接:
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 枚举的更多相关文章
- hdu 5225 Tom and permutation(回溯)
题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algo ...
- hdu 4770(枚举 + dfs爆搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 思路:由于最多只有15个".",可以直接枚举放置的位置,然后判断是否能够全部 ...
- hdu 3006 枚举集合能够产生的全部并集的集合
http://acm.hdu.edu.cn/showproblem.php? pid=3006 刚买的CHERRY键盘 手感真好 可惜不习惯 写代码老是打错.一个题写了一上午,都是各种按错键DEBUG ...
- hdu 5129 (枚举) The E-pang Palace
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5128. 给你n个点,问能否组成两个不相交的与坐标轴平行的矩形,能就输出两矩形的面积和,不能就输出一个字符串 ...
- hdu 4282 枚举,非二分
http://acm.hdu.edu.cn/showproblem.php?pid=4282 对于方程X^Z + Y^Z + XYZ = K,已知K求此方程解的个数,其中要求X<Y,Z>1 ...
- hdu 4681(枚举+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 思路:首先预处理出串C在A,B中的所有的位置,然后从前向后求一次最长公共子序列,从后向前求一次最 ...
- hdu 4421(枚举+2-sat)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4421 思路:枚举32位bit,然后2-sat判断可行性,这里给出2-sat矛盾关系构图: 1.a&am ...
- HDU 5965 枚举模拟 + dp(?)
ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...
- hdu 5228 枚举
题意:在前往ZJOI2015一试的路上,ZCC在同Fsygd打德州扑克时输光了所有的筹码.不过ZCC最近学会了一些黑技术.现在,他能够在游戏过程中更换任何他想要更换的牌.ZCC想要通过更换尽量少的牌得 ...
随机推荐
- 课时6.HTTP协议(理解)
HTTP是Hypertext Transfer Protocol的缩写,译为:超文本传输协议 什么是协议? 在现实生活中有很多的协议,例如租房协议/买卖协议/离婚协议 无论是什么协议它们都有一个共同点 ...
- MySQL慢日志查询实践
慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句.例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志 ...
- Redis全方位详解--磁盘持久化和容灾备份
序言 在上一篇博客中,博客介绍了redis的数据类型使用场景和redis分布式锁的正确姿势.我们知道一旦Redis重启,存在redis里面的数据就会全部丢失.所以这篇博客中向大家介绍Redis的磁盘持 ...
- PHP字符转码
最近手里面有一个新的项目,下载的程序用的是 gbk, 可是我需要UTF8的格式,因为只有这个的格式才可以加入百度的MIP项目. 来此学习了解php编码的一些内容,还请多多指教.
- PS中10种样式操作
(1)投影:将为图层上的对象.文本或形状后面添加阴影效果.投影参数由“混合模式”.“不透明度”.“角度”.“距离”.“扩展”和“大小”等各种选项组成,通过对这些选项的设置可以得到需要的效果. (2)内 ...
- C++:bitset用法
std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位 ...
- java的三个体系
Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由JamesGosling和同事们共同研发,并在1995年正式推出. Java分为 ...
- 20155317王新玮 2016-2017-2《Java程序设计》第2周学习总结
20155317 2016-2017-2<Java程序设计>第2周学习总结 课本知识: 认识类型与环境 整数:包括short,int,long .它们分别占用2个字节,4个字节和8个字节. ...
- 20155327 2016-2017-2 《Java程序设计》第10周学习总结
20155327 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. ...
- EF中一对多的自反关系设置
对于一般的目录树,通常就是一对多的自反关系,一般会有一个PID,引用于这个ID,实体类代码类似于下: public partial class Catalog { public Cat ...