DS 选讲

做题

Posted by WrongAnswer_90's Blog on November 6, 2024

CF193D Two Segments

一个段是非常经典的问题 pudding monsters

序列上做不大了,考虑在值域上做。两个连续段可以用点减边,相邻两个同时出现的贡献是 $-1$,一个数字的贡献是 $+1$,这样要求就是贡献和小于等于 $2$。也是好维护的。

QOJ2743 Seats

全局想维护一个矩形很困难。考虑一个局部的性质:四个角上都是三白一黑,必要条件显然是三白一黑的格子个数等于 $4$。

然后这样如果矩形中间空了一个格子就寄了,所以还要求三黑一白的格子数量为 $0$。可以线段树维护这两者的和。

CF997E Good Subsegments

上个历史和就行了。

CF809D Hitchhiking in the Baltic States

维护 $f_i$ 表示长度为 $i$ 的子序列的最后一位最小是多少,加入一个数大概是一个区间平移和区间加一,还需要平衡树上二分。

CF765F Souvenirs

支配对。

P9678 [ICPC2022 Jinan R] Tree Distance

点分治找支配对。

CF702F T-Shirts

做过。

先把所有人有的钱从小到大排序加入一个平衡树。考虑按照价格从大到小不断加入点。这样加入一个数之后可以平衡树上二分找到会买这个东西的人,并把他们的值全部减去代价。

但是这样可能就不满足单调性了。但是发现如果不满足单调性,数字大小至少除了 $2$。所以可以均摊的暴力插入合并。复杂度 $\mathcal O(n\log^2 n)$。

[ARC159D] LIS 2

简单。

考虑求 LIS 的两种方式:$f_i$ 表示结尾是 $i$ 的最长 LIS 是多少,或者 $g_i$ 表示长度为 $i$ 的结尾最小是多少。

经过尝试之后可以发现第二种可以做,拿一个支持平移,区间 $+1$ 的 fhq 维护 DP 数组就行了。

CF1131G Most Dangerous Shark

求出 $pre_i,nex_i$ 表示向左向右最多能推倒到哪里。然后设 $f_i$ 表示推倒了前 $i$ 个牌的最小代价。暴力 DP 是 $\mathcal O(n^2)$ 的因为要求一个 $[pre_i,i]$ 的后缀和,然后 $nex_i$ 直接更新就好了。

考虑优化,直接上线段树寄完了。考虑在后面加数,查询后缀 $\min$ 是可以单调栈做的。

然后有核心性质:$[f_i,i]$ 不存在相交但不包含。所以可以查单调栈的时候不用二分,可以直接 pop 掉,随便记一下最小值就行了。

CF1677E Tokitsukaze and Beautiful Subsegments

唐氏题。

单调栈求出 $L_i,R_i$ 表示左,右第一个比 $a_i$ 大的数。然后枚举 $i,j,i\times j$,可以求出来一些合法点。

然后就变成了矩形查询矩形面积并。

CF264E Roadside Trees

难。

CF1672I PermutationForces

难。

CF983D Arkady and Rectangles

难。

CF264E Roadside Trees

不是很难但是还是挺难的。