首页 > 其他 > 详细

2019.2.26"欢乐赛"

时间:2019-02-26 15:12:28      阅读:154      评论:0      收藏:0      [点我收藏+]

 A

技术分享图片

 

类似分成一些矩形(类似笛卡尔树)

把条件放在矩形上(条件桶排放进高度,然后往上扫即可)

然后树形DP

技术分享图片

 

f[x][0/1]以x为根的子树,是否灌满水的最大收益

不灌满的话,直接把这个矩形从下往上扫一遍即可

 

法二:

dp[i][j]前i个柱子,最后一个灌了j的水的最优值(不管第i个柱子的后面位置的高度)

设i个柱子左边的板长度为j

dp[i][j]=max(dp[i-1][k])+sum[i][j] (j<=h&&k<=h)

dp[i][j]=dp[i-1][j]+sum[i][j] (j>h)

sum[i][j]表示i位置高度为j的收益

线段树维护j那一维,维护区间最大值,区间加,区间对一个数取max。j和h的不同分别处理即可。

 

C. string

技术分享图片

 

 技术分享图片

总字符串长度是1e5,长度都是k,有q个询问

qk<=1e5

然后就是分块乱搞了

 

1.k<=sqrt(1e5):

vector[l][r]表示,左端点在l,右端点在r的询问

询问放进去

枚举w的所有子串,用hash找到出现次数,vector[l][r]二分找到[a,b]之间的询问个数作为系数乘上去

或者,

S建SAM,枚举w的k个li,往上面跑,跑一步到了ri,vector[li][ri]类似上面的二分即可。

2.q<=sqrt(1e5)

先把m个区间在右端点的位置放进vector:

对S建SAM,然后w在上面匹配,如果当前r位置有询问,就倍增找到,right集合大小就是ans

O(m+qklogn)

 

2019.2.26"欢乐赛"

原文:https://www.cnblogs.com/Miracevin/p/10437353.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!