ynoi_ds题
文章平均质量分 65
思维不行,不想写思维题,想通过比较感兴趣的数据结构题让自己有思考
Lanthanmum
ds+math
展开
-
P4119 [Ynoi2018] 未来日记
因此我们维护bc[i][j] i个块内 j个值域块内的数量,c[i][j] i个块内j个数值的数量,那么散块也需要临时维护t1[i]第i个值域块的数量,t2[i]第i个数值的数量,提前预处理。我们可以做一个前缀和,O(1)询问范围内的数量与k的关系,小于k我们就累加,否则我们就找到了那个块,找到第几个数也是一样的原理。我们维护val[i][j] 记录在第i块内的第j个位置的值,index[i][j]记录在第i个块内的a[j]在什么位置。loc[i]记录index[i][a[i]]如果有x,有y +合并。原创 2024-04-13 00:22:16 · 299 阅读 · 0 评论 -
P5072 [Ynoi2015] 盼君勿忘
出现的次数可以用c[N]计数,出现该次数的数可以用sum[N]记录,有几种k可以用双向链表记录或者set,(选择unordered_set常数比较小)学了一下双向链表,unordered_set, 光速幂感觉比做思维题有收获。假设存在一个x,它在[l,r]区间出现了k次,我们想计算它的贡献。k最多有sqrt(n)个 如果用快速幂预处理的话时间复杂度是。sn是等差求和 k=1,k=2,k=3...理论上来说能过?反向考虑一下,我们知道子字串的数量,没有x的子字串的数量。考虑计算每个数对答案所作的贡献。原创 2024-04-11 22:10:47 · 224 阅读 · 0 评论 -
P5069 [Ynoi2015] 纵使日薄西山
我们先思考一下,我们需要维护哪些值,左端点有没有被操作的,右端点有没有被操作的,以及如果左端点需要被操作的贡献是多少,右端点需要被操作的贡献是多少,如果两端都被操作的贡献是多少,因此我们维护四颗线段树,seg[N原创 2024-04-11 07:30:12 · 384 阅读 · 0 评论 -
P5356 [Ynoi2017] 由乃打扑克
1.不一定要把散块重构,如果没有询问到,可以不做,我们用线段树区间赋值的思想,修改后标记一下这个块需要重构,等询问的时候问到了再进行重构。分析一下二分答案这块,我们不一定要把L定义无穷小,R定义无穷大,可以维护一下区间最大值区间最小值这样可以转化为。的排序,我们可以把数列分成2块,没有加的和加的,两边其实都是有序的,因此可以用归并排序优化成。综合分析一下2个操作,查找区间第k小的值,感觉可以用主席树,区间修改那没事了。差不多能卡过去了,我是这样干的,二分剪枝一下。分析一下散块区间加,不一定要。原创 2024-04-09 20:05:14 · 260 阅读 · 0 评论 -
P4117 [Ynoi2018] 五彩斑斓的世界
2.x<(mx/2),最优的复杂度应该是O(x),因此思考在这种情况下如何操作使得复杂度为O(x),从x到0遍历一遍呗,我们可以遍历一遍x到0,merge(i,i+x),打上区间减法标记。fa[N]并查集,index[V](存储该值的位置),val[N](存储该位置的值),num[V](存储该值的数量),lazy(减法懒标记),mx(最大值),ans[M](询问的答案)散块:暴力操作,再重构,无脑真不错,每次最多重构O(2*sqrt(n)),总共O(m*sqrt(n))原创 2024-04-08 16:47:32 · 285 阅读 · 0 评论