Noip模拟2 2018/10/18

T1:Matrix
小z 的女朋友送给小z 一个 n × n n×n n×n的矩阵。但是矩阵实在太大了,小z 的女朋友拿不动,只能带给他两个长度为n 的整数序列l,t,分别作为矩阵F的第一行和第一列(保证 l 1 = t 1 l1=t1 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) F(i,j)=aF(i,j1)+bF(i1,j)
现在小z 猜到了系数a,b,他想要计算 F ( n , n ) F(n,n) F(n,n) 1 0 9 + 7 10^9+7 109+7的值。

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值