GDOI 3.21 模拟总结

今天跟雅礼联考,结果被虐爆了。。。。


先讲一下题目大意:

第一题:有递推式

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 !!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值