【NOIP模拟】20140809 题解 & 总结

来源:互联网 发布:统计贸易数据自查报告 编辑:程序博客网 时间:2024/05/01 05:00

  两天前做了一套NOIP模拟题,是“Orz教主系列模拟五(加T1一道杂题),感觉收获颇多,总结一下很有必要~~~

 

  题目:传送门在下面~~~

 

  T1:最大配对

  原题:

 

  题目大意:给出AB两个含有N个正整数的序列(N<=100000),从两个序列中各选出K个数两两配对,求所有配对中两数之差的和的最大值。

  最直观的想法当然是贪心:对AB排序后每次选取其中一个数列的头和另一个数列的尾配对,求差并取和就可以了。注意每次既可以用A的头、B的尾配对,也可以用A的尾、B的头,两对数要取差较大的。

 


  T2:旅行

  原题:【传送门 https://www.vijos.org/p/1661】

  题目大意:给出一个含有N个数的序列(N<=2000),允许交换相邻两个数,但如果交换A[i]A[i+1],下次交换A[j]A[j+1]必须满足i<j。求N个数相邻两数之差的和的最小值。

  这是一道非常不错的DP题。实际上如果考虑一个数向前移动,它的最终位置难以确定;但如果考虑一个数A[i]向后移动到位置j,那么位置i+1..j上的数都会往前移动1个位置,看下图:


  因此设F[i,0..1]表示第i个数是否向后移动,i..n中相邻两数之差的和的最小值,其中第二维状态0表示不移动,1表示移动。根据定义很容易得出方程:


  其中i+1<=j<=nsum(x,y)表示x..y中相邻两数之差的和。当然,j=n时因为不用加上a[n+1]a[n+2]a[i]的差,所以需要特殊处理。时间复杂度O(N^2)


  T3:资源勘探

  原题:【传送门 https://www.vijos.org/p/1663】

  题目大意:给出一个N×M的数字矩阵NM<=1100),并定义B[i,j]表示以(1,1)为左上角,(i,j)为右下角的子矩阵中有多少个数字在子矩阵中只出现了1次,求所有B[i,j]的和。

  当然这道题最直接的想法是O(N^4)的遍历……实际上,每种数字能影响答案的范围应该是其当前的最小纵坐标到次小纵坐标,每次更改这两个数都会对影响答案的范围有影响。如图:


  因此,可以使用F[i,1..2]记录每种数字的最小纵坐标和次小纵坐标,G[i]表示上一次更改F[i]时的横坐标,从上到下、从左到右扫描一遍,通过维护这两个数组即可计算答案。时间复杂度O(N^2)

 


  T4:排列统计

  原题:【传送门 https://www.vijos.org/p/1660】

  题目大意:给出一个包含N个数的序列BN<=2000),求有多少个序列A,满足A中前i个数有B[i]个数恰好小于等于i。其中A1..N的全排列,数据保证有解。

  这道题比赛时没有任何想法,赛后去看了一个大牛的题解,下面会尝试复述这份题解……

  大牛题解:【传送门 http://hi.baidu.com/qyjubriskxp/item/318f961166a07c12e3f98600】

  对于这一类构造序列的题目,除了模拟,我们还可以考虑解析这个需要构造的序列的特点从而高效求解。

  首先对于一个构造好的序列A=[2,3,4,1,5],我们可以用一个矩阵表示这个序列——横坐标表示这个数,纵坐标表示这个数在A序列所处的位置(用1表示),如下图。

 

  这个矩阵其实同时也是表达了序列A对应的序列B。为什么?因为此时B[i]就是以(1,1)为左上角、(i,i)为右下角的子矩阵中1的个数(理由请仔细揣摩)。

 

  很容易发现,每个1单独占一行一列。那就意味着只要往一个空白的矩阵中填一定数量的1,满足“每个1单独占一行一列”且所表达的序列B与题目所给的序列B相等,那这个矩阵所表达的序列A就是一个合法的序列。

  如何填1呢?按照定义很容易推出,B[i]-B[i-1]是这个矩阵中的一个L形中1的个数,如图。而此时我们可以发现,一个待填数的L形,它左上方所包含的矩形中的1能影响这个L形能够填1的位置。因此从左上到右下确定每个L形填1的位置就是必然的选择。

 

  当B[i]-B[i-1]=0时,这个L形不需要填数;当B[i]-B[i-1]=1时,L形上2*i-1个空位需要选择一个填1。但因为内层已经填了B[i-1]1,空位必然会减少2*B[i-1]个(因为每个1都会占用一行一列),只剩下2*i-1-2*B[i-1]个空位,我们可知这一层就有2*i-1-2*B[i-1]种填1的方法。

 

  当B[i]-B[i-1]=2时,2*i-1个空位需要选择两个分别填1,且这两个1不可能处于同行或同列(也就是说只能在L形的两条臂上)。同理两条臂上都只剩下i-1-B[i-1]个空位,根据乘法原理我们可知这一层一共有(i-1-B[i-1])^2种填法。

  每一层的填法数都知道……当然根据乘法原理,乘起来就是总共可能的方案数,即合法的序列A的个数。由于答案不超过N!5735位,需要使用高精度。


  总结:这套题难度普遍不高,但都需要一定的数学功底。我最缺的就是数学能力……值得高兴的是比赛时没有犯严重的错误,要不就是不会做,成绩反映了我的真实水平。下次继续努力!

0 0