Training Course I
A. Codeforces 74D
题意:有\(n(n\leq10^9)\)个格子,每次可以插入一个衣服,位置为最长的连续空白段的中点,如果有多个则选择最靠右的一段,或者删除一个衣服,询问一段区间内的衣服个数
解析:用set维护插入与删除衣服的操作,每个节点为一段线段,存储它前面和后面的衣服指针,衣服存储它前面与后面的一条线段的指针。插入与删除直接维护即可,计算区间衣服个数离散化后树状数组维护。
注:Set的Insert操作返回的是一个pair
B. Codeforces 526F
题意:给出一个n*n的棋盘\((n\leq300000)\),有n个棋子在棋盘上,每行每列恰有一个,求有多少个子正方形满足每行每列都有一个棋子。
解析:题意即为求满足\(max[l,r]-min[l,r]=r-l\)的二元组\((l,r)\)个数,通过分治后考虑最大最小值在哪一段区间来考虑,具体可以直接看题解。
注:此题貌似有\(O(n)\)的方法
C. Codeforces 609F
题意:数轴上有n\((n\leq200000)\)只蛤,给出每只的舌头长,舌头为它的位置开始向右的一条线段,会不断的有蚊子降落在数轴上,如果有舌头覆盖了它,它会被吃掉并且给吃的蛤的舌头加一个长度,多个覆盖取位置最靠左的那只,否则在数轴上等待被吃,求最后每只蛤吃的蚊子数和舌头长。
解析:不难发现如果某只蛤的舌头被全部覆盖了,那么它永远不可能再吃到蚊子,我们可以用set维护一个递增的舌头序列,每次二分查找,删除蛤。

浙公网安备 33010602011771号