做题/口胡随机记录
随机记一些感觉比较好的内容……
2024.11.18
CF842E Nikita and game
题意
\(n\) 次操作,每次增加一个叶子节点,求能成为直径端点的叶子数量。
\(n\le 3\times 10^5\)。
solution
发现直接维护所有直径难度很大,考虑转化。
trick. 一棵树所有直径的交是一条路径。
我们维护直径的交,每次加入一个点的时候看这个点是更新直径长度/增加答案数量。
2024.11.20
CF1936D Rainbow Rectangles
题意
\(L\times L\) 的 方格图中有 \(n\) 个方格被染上共 \(k\) 种颜色,求有多少个矩形包含所有颜色。
\(L\le 10^9\),\(n,k\le 2\times 10^3\)。
solution
思维能将简单的工具组合为精巧的问题。
考虑枚举 \(x\) 的左右边界 \(l,r\),因为随着矩形的增大条件一定仍然满足,因此接下来问题转化为对于每个上边界 \(i\) 求一个距离最小的 \(f_i\) 使得矩形包含所有颜色。
考虑 \(f_i\) 的形式是 \(\max_{v=1}^{k}(\min_{j=1}^{n}y_j[l\le x_j\le r,y_j>i,col_j=v])\)。
我们现在如果固定左端点,从小到大枚举右端点的话,\(f_i\) 不断减小,会出现同时维护每种颜色内部取 \(\min\) 和颜色间取 \(\max\) 的情况。
因此我们转换思路,固定左端点的同时从最大的右端点开始枚举,这样所有点就变成了依次删除,\(f_i\) 不降,因此可以直接取 \(\max\)。
剩下的部分我们用 set 维护每种颜色内部,删除一个点即用后继的值更新一段区间,这段区间左端点即前驱,右端点可以通过线段树上二分得到。
总复杂度 \(O(n^2\log n)\)。

浙公网安备 33010602011771号