近期总结,由于太懒写在了一起,很简洁但不易懂
8.9
P1:
题意:给出一个字符串 计算(num[1]+1)*(num[2]+1)….*(num[l]+1),其中num[i]表示由前i个字符组成的字符串中,前后缀不重合比且相同的子串数。
由于状态不够集中,没认真审题,一开始把num数组的意义理解错误,做了一个小时才发现样例解释不通,再读题才发现错误,浪费了大量时间.
解法:开多一个fail数组,与next数组相似,只是fail加多了一个题目的限制,即前后缀不能重复,建立了fail数组,在建立一个dep,表示next数组建立起的树结构中,该节点的深度,这样dep[fail[i]] 就是num[i]
P2:
题意:noi 2014 day2 p2 ,题意描述的很复杂,似乎很难的样子~~
常数问题,尽量避免乘法与取mod(常数巨大),代码实现不够灵活,花了大量时间在空间,常数问题上。
解法:一开始想了从小到大枚举填充数,以行为标准维护区间列的上下界来判断是否能填入,用了线段树来维护,忽略常数似乎能过,但最开始生成傻叉random数组就已经占了80%的时间,因为这题n,m范围较少,
O(n*m)的维护上下界再O(1)判断是否可填充即可。
P3:
Noi 2014 day2 p3
解法:
F[i]=opt(f[j]+(dis[i]-dis[j])*p[i]+q[i]){dis[i]-dis[j]<=l[i]} 由于有后面的距离限制,树链剖分,维护下凸壳。
细节:
1:gf[r],表示在这一条链上标号为r点到顶点的距离,方便后面判断距离是否超限制,这里要对应意义,gf[r],r是标号,不是节点号
2:计算斜率,如果垂直说明斜率无穷大
前两题走了很多弯路,导致没时间看第三题,以后要改进
(对数据结构的题目还是比较生疏,以后要多做这类题)
8.10
P1:
题意:最少硬币数问题,各面值的硬币量为无限
(想了很久也没想出解决方法。用了暴力)
解法:考虑暴力DP数组在进行a[n]^a[n]次维护后就会趋于稳定,这样每次都用最大的进行更新DP数组)
P2:
看到数论题就不想深入思考,以后要加强数论专题,预处理可能的质因数,从大到小暴力X的质因数组成, 加上判断目前是否比答案大的优化。
P3:
题意:输出所有的ans[i], ans[i]为满足a[j]+a[k]+a[l]=a[i] 的三元组(j,k,l)数, {i-d<j<=k<=l<i}
前两题花去大量时间,最后一题想到大体思路,但细节问题没时间想,就果断骗分。
枚举其中一个位置,对于三个不重合的情况会算三次,有两个重合的只会算两次,三个重合的算了一次,想办法将所有都算三次最后除以3即可
8.11
P1:
暴力时候把v与u搞反,并且i的标号没处理好,暴力也要认真写。
这题与GDOI集训期间做的一道集训队出题类似,先把初始方案算出,然后考虑增加高度能获得的增量(增量是单调递增的),把增量用堆维护,若堆顶增量为正说明无法再缩小了。
P2:方格较大,但关键点比较少,先做全图最短路,再状压DP,考虑菜药的顺序(小细节,终点始点就是药的情况,体力不能重复恢复)。
P3:与昨天第二题相似,但要加上优化,如果一个一个加复杂度就与答案数呈线性相关,mq*sqr(z[i])>n时,之后最多只能选一个质数,这个能将一个级别的复杂度。
8.12
P1:求并集,最先应想到压位计算1的个数。
P2:在线做无法判断父子关系,所以先建完整棵树的结构,树链剖分后在线做,fur[i]表示目前i所在连通树的根,并查集维护。注意跳根时的细节。
P3:
题意:遍历无向图,求合法的经过的符号数恰好为k的式子的总路径数。
解法:f[I,j,k,l],前i步,到第j节点,左括号比右括号多k,这位是否为前导零。
细节:因为前两题花太长时间,一些小细节没有注意到,判断是否能走。Dp采用正推,反推时在前导零判断处容易出错(容易把前导零当作非前导零)以后DP用尽量用正推。
8.17
P3:动态建树,建树过程中询问所有树的节点到这棵树重心的距离和。
解法:离线建树构造dfs序并树链剖分,添边时维护size,以及以根为资源站的答案,对于两棵树的合并,新重心必定在大树重心以及大树与小树连接点到他们的lca路径上,且新重心与旧重心的距离不大于size[小树],因此在重心到lca上可以暴力,lca到连接点用倍增维护最浅的可行节点作为重心,易证其正确性。最后通过根的答案得出重心处的答案,更新最终答案
8.19
P3:
解法:第一次写路径剖分,点剖的细节,每次找完重心都要在算一次size,且要注意好删边,以后任何处理都不能再走删过的边,因为目前重心的某棵子树的重心有可能不是该重心的儿子,所以有可能重复遍历过去的边.
注意单调队列进队时机,每次i的枚举都要有所有合法长度选择进队,在每一层DP时,上限是该子树的大小,不然就会破坏时间复杂度,每一层最多遍历n个,如果超出上限,每一层就会超过n
8.20:
P1:题意:给定一系列操作,
I:在光标处增加一数字
Q:k,询问max(s[k]){si=sigma(a[i])}
L,R:左右移光标1格,D,删除光标前的数字
解法:链表的应用,一开始用了splay,但Q有1000000,splay的常数无法承受,由于询问在光标位置前,且每次光标的移动都是1格,所以每次光标的移动,插入,删除都可以用链表O(1)解决,每次移动都维护答案,移动的位置,加上之前的答案都知道,因为询问只会问光标位置之前的,后面的暂时不关注。