题目链接:

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. 【visual studio code 的python开发环境搭建 】

    打开vs code,按按F1或者Ctrl+Shift+P打开命令行,然后输入ext install 输入Python,选第一个,这个用的最多,支持自动补全代码等功能,点击安装按钮,即可安装 下面试着编 ...

  2. celery知多少

    Celery 1.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成 ...

  3. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)

    主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...

  4. CentOS 7.2重启网络报错 Failed to start LSB: Bring up/down

    CentOS 7.2重启网络报错 Failed to start LSB: Bring up/down 我的虚拟机原本有两块网卡,一块叫eno16777736,另一块叫eno5033674.本来是正常 ...

  5. dotnet Core 2.0学习笔记(一)

    一:Dotnet Core Windows运行环境,标红部分要注意 https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites ...

  6. Hadoop学习总结之Map-Reduce的过程解析

    一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. 提交任务主要是通过JobClient.runJob(JobConf)静态函数实现的: public static Runnin ...

  7. 【转载】混编ObjectiveC++

    原文:混编ObjectiveC++ 最近有点炒冷饭的嫌疑,不过确实以前没有Git Or Blog的习惯,所以很多工作上的技术分享就存留在了电脑的文档里,现在还是想重新整理一下,再分享出来. 混编C++ ...

  8. 【LG3230】[HNOI2013]比赛

    题面 洛谷 题解 代码 \(50pts\) #include<iostream> #include<cstdio> #include<cstdlib> #inclu ...

  9. Ubuntu 安装python后,安装python-dev

    1.通常情况下: sudo apt install python-dev 或者 在 sudo apt install python 命令下安装应该也附带了 python-dev 上述 pyhthon ...

  10. Oracle和MySQL在使用上的区别

    1.  Oracle是大型数据库而MySQL是中小型数据库,MySQL是开源的而Oracle的价格非常高. 2.  Oracle支持大并发,大访问量. 3.  安装所用的空间差别也是很大,MySQL安 ...