您的位置:首页 > 其它

GDOI 3.21 模拟总结

2015-03-21 19:58 330 查看
今天跟雅礼联考,结果被虐爆了。。。。

先讲一下题目大意:

第一题:有递推式

X
= a * (X[n - 1])^2 + b * X[n - 1] + c;

现在给定a,b,c,n,m,X[0],求X
% 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
= a*x[n-1]^2 + b*x[n-1] + c  -----> x
= a*x[n-1]^2 + 2ak * x[n-1] + ak^2 - k

x
= a * (x[n-1] + k)^2 - k

x
+ k = a * (x[n-1] + k) ^ 2

设p[i] = x
+ k,则 p[i] = a * p[i - 1] ^ 2

则 p
= 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 !!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: