- 11.4号这个只有一个上午的时间来着,晚上和中午我被弄去搞WHK了/jk
vp 第十七场
- T1 评分:绿
- T2 评分:蓝
- 这个我经过了一系列的思考才得出解法来着
- 首先我先观察到了 \(k_i \cdot t + b_i\) 这个式子在 \(t\) 变大的时候有些 \(k_i > \frac{A}{t}\) 是不能用了的,我很快的发现这是一个调和级数 \(N \log{N}\) 的形式
- 此时我的脑海中蹦出了一个枚举 \(k\) 的值再枚举 \(t\) 的值的想法 然后我发现当 \(k_i \cdot t\) 是固定的时候我们需要统计的是 \(b_i \equiv -k_i \cdot t (\mod a_t)\) 的数量
- 很显然我们无法对每个 \(t\) 都把这些数去统计一遍,这样的复杂度是不优的
- 这里我是过了比较久才想到根号分治的 (大概20min左右?
- 对于每个 \(k\) 中的数
- 我们先枚举它的模数 \(1 - B\),拿一个全局变量记录模 \(i\) 等于 \(j\) 的 \(b_i\) 个数
- 拿一个全局变量 \(dis_i\) 表示 \(b_j = i\) 的 \(b_j\) 的个数
- 对于小于等于 \(B\) 的 \(a_t\) 则直接查表
- 对于大于 \(B\) 的 \(a_t\) 则我们把式子变成 \(b_i = -k_i \cdot t + c \cdot a_t\) 故可以枚举 \(c\) 从 \(1\) 到 \(\frac{A}{a_t}\) 然后计数即可
- 对于复杂度则是 \(O(A \log{A} \cdot \frac{A}{B} + N \cdot B)\)
- 则是让 \(A \log{A} \cdot \frac{A}{B} = N \cdot B\)
- 则最后的复杂度即为 \(O(N \sqrt{n \log{A}})\)
- 总用时1h30min
- T3 评分:蓝+紫-
- 完全是一道发现性质的题目啊/jk
- 法一(纯发现性质)
- 首先我们考虑枚举右端点 \(r\) 考虑在右端点为 \(r\) 的情况下有哪些点会被标记到
- 考虑有三种点
- 两次出现都在 \(r\) 左边的点,那么只有靠右边的那个点有可能 \(r\) 会对它产生贡献
- 两次出现都在 \(r\) 右边的点,那么 \(r\) 不可能会对它产生贡献
- 一次出现在 \(r\) 左边一次出现在 \(r\) 右边的点,\(r\) 可能对左边的那个点产生贡献
- 如果只考虑 \(r\) 对第三种情况产生的贡献的话,把序列反转后再做一次则能保证左或右端点会把每个点的贡献算上,不重不漏
- 但是对于第三种情况而言只可能对左边的点中离 \(r\) 最近的第三类点产生贡献,这个可以从左往右枚举 \(r\) 节点,然后维护一个栈不符合条件的弹出即可,然后我们可以对每一个数赋随机权,定义 \(sum_i\) 为前 \(i\) 个数权值的异或和,设离当前节点最近的数为 \(x\) 则查询 \(sum_j = sum_r \oplus a_x\) 的 \(j\) 个数。
- 法二(暴力线段树大法,很有锻炼套路思维能力的作用)
- 维护一个区间中出现次数为1的元素数量
- 将区间 \((l,r)\) 视为平面直角坐标系上的点,每种元素的贡献形如两个矩形+1
- 一个位置的答案即为一个矩形中元素值为1的数量
- 考虑有效的区间的长度一定是奇数,且值 >= 1,故可以分别维护奇偶区间最小值及其历史和就能维护
- 11.5 黄0.05绿0.1蓝0.25紫0.5黑1.0
- CF923C 0.25 cf706d 0.1 CF2093G 0.1 cf1285D 0.1 CF817E 0.25
- CF1446C 0.1
- 这里用到一个比较巧妙的trick是求最小删除数的题目,可以转化为求最大保留数
- CF665E 0.1 CF1658D2 0.25 CF1980G 0.25 CF888G 0.5 (板刷01trie)
- P1412 0.25
- 比较天才的trick是倒着考虑 DP(新trick
- 太天才了,\(dp_i\) 表示假设到当前的 \(i\) 的锤子值为 1,后面能赚到的最大钱数,因为题目的关键性质 任何操作都有锤子值的系数故可以直接结合
- 11.6 下午被抓去上文化课了/jk
- P2059 0.25
- 正难则反,倒着考虑!(需记住这个trick,已经碰到好几次了
- P3761 0.25 枚举一下边用树的中心然后合起来,口胡了
- 分数规划
- 分数规划用来求一个分式的极值,给出 \(a_i,b_i\) 求一组 \(w_i = 0/1\) 最大化/最小化 \(\frac{\sum_{i=1}^{n} a_i \cdot w_i}{\sum_{i=1}^{n} b_i \cdot w_i}\)
- 可以考虑二分求解则能把问题转换为 \(\sum w_i \cdot (a_i - mid \cdot b_i)\) 的最大值是否 >= 0 / 最小值是否 <= 0
- LOJ 149 01 分数规划 0.25
- 二分再用 \((a_i - mid \cdot b_i)\) 取前 \(k\) 大的看是否大于等于0即可
- P4377 0.25
- 二分再用 \((a_i - mid \cdot b_i)\) 当价值 \(b_i\) 当重量 用01背包求解
- P4322 0.25
- 积累新trick如果有子树依赖的背包问题可以考虑直接把 dfn 序考下来,用子树都是连在一起的 dfn 序 \(siz_i\) 考虑转移
- 同样的方法只是说使用了子树依赖的背包问题
- CF1630D 0.25
- 首先我很快的就发现了 \(b_i <= \frac{n}{2}\) 这个比较突出的数据范围,故我也马上想到了若有 \(x\) 和 \(y\),不妨设 \(x>y\),则有 \(x-y\) 这个可选有元素
- 思路到这就卡住了因为我并不知道如何才能用多个数给 \(a\) 数组去进行操作
- 大概思考了20多min,我突然发现 \(x\) 和 \(y\) 生成的 \(x-y\) 是很像辗转相除的,故我想到了 \(x,y\) 可以被 \(gcd(x,y)\) 代替,则所有 b 数组中的元素都可以被 \(gcd(b_1,b_2,…b_m)\) 代替
- 所以我们现在只有1个可以选的区间长度了
- 这里我卡了一会,但是我想到了可以使用操作 \([i,i+x-1]\) 和 \([i+1,i+x]\) 来完成对 \(a_i\) 和 \(a_{i+x}\) 的取反操作,这意味对 \(i \equiv j\mod x\) 进行分组后,若分组的负数元素个数为偶数的话,则能把所有元素都变成非负数,若为奇数个负数的话,把绝对值最小的变为负数,其他的均为非负数是最优的
- 这里我又卡了一会,但是我突然发现一次操作把所有分组的负数个数的奇偶性取反了,这个太关键了后面直接贪心地去取就行了
- 看到 \(x\) , \(y\), 可以产生 \(x-y\) 的时候不妨往 辗转相除的方面想想,如 \(gcd(x,y)\) 等,对于一段连续的固定长度区间的操作不妨考虑一下同余等性质
posted @
2025-11-05 21:48
睡神本神
阅读(
9)
评论()
收藏
举报