2018/3/7

T1 三元组

  这个题其实并不是题别的难想,只是要事先找对方向。

  我的暴力和正解一点也不沾边,就是直接开了一个桶,来记录每一个c^3 mod k 的数量,然后O(n)扫一遍就行了。

  但是题解的暴力就和正解很贴切,首先就是不考虑mod k 这个条件,那么如果枚举 b 的话,那么a 的范围就是 [1,b] ,那么组合起来,他能贡献的 c^3 mod k 的范围是[b*b+1, b*b+b], 那么就可以暴力枚举 c 然后在暴力枚举比 c 小的 b, 然后看 c 是不是在 b 的范围内,然后计数,如果考虑 mod k 的话就是他反复覆盖了 [0,k-1] 这个区间,这个也是能够O(1)算出来的,到了这正解也就是很容易想到了,就是用树状数组来优化区间标记的过程,然后有一个有效的减枝就是在当前要覆盖 [0,k-1] 整个区间的的时候,可以直接开一个变量存一下,不用再到树状数组里操作了

T2 攻略

  这个题有一个很显然的贪心,就是每次选择当前局面中,到跟距离最大的叶子,选K次就是最终的答案,那么每选出来一个叶子都归对其他的叶子产生影响,那么只要优化这个更新影响的过程就好了,我的暴力就是每次暴力的跳父亲,然后将儿子拍成一个序列,然后进行查分,复杂的是O(nk)的,但是可以发现,一个点如果不已经被选过了,那么他到跟的路径上的点都已经被选过了,那么我们以后每次跳父亲的时候,一旦已经选过了,就可以停止这个更新的过程,然后对儿子序列的操作可以用线段树来维护,然后最终的复杂度就是O(nlongn)的

  还有一种更神的做法,就是开始直接处理出每一个点到叶子的最大权值和是多少,然后我们每次都是选择当前最大的路径,那么如果一个儿子,不是对他的父亲做出最大权值的儿子,那么这个儿子在之后所有的决策中,这个儿子所存在的路径,都不可能包含它的祖先,那么我们一开始直接把这种儿子所能到达的最大权值扔到一个堆里,然后最后从堆里取出前K个就好了

T3 环线

  这个题和前几天做过的题有些像,就是构造矩阵来计数,那么有一种构造方法就是构造一个(2n)*(2n)的矩阵,左上角是邻接矩阵,右上角是空的,剩下两个都是单位矩阵,然后快速幂K次之后,左下角的矩阵的对角线之和就是答案(要开战斗机)

  还有一种做法就是类似于FFT的分治思想的做法,就是最终的答案是B*(A + A^2 + A^3 +..... +A^K)得到的矩阵的对角线之和,然后因为矩阵成遵循除了交换律之外的各种基本的律,那么就可以把后面这个括号里的东西分治一下

if(K&1)  (...)=(A + A^2 + A^3 +..... +A^(K/2)) + A^(K/2)*(A + A^2 + A^3 +..... +A^(K/2))  + A^K

else  (...)=(A + A^2 + A^3 +..... +A^(K/2)) + A^(K/2)*(A + A^2 + A^3 +..... +A^(K/2)) 

然后递归求就好了

 

这次考试总的来说T1的思路完全飞了,T2,T3的比较的接近正解,但是对题目分析的不够,包括对矩阵乘的生疏都然我触碰不到正解,还是平时要多想,对一些基础的东西要进一步的深入理解一下

另外就是板子要熟

 

posted @ 2018-03-07 16:37  Nawox  阅读(124)  评论(0编辑  收藏  举报