杂题选做
杂题选做
主要记录一下刷的非套题的思路。
2024.12.12
Luogu P3586 [POI2015] LOG 80/100
看到判定类问题可以先思考必要性条件,可以先列出一个式子:
显然对于每个询问这是成立的,否则根本选不到 \(c \times s\) 个。
然后看到形如 \(\max/\min(x,c)\) (其中 \(c\) 是常数)的形式可以分类讨论,拆成大于/小于 \(c\) 的部分和小于等于/大于等于 \(c\) 的部分。
这个拆出来之后就好处理这个贡献了,可以开两个值域 BIT 分别维护大于等于 \(s\) 的数的个数和小于等于 \(s\) 的数的和即可,此部分复杂度为 \(O(\log n)\) 单次操作。
然后考虑到另一个限制就是每次查询的单次操作都必须要至少有 \(c\) 个正数。而那些大于等于 \(s\) 的数显然满足 \(s\) 轮操作,然后再猜一下结论可得 \(\sum a_i[a_i<s] \ge s \times (c-\sum [a_i \ge s])\) 是充要条件,由上面的结论可得必要性显然,然后考虑证明充分性(即证明一定存在一种构造方式使得满足限制)。
将这些小于 \(s\) 的数从大到小排序,原问题等价于给定一个 \(s \time c\) 的矩阵,现在已有 \(m=\sum [a_i \ge s]\) 列放满。我们按顺序填充每一列,由于 \(a_i \ge a_{i+1}\),因此必然不会存在同一行放了相同元素的情况。因此问题得证。
时间复杂度 \(O(n \log n)\).
2024.12.17
Luogu P3250 [HNOI2016] 网络 0/100
首先可以二分,对于每个询问,如果大于当前答案的路径都经过了当前的断点,那么答案一定在左半区间,反之在右半区间。
然后注意到可以二分,于是整体二分。对于维护路径经过某个点可以树上差分树上前缀和,用 BIT 维护即可。
时间复杂度 \(O(n \log^2 n)\).

浙公网安备 33010602011771号