今天跟雅礼联考,结果被虐爆了。。。。
先讲一下题目大意:
第一题:有递推式
X[n] = a * (X[n - 1])^2 + b * X[n - 1] + c;
现在给定a,b,c,n,m,X[0],求X[n] % m;
数据有两部分:
1.min(n,m) <= 10^6
2.n,m<=10^9,2a|b,4ac = b^2 - 2b,m为质数
第二题:在 n 行 m 列的网格中,你要圈一些地。你从左上角出发,最后返回左上角,路径内部的区域视为被 你圈住。你不可以进入网格内部,只能在边上行走。你的路径不能在左上角以外自交,但是边足够 宽,你可以重复经过而不自交。网格中有一些格子对你很重要,你要尽量圈住它;而另一些格子对 你有坏处,你不能圈住它。求圈住 i 个重要的格子的最小路径长度。
n,m<=50,且重要的格子和有坏处的格子的总数不超过10
第三题
Konrad,Delfador 和 Kalenz 一行人又喜闻乐见地被追杀了。他们面临的是一条有 N 个地点的路,他们从 0 号地点出发,要逃到 N 号地点去。每个地点的战斗都有一定的金币收入 Ai,也有一定的部队损失 Bi。为了更好地逃生,Delfador 还弄到了一块传送宝石,这样一行人就能向后传送不超过 L 的距离。从一个地点传送到另一个地点时,Konrad 会选择路径上除起点外的地形指数 Ci 最大的地点进行战斗,地形指数相同时选择最靠后的。作为优秀的领导者,Konrad 希望总金币收入与总部队损失的比值最大。
N<=30000
做题过程:
一开始看第一题觉得应该是一个水题,对于n<=10^6直接暴力,m<=10^6很显然会有循环节,然后剩下来的部分我一直盯着那两个特殊条件,推了很久的通项一直没有推出来,没有注意到各种各样的形式。
然后去看第二题,一看有闭合的图形,觉得又要用插头DP去做,不会,直接放弃了第二题,做这种题目做的太少,毫无思路。
还有两个多钟,去看第三题,一看就觉得要二分,但很久没有做过分数规划的问题,一开始居然没有想到把式子移项,看了将近半个钟头才发现可以移项,然后就直接Dp+线段树。但我的线段树写的太龊,没有注意常数,而且二分的次数过多,精度设的太大,最后还是T掉了。。。
最后只有第一题的75分和第三题的50分。。。。。。。前面全是雅礼的,而且他们居然第二题全切了。。。。感觉他们实在是太厉害了。。。结果后来知道正解后哭晕在厕所了。。。。。。
题解:
第一题:我们只看2a|b,4ac=b^2-2b这一部分的数据。。。。。
设b=2ak
则:4ac=b^2-2b,c = ak^2-k.
x[n] = a*x[n-1]^2 + b*x[n-1] + c -----> x[n] = a*x[n-1]^2 + 2ak * x[n-1] + ak^2 - k
x[n] = a * (x[n-1] + k)^2 - k
x[n] + k = a * (x[n-1] + k) ^ 2
设p[i] = x[n] + k,则 p[i] = a * p[i - 1] ^ 2
则 p[n] = a^(2^n - 1) * p[0] ^ (2 ^ n);
现在的问题变为如何求a^(2^n - 1) 和 p[0] ^ (2^n)
注意到m为质数,则根据费马小定理,a^(p-1) % p = 1
然后就没有然后了。。。。。
第二题:
注意到自交的话其实是没有什么所谓的,只需要直接走就好了。。。
并且假如在一条较优的路径中,一个点被包含,那么我们做这个点往上延伸的一条射线必然经过 奇数次我们走过的边。
那么我们就可以设一个二进制状态S,S的每一个位表示我们一个点他上面是有奇数条边还是有 偶数条边。
然后我们直接做一次BFS就好了。。。。
第三题:
设我们二分出来的答案为p。真实答案为ans
则若ans >= p,sigma(A[i]) / sigma(B[i]) >= p,sigma(A[i]) >= p * sigma(B[i]),
sigma(A[i] - p * B[i]) >= 0
设D[i] = A[i] - p * B[i],F[i] 表示走到i这个点sigma(D[j])最大为F[i]
我们开始Dp
我们维护一个关于C[j] 单调递减的队列Q
则Q[k - 1] ~ Q[k] - 1的点与i的需要战斗的地方就是Q[k]
我们维护一个线段树T,其中一个单独的节点j维护的是j递推到i的值是多少。
即F[j] + D[j->i战斗的地方]
我们看一下我们对Q进行操作时对T的影响是什么
假如我们要Pop掉队列尾,设为Q[en]
则Q[en - 1] ~ Q[en] - 1都不受Q[en]限制,则我们给Q[en-1]~Q[en] - 1区间减去D[Q[en]]
假如我们要在队列尾Insert(p)
则Q[en] ~ p - 1都受p限制,我们给Q[en] ~ p - 1区间加上D[p]
最后F[i]就直接在T[1] ~ T[i - 1]取个Max
这题需要一些常数上的优化。。。。。。
考试暴露的问题:
简单题的一些性质没有足够的细心推到出来。
题目的一些特殊条件没有利用好,一些题目不熟练或者说是形成了惯性思维
程序的常数优化没有做好。
GDOI bless !!!!!!!