NOI2014 Day2

时间:2023-03-08 18:35:28
NOI2014 Day2

NOI2014 Day2

动物园

题目描述:给出一个字符串(长度为\(Len\)),设\(num[i]\)为字符串的前\(i\)个字符构成的子串(\(A\))中,满足\(A\)的前\(L\)个字符既是\(A\)的后缀,且该后缀与前\(L\)个字符不重叠,\(L\)的最大值,求\(\prod_{i=1}^{Len}(num[i]+1)\)

solution:
扩展KMP,减去重复部分就是了……

时间复杂度:\(O(n)\)

随机数生成器

题目描述:给出数列\(x_0, x_i=(ax_{i-1}^2+bx_{i-1}+c)mod d\),设\(T\)为\(1\)到\(K\)的递增序列,对\(T\)进行\(K\)次交换,第\(i\)次交换\(T_i\)和\(T_{(x_i mod i)+1}\).在进行\(Q\)次交换,交换输入的两个下标的数。令\(K=N*M\),将\(T\)按顺序填入棋盘,从第一行第一列的格子出发,每次向右走或向下走,走到第\(N\)行第\(M\)列,将路径上的数从小到大排序,称为路径序列,输出字典序最小的路径序列。

solution
这道题主要是空间卡得太死了,只能开两个\(N*M\)的数组,首先按要求把\(T\)算出来,然后新开一个数组记住每个数的位置,然后贪心,从小到大选数,能选就选,最后输出。

时间复杂度:\(O(N * M * 常数)\)

购票

题目描述:有一棵\(n\)个点的树,有边权。从一个点出发(\(i\)),如果要走到\(1\)号点,则选择该点的一个祖先(该祖先到\(i\)的距离不大于\(L_i\)),到这个祖先的费用为两点间的距离*\(p_i\)+\(q_i\),问每个点到\(1\)号点的最小费用。

solution
这题如果没有距离限制还是比较简单的。如果没有距离限制,那么每个点都可以选择任意一个祖先,用单调队列维护一下就好了。但这里有距离限制,所以可以考虑一下用cdq分治
每次找出树的重心,先做重心的祖先的那棵树,因为祖先的答案已经求出了,所以子树的点可以按照能到达的高度进行排序,用祖先的答案去更新子树的点的答案(单调队列),然后在分治重心的儿子。画个图吧。
NOI2014 Day2
重心这个点就特殊处理一下就可以了。

时间复杂度:\(O(nlog^2n)\)