Shu-How Zの小窝

Loading...

2025 11 4- 11.6

  • 11.4号这个只有一个上午的时间来着,晚上和中午我被弄去搞WHK了/jk
    vp 第十七场
  • T1 评分:绿
    • 直接秒了,倒着弄+并查集即可(用时20min)
  • 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)  评论(0)    收藏  举报