洛谷P1521 求逆序对 题解
题意:
求1到n的全排列中有m对逆序对的方案数。
思路:
  1.f[i][j]表示1到i的全排列中有j对逆序对的方案数。
	    2.显然,1到i的全排列最多有(i-1)*i/2对逆序对,而对于f[i][j]来说,新加入一个数i+1,产生的新的逆序对数与插入的位置有关(数目为插入的数的位置之后的数的数目),于是n^4暴力就新鲜出炉了。
	    3.换一个角度来说,当i>j的时候,我们枚举i的全排列的第一位的数字,如果是1,那么就要求剩下i-1个数中有j个全排列,如果是2,要求剩下i-1个数中有i-2个
	全排列,依次类推,得到了第一个方程:f[i][j]=sum{f[i-1][0],f[i-1][1],f[i-1][2].....f[i-1][j]}
	    当i<=j的时候,由于i的全排列中最大的数字是i,所以把i放到第一位上,由第一位最多能能产生i-1个逆序对,把1放到第一位上能产生0个逆序对,所以i-1-1+1=i-1,这时的f[i][j]就要由f[i-1][j]开始算上他自己,总共i-1项的和。因此:f[i][j]=sum{f[i-1][j],f[i-1][j-1],f[i-1][j-2].....f[i-1][j-i+1]}
反思:
我只会暴力,优化只能理性愉悦一下了,好菜啊……
代码:
n^4暴力:
#include<cstdio>
int n,m,i,j,k,f[][]; int main()
{
scanf("%d%d",&n,&m);
f[][]=;
for (i=;i<n;++i)
for (j=;j<=(i-)*i>>;++j)
for (k=;k<=i;++k)
if ((f[i+][j+i-k]+=f[i][j])>=) f[i+][j+i-k]-=;
printf("%d\n",f[n][m]);
return ;
}
n^3:
#include<cstdio>
int n,m,i,j,f[][]; int main()
{
scanf("%d%d",&n,&m);
f[][]=;
for (i=;i<=n;++i)
{
for (j=;j<i;++j) f[i][j]=(f[i][j-]+f[i-][j])%;//因为f[i,j]里面统计的是类似于前缀和的一个东西,f[i][j]只比f[i][j-1]多了f[i-1][j]这一项
for (;j<=(i-)*i>>;++j) f[i][j]=(f[i][j-]+f[i-][j]-f[i-][j-i])%;//这时求和的项数确定了,就是i-1项,于是f[i,j]比f[i][j-1]多了f[i-1][j]这一项,少了f[i-1][j-i]这一项
for (;j<=(i-)*i>>;++j) f[i][j]=f[i][((i-)*i>>)-j];//因为数对总数为i*(i-1)/2,而一个数对要么是逆序对要么是顺序对,因此f[i][j]是关于f[i][i*(i-1)/4]呈现中心对称的
}
printf("%d\n",(f[n][m]+)%);
return ;
}
洛谷P1521 求逆序对 题解的更多相关文章
- 洛谷 P1521 求逆序对
		题目描述 我们说(i,j)是a1,a2,…,aN的一个逆序对当且仅当i<j且ai>a j.例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4).现在已知N和K,求 ... 
- bzoj2431 || 洛谷P1521 求逆序对
		考虑一下插⼊法 n<=100n<=100n<=100 f[i][j]f[i][j]f[i][j]表⽰111~iii的全排列有j个逆序对的⽅案数 f[i][j]=Σf[i−1][j−k ... 
- 洛谷P1908 求逆序对 [归并排序]
		题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游 戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样 ... 
- 洛谷P1393 动态逆序对(CDQ分治)
		传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ... 
- 洛谷P2513 [HAOI2009]逆序对数列
		P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易 ... 
- 洛谷P3157 动态逆序对 [CQOI2011] cdq分治
		正解:cdq分治 解题报告: 传送门! 长得有点像双倍经验还麻油仔细看先放上来QwQ! 这题首先想到的就直接做逆序对,然后记录每个点的贡献,删去就减掉就好 但是仔细一想会发现布星啊,如果有一对逆序对的 ... 
- 【洛谷P2513】逆序对数列
		前缀和.滚动数组优化dp f[i][j]表示前i个数,逆序对数为j的方案数 我们知道,在第k个位置放第i个数,单步得到的逆序对数为i-k 则在前i个数,最多能产生的逆序对数为i个,最少0个,均可转移到 ... 
- POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对
		http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ... 
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
		[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ... 
随机推荐
- servlet基础概念
			一.servlet是什么? 运行在Web服务器上(如:tomcat),作为浏览器请求与数据库或其他应用程序之间的中间层 二.servlet主要任务: 1.读取浏览器发送的显式数据(如:html表单)隐 ... 
- input标签属性
			很多时候,我们都用到了很多标签实现输入功能,所以在这里梳理一下. 1.建立一个文本框 <input type="text" name="userName" ... 
- 在linux中使用多个redis端口来构建redis集群
			大家好,这是我制作的redis集群搭建视频教程. 服务器:ubnutu server(版本18.10) redis:redis-4.0.12 我这里就简单说明下大概步骤了,详细请观看教学视频. 首先更 ... 
- Java开发笔记(九十五)NIO配套的文件工具Files
			NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths.路径工具Path.文件组工具Files.先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的 ... 
- AJPFX的内存管理小结
			管理范围:任何继承于 NSObject的对象原理:每一个对象都有引用计数器当使用alloc new 和 copy创建对象时引用计数器被设置为1给对象发送一条retain消息 ,引用计数器加1 ... 
- leetcode315 Count of Smaller Numbers After Self
			思路: bit + 离散化. 实现: #include <bits/stdc++.h> using namespace std; class Solution { public: int ... 
- CSS层叠的问题、标准文档流、伪类选择器
			一.层叠的问题 CSS有两个性质: 1.继承性 2.层叠性:选择器的一种选择能力,谁的权重大就选谁 层叠性又分为: 1).选不中:走继承性 (font.color.text.) 继承性的权重是0 若 ... 
- Makefile介绍
			make 工具如 GNU make.System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同.不同的make工具的mak ... 
- redis集群架构(含面试题解析)
			老规矩,我还是以循序渐进的方式来讲,我一共经历过三套集群架构的演进! Replication+Sentinel 这套架构使用的是社区版本推出的原生高可用解决方案,其架构图如下! 这里Sentinel的 ... 
- windows session logoff时进行处理动作
			目标:Windows session logoff时得到通知,进行一些记录/清理工作 测试平台: win7 x64 logoff时系统会发送WM_ENDSESSION消息,如果某个应用对这个消息的处理 ... 
