Noip模拟2 2018/10/18

T1:Matrix
小z 的女朋友送给小z 一个 n × n n×n 的矩阵。但是矩阵实在太大了,小z 的女朋友拿不动,只能带给他两个长度为n 的整数序列l,t,分别作为矩阵F的第一行和第一列(保证 l 1 = t 1 l1=t1 ),并且告诉小z 矩阵可以通过如下方式得到: F ( i , j ) = a F ( i , j 1 ) + b F ( i 1 , j ) F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)
现在小z 猜到了系数a,b,他想要计算 F ( n , n ) F(n,n) 1 0 9 + 7 10^9+7 的值。

忽然想不起从 ( 0 , 0 ) (0,0) ( n , m ) (n,m) 的路径数了,数组开小……
对于一个 l [ i ] l[i] ,通过大力推式子可以发现一定会乘上 a n 1 b n i a^{n-1}*b^{n-i}
对于 t [ i ] t[i] ,则一定会乘上 a n i b n 1 a^{n-i}*b^{n-1}
然后考虑对于每一个值,会对答案造成多少贡献
可以发现,每一个值的贡献次数就是这个位置到 ( n , n ) (n,n) 的路径数
以该位置为起点,那么就是从 ( 0 , 0 ) (0,0) ( n 1 , n i ) (n-1,n-i) ,但是第一步是固定的
那么就成了从 ( 0 , 0 ) (0,0) ( n 1 , n i 1 ) (n-1,n-i-1)
类似蚂蚁路径,方案数为 C ( 2 n i 2 , n 2 ) C(2*n-i-2,n-2) 即为对答案的贡献次数

T2:pq
小q 的女朋友送给小q n个整数。但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些。
小q 每次可以选择其中的两个x,y (不能同时选择同一个数) 变成x−P,y−Q,现在他希望能知道最多能帮女朋友减掉多少P,Q。

f [ i ] [ j ] [ k ] f[i][j][k] 表示处理到第 i i 个数,还有 j j P P k k Q Q 没处理,存的是已经处理的个数
可以发现,如果 P P 的个数为 0 0 ,那么 Q Q 的个数的最大值不会超过 2000 2000
如果 Q Q 的个数为 0 0 ,那么 P P 的个数的最大值不会超过 2000 2000
如果都不为零,那么 P , Q P,Q 的个数都不会超过 40 40
根据这个性质,我们可以暴力把 s [ i ] s[i] 拆成 x x P P y y Q Q
分类讨论 x x j j y y i i 的大小,然后统计答案
但是数组 50 2000 2000 50*2000*2000 会炸,因为每一次只会有 i 1 i-1 对答案造成贡献,可以把i滚动掉
时间效率 O ( n ( 2000 + 2000 + 4 0 2 ) 50 ) O(n*(2000+2000+40^2)*50)

T3:graph
小f 的女朋友送给小f 一个有n个点m条边的无向图。但是这个无向图太大了,小f 的女朋友拿不动,于是小f 希望只保留图的一部分。在这张图上,对于第i条边 u i , v i ui,vi ,从 u i ui v i vi 的代价为 a i ai ,从 v i vi u i ui 的代价为 b i bi
小f 希望只保留一个包含1号点的有向环(不能有重复的点),使得环上代价之和最小。

因为环中一定有节点 1 1 ,那么就从1开始大力DFS,数组开够有 65 65 %
那么我们可以把 1 1 拆成 2 2 个点,暴力枚举环上与 1 1 相连的两点,取最小值,效率为 O ( n 3 log n ) O(n^3 \log n) 25 25 %
然后考虑优化
我们可以把与 1 1 相连的点分成两部分,然后跑最短路,但是有可能最短的两个点在一个集合中,考虑优秀的分组方式
考虑按位分组,可以保证对于任意的 V i ! = U i Vi!=Ui 都一定会有一次分在不同的两组,需要分成 ( l o g n ) (log n) 组,然后统计最小值即可
时间效率 O ( n log n 2 ) O(n \log n^2)

猜你喜欢

转载自blog.csdn.net/chm_wt/article/details/83150007
今日推荐