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分治。
每次找出树的重心,先做重心的祖先的那棵树,因为祖先的答案已经求出了,所以子树的点可以按照能到达的高度进行排序,用祖先的答案去更新子树的点的答案(单调队列),然后在分治重心的儿子。画个图吧。
重心这个点就特殊处理一下就可以了。
时间复杂度:(O(nlog^2n))