8.21近期总结

近期总结,由于太懒写在了一起,很简洁但不易懂

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)解决,每次移动都维护答案,移动的位置,加上之前的答案都知道,因为询问只会问光标位置之前的,后面的暂时不关注。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值