2023.3.30 闲话

膜拜 INOH(是不是有点迟了)

膜拜 HE(乍一看像个强省.jpg)

膜拜 luogu.org(SoyTony 曾指出量化开网程度的标准是 luogu.org)

本来只是想刷一下存在感,不过只有这些好像有点太水,就搬了下面的凑数 .


CF751D Campus

简单题,Kaguya 给我推的 APJ 给他推的题目 .

连通块操作的考虑重标号,那么就变成了维护两类重标号并且支持一类重标号的区间加一类重标号的区间赋 \(0\) 和单点求值 .

只有单点求值那么容易想到的是找到操作时间前的最后一个区间赋 \(0\) 然后统计所有包含对应点的区间加产生的贡献即可,这个可以持久化线段树减做到 .

时间复杂度 \(\Theta((n+q)\log n)\) .

Ynoi Easy Round 2021 TEST_68

首先找到异或和最大的两点 \(u,v\),那么除了 \(1-u\)\(1-v\) 两条路径上的点答案都是 \(a_u\oplus a_v\) 了(全局支配点).

那么只需要算路径上点的答案,考虑每次暴力在树上走一步用一个 01Trie 维护子树补内所有的点,总共 \(\Theta(n)\) 个只走不超过两遍可以接受 .

总时间复杂度 \(\Theta(n\log V)\) 其中 \(V\) 是值域 .

CF526F Pudding Monsters

比较经典题 .

首先变成一维问题限制即为 \(v=\mathrm{max}-\mathrm{min}-\mathrm{len}=-1\),考虑扫描线用单调栈维护后缀 min, max,线段树维护后缀 \(v\)\(v=-1\) 的个数,注意到至少有一个后缀满足 \(v=-1\)(至少 \(l=r\))而且对于任意后缀有 \(v\ge-1\),于是可以改成维护 \(v_{\min}\) 的个数,这是好维护的 .

时间复杂度 \(\Theta(n\log n)\),很好 .

CF679E Bear and Bad Powers of 42

\(42\) 的次幂比较少考虑处理每个点到最近的 \(42\) 次幂要加多少记作 \(v\),看前两个操作考虑线段树维护 .

考虑操作 \(3\) 只需要每次暴力区间加直到区间 \(v_{\min}=0\),区间加考虑如果目前段内加完都没有跨越一个 \(42\) 的幂直接打区间加标记否则递归进入子节点 . 这样看起来跨越只有约 \(\log_{42}V\) 次复杂度很科学,其中 \(V\) 是值域 .

对于具体的复杂度分析,先让 \(m=\log_{42}V\),令势能函数 \(\Phi(x)\) 表示线段树上每个点在值域内可能发生的跨越操作的次数,那么:

  • 对于一次区间赋值,增加 \(\Theta(1)\) 个连续段,\(\Phi(x)\) 增加 \(\Theta(m\log n)\) .
  • 对于区间加,每次操作增加两个连续段,\(\Phi(x)\) 增加 \(\Theta(m\log n)\) .

那么区间加和区间赋值的摊还代价都为 \(\Theta(m\log n)\),于是时间复杂度为 \(\Theta((n+q)m\log n)\),或者写成 \(\Theta((n+q)\log n\log_{42}V)\) .

SDOI2015 寻宝游戏

结论:若点列按 DFS 排序后得到序列 \(\{a_n\}\),则点列形成的极小连通子树的边权和的二倍等于 \(\operatorname{dist}(a_1,a_2)+\operatorname{dist}(a_2,a_3)+\cdots+\operatorname{dist}(a_{n-1},a_n)+\operatorname{dist}(a_n,a_1)\) . 证明不很困难 .

然后 set 维护 DFS 序排好的点每次加入的时候和前驱后继算一下贡献即可,时间复杂度 \(\Theta(m\log n)\) . 可能是我常数大树剖被卡常改成倍增才过 .

CF311D Interval Cubing

这种区间几次方的模数没好性质是做不了的,于是首先可以套路地发现循环节为 \(c=\operatorname{ord}_{\varphi(p)}3=48\),其中 \(p=95542721\) .

然后就比较平凡了,线段树处理每个区间操作 \([0,c)\) 次的区间和每次三次方的时候打标记即可,时间复杂度 \(\Theta((n+q)c\log n)\) .

Luogu5891 Fracture Ray

不难想到连 \(\operatorname{popcount}(u)+u\to u\) 连出一棵树,猜一下虚树上大概只有 \(\Theta(q)\) 级别的点 . 这样就是链加链和可以树剖维护一下 .

考虑如何求出虚树其实就是先把询问离线下来用一个 bitset 记哪些点被用了然后每个点暴力跳到访问过的节点或者超过 \(v\) 了停下,因为有效点不会很多所以能跑 .

时间复杂度 \(\Theta(q\log^2 q)\) . 空间复杂度大概是 \(\Theta(q+\frac V{\omega})\) .

Luogu6587 超超的序列 加强

¿

考虑对下标建立一棵 01Trie,每个点的下标按从根节点到对应节点从低位到高位顺次连接,那么操作即为子树加子树求和,打标记即可 .

时间复杂度 \(\Theta((n+q)\log n)\) . 还得 pushup 非递归好像不太方便写 .

Ynoi2017 由乃的玉米田

考虑莫队,下面分类讨论每个 \(opt\) 的做法:

\(opt = 1\)(差):\(a_i-a_j=x\iff a_i=x+a_j\),于是维护一个 bitset \(S\) 记录当前存在哪些数,每次看一下 \(S\land(S\mathop{\rm lsh}x)\) 是不是 \(0\) 即可 .

\(opt = 2\)(和):和 \(opt=1\) 基本是一样的,额外开一个记录 \(-a_i\) 存不存在的 bitset 即可,可以下标整体平移一下 .

\(opt = 3\)(乘):枚举 \(x\) 的约数然后在前面维护过的 bitset 里查即可,复杂度和莫队好像天然平衡 .

\(opt = 4\)(除):看起来就很是根号分治,那么 \(x>\sqrt v\) 的直接暴力枚举倍数在 bitset 里查,\(x\le\sqrt v\) 的对于每个不同的 \(x\) 扫描线记一下前驱答案啥的就好了,其中 \(v\) 是值域 .

时间复杂度 \(\Theta(n\sqrt n)\),分析麻烦于是假设 \(n,q,v\) 同阶 .

posted @ 2023-03-30 17:02  Jijidawang  阅读(92)  评论(4编辑  收藏  举报
😅​