2021.8

CF1369E DeadLee

\(s_i\) 为喜欢第 \(i\) 种食物的人数。假如存在一种食物满足 \(s_i\le w_i\),我们可以让喜欢 \(i\) 的人只吃 \(i\),并让这些人最后来,那么这些人很可能不会吃到他们喜欢的另一种食物,这些食物可以留给其他人。这时如果又出现了一种食物满足 \(s_i\le w_i\)​​​,我们可以拿它再进行一次贪心。这很像 bfs 的过程,用队列模拟即可。

P7789 [COCI2016-2017#6] Sirni

直接 kruskal 肯定不行,但这其中有很多边是无效的。首先若 \(P_a=P_b\),连起来不需要代价。所以先排序去重。

\(x<y\),则 \(\min(x\bmod y,y\bmod x)=y\bmod x\)。对于一个 \(x\) 考虑哪些 \(y\) 有效。若存在 \(y_1<y_2,\lfloor\frac{y_1}{x}\rfloor=\lfloor\frac{y_2}{x}\rfloor\),那么 \(y_2\bmod x>y_1\bmod x,y_2\bmod y_1\)​​,边 \((x,y_2)\) 一定是无效的。所以枚举 \(x\) 的倍数,二分出大于等于它的最小值连边。最后做一遍 kruskal。

CF1451E2 Bitwise

首先通过 \(n-1\) 次询问求出每个数与 \(a_1\)​​ 的异或值。现在我们要想办法求出 \(a_1\)

若存在 \(a_1\oplus a_i=0\)​ 即 \(a_1=a_i\)​,询问一次 \(a_1\&a_i\)​​ 或 \(a_1|a_i\) 即可求出 \(a_1\)

若存在 \(a_i=a_j\)​​​,询问一次 \(a_i\&a_j\)​​​ 或 \(a_i|a_j\)​​​ 即可求出 \(a_i\),然后可求出 \(a_1\)​​。

若都不满足,这个序列必定两两互不相同。由于 \(a_i\le n-1\)\([0,n-1]\)​​内的数全部出现过。

由于 \(n\)\(2\) 的幂,\(n-1\) 二进制下全为 \(1\)\(n-2\) 形如 \(111\dots0\)。必定存在 \(a_i\) 满足 \(a_i\oplus a_1=n-2\),即 \(a_i\)\(a_1\) 只有最低位相同。可以询问 \(a_i\&a_1\) 得出 \(a_1\) 最低位。同时必定存在 \(a_i\) 满足 \(a_i\oplus a_1=1\),即 \(a_i\)\(a_1\) 只有最低位不同。可以询问 \(a_i\&a_1\) 得出 \(a_1\) 其他位。然后就可以得出 \(a_1\),最多使用 \(n+1\) 次询问。

CF506D Mr. Kitayuta's Colorful Graph

神奇的根号分治。首先把询问离线,枚举每种颜色,用并查集处理联通块。然后我们可以写出两种暴力:

  1. 枚举每个询问,用并查集判断连通性。
  2. 枚举每个连通块,再枚举连通块内的点对,将查询这组点对的询问答案 \(+1\)

若某种颜色涉及的边数超过 \(\sqrt m\),我们使用第一种暴力。这样的颜色数量不超过 \(\sqrt m\)。这一部分时间复杂度 \(O(q\sqrt m\alpha(n))\)​​。否则使用第二种暴力,各连通块大小平方和一定不超过点数平方,而点数不超过边数的二倍。这一部分时间复杂度 \(O(n\sqrt n\alpha(n))\)

CF1108E2 Array and Segments (Hard version)

题意:给出一个序列和一堆区间,选出一些区间进行区间减 \(1\) 操作,使得序列极差最大,并给出方案。

由于操作是区间减 \(1\),序列最大值一定不会再变大。所以枚举一个位置作为最大值,把没有覆盖到这个位置的区间都减 \(1\)

用线段树维护,先把所有区间作用到序列上。枚举到某个位置时,把所有以这个位置开始的区间撤销(\(+1\)),然后求出当前答案。再把所有以这个位置结束的区间作用回去。就可以做到 \(O(n+m\log n)\)

CF1167E Range Deleting

\(L_i,R_i\) 分别为值为 \(i\) 的下标的最小 / 大值。即求有多少 \(l,r\) 满足 \(R_1<L_2,\dots,R_{l-2}<L_{l-1},R_{l-1}<L_{r+1},R_{r+1}<L_{r+2},\dots,R_{x-1}<L_x\)

先从后往前扫一遍求出最大的可能的 \(r\),然后做一遍双指针即可。当 \([1,l-1]\) 无法满足时及时退出。

P6071 『MdOI R1』Treequery

首先需要知道一个结论:一个点集的 LCA 是这个点集中 dfs 序最小的点和 dfs 序最大的点的 LCA。假设这两个点分别是 \(x,y\)(可以用 st 表求)。

然后一波分类讨论:

  1. 所有 点都在 \(p\) 的子树内(二维数点,主席树),答案为 \(dep_{LCA(x,y)}-dep_p\)
  2. 有些点在 \(p\) 子树内,有些不在,答案显然为 \(0\)
  3. 所有点都不在 \(p\) 的子树内,这里又要分类讨论

首先找到一个点 \(q\),满足它是 \(p\) 的祖先,且其子树内 存在 \([l,r]\) 中的点,且深度最大。这个可以二分。

  1. 所有点都在 \(q\) 子树内,答案为 \(dist(p,LCA(x,y))\)
  2. 否则,答案为 \(dep_p-dep_q\)

总时间复杂度 \(O(q\log^2n)\)

P7515 [省选联考 2021 A 卷] 矩阵游戏

首先不难求出一组符合 \(b\) 矩阵的 \(a\),但可能不满足值域限制。所以要给每个数加上一些东西,使得 \(a\) 满足值域限制并且每四个格子的和不变。

发现给某一行或某一列依次加上 \(x,-x,x,-x,\dots\),每四个格子的和不变。设 \(r_i,c_i\) 分别表示第 \(i\) 行 / 列的操作数,就是要使 \(0\le a_{i,j}\pm r_i\pm c_j\le 10^6\)。尝试找一种方案使得每个格子内刚好一正一负(于是就可以差分约束):

r1-c1 c2-r1 r1-c3
c1-r2 r2-c2 c3-r2
r3-c1 c2-r3 r3-c3

即:若 \(i+j\) 为偶,则加上 \(r_i-c_j\),否则加上 \(c_j-r_i\)。然后 spfa 差分约束求出 \(r,c\) 即可。

AT2689 [ARC080D] Prime Flip

\(a_i\) 为第 \(i\) 颗棋子的状态,\(1\) 向上,\(0\) 向下。然后令 \(b_i=a_i\oplus a_{i-1}\),则一次区间 \([l,r]\) 的翻转相当于 \(b_l,b_{r+1}\) 分别翻转。那么同时翻转 \(b_l,b_r\) 的条件就是 \(r-l\) 是奇素数。

首先找出所有为 \(1\)\(b_i\),数量一定是偶数(必然是 \(a\) 中连续段 \(\times2\))。若 \(b_j-b_i\) 是奇素数,则连边,此时 \(b_i\)\(b_j\) 的奇偶性肯定不同,所以是二分图。然后跑一遍二分图最大匹配,因为这样只用一次操作,没有重复操作同一个位置时肯定越多越好。

不难发现差为偶数时最多 \(2\) 次。在剩下的奇数和偶数中,分别配对。最后要么全部搞完,要么各剩一个。此时它们的差一定不为奇素数,需要 \(3\) 次搞完。

P1587 [NOI2016] 循环之美

\(k=10\) 时找规律可以发现求的是 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1][(j,k)=1]\)

\(\sum\limits_{j=1}^m[(j,k)=1]\sum_{d|j}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor=\sum_{d=1}^m\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\sum\limits_{j=1}^m[(j,k)=1][d|j]\)

\(=\sum_{d=1}^m\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\sum\limits_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}[(jd,k)=1]=\sum_{d=1}^m\mu(d)\left\lfloor\frac{n}{d}\right\rfloor[(d,k)=1]\sum\limits_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}[(j,k)=1]\)

最右边那串东西显然有循环节,可以 \(O(k)-O(1)\) 求出,记为 \(S\)

原式 \(=\sum_{d=1}^m\left\lfloor\frac{n}{d}\right\rfloor S(\left\lfloor\frac{m}{d}\right\rfloor)[(d,k)=1]\mu(d)\)。整除分块后只需要求出 \(f(d)=[(d,k)=1]\mu(d)\) 的前缀和。\(m\) 较大考虑杜教筛。令 \(g(x)=[(x,k)=1]\),发现 \((f*g)(d)=\sum_{t|d}[(d,k)=1][(d/t,k)=1]\mu(d)=[(d,k)=1][d=1]=[d=1]\),而 \(g\) 本身的前缀和就是 \(S\)。再来个杜教筛即可。

P4117 [Ynoi2018] 五彩斑斓的世界

用并查集维护数集。散块修改直接暴力。对于整块修改,分成两种情况(设块内最大值为 \(mx\)):

  1. \(2x\le mx\)\(i\in[1,x]\) 合并到 \(i+x\),然后打一个整块减 \(x\) 的标记。
  2. \(2x>mx\)\(i\in[x+1,mx]\) 合并到 \(i-x\)

考虑每一个块,一次整块修改花费的并查集操作次数是 \(\min(x,mx-x)\),而 \(mx\) 也会减少 \(min(x,mx-x)\),即最多操作 \(mx\) 次。总时间复杂度 \((q+V)\sqrt n\)。这题还卡空间,把询问离线下来,每个块依次处理,空间就是线性的。

P6292 区间本质不同子串个数

考虑一个简单一点的问题:有一堆带颜色区间(同颜色的区间等长),询问一个区间所包含的完整的区间中,有多少种颜色。

把询问离线之后,枚举询问的右端点 \(r\),对于在 \(r\) 左边的同颜色的区间,只保留最靠右的(在左端点上 \(+1\))。具体地,枚举每一个以 \(r\) 结尾的区间 \(i\),记 \(lst_x\) 为颜色 \(x\) 上一次出现的右端点,则 \(lst_{clr_i}-len_i+1\) 减去 \(1\)\(l_i\) 加上 \(1\)。查询时查一个区间和即可。用一个树状数组即可解决。

再看这道题。对原串建出 SAM 后,在每个节点上维护一个 \(lst\)。枚举右端点 \(r\),此时 parent tree 上 \(r\) 节点到根的 endpos 都多了一个 \(r\),考虑把这些串的贡献撤销,再算上 \([1,r],[2,r],\dots,[r,r]\) 的贡献。那么就可以枚举这些节点(一定都在 \(r\) 之前),在树状数组上区间加,区间求和。

但这样显然会超时。观察这个到根的操作,很像 LCT 的 access 操作。把路径上的节点放到一棵 splay 中,然后打个 \(lst\) 赋值的标记。而 access 时经过的每一棵 splay,所代表的子串长度一定连续,\(lst\) 也一定相同,所以在树状数组上区间减即可。然后在 \([1,r]\) 上区间加即可。总共是两只 \(\log\)。注意初始时所有边都是虚边,因为我们直接把整个串的 SAM 建出来了,而初始时没有任何节点。

P5386 [Cnoi2019]数字游戏

在值域上进行回滚莫队,问题变成了:一个全为 \(0\) 的序列,支持 \(O(n\sqrt n)\) 次把一个位置变成 \(1\)\(O(n)\) 次询问 \([l,r]\) 内每段连续的 \(1\)\(C_{len}^2\) 之和。如果直接用线段树,修改查询都是 \(O(\log n)\),所以用分块平衡复杂度。具体地,在块内每个连续段的两端维护连续段的长度(只需要保证两端的信息是正确的),维护块内答案、左右两边 \(1\) 的个数。

P6578 [Ynoi2019] 魔法少女网站

和上一题很像,这题多了修改,但没有值域下界。还是用分块维护连续段。

这题需要用到一个叫操作分块的东西。假设块长为 \(T\),发现一个块内最多只有 \(T\) 个位置要修改,剩下 \(n-T\) 个位置是不变的。那么可以对块内的询问按照 \(x\) 排序,\(n-T\) 个数也排个序,用双指针处理。

然后对于一次询问,把操作块内在它之前的修改作用一遍。枚举这 \(T\) 个位置,判断是否要在序列上修改。注意这些是要及时撤销的。

P5311 [Ynoi2011] 成都七中

有一个性质:对于树上任意的连通块,在点分树上必有唯一的点,其在点分树上的深度最小。

那么对于一个询问 \(l,r,x\),如果找到了这个最浅的点 \(y\),整个连通块就都在 \(y\) 的分治区域内了。然后把询问挂在 \(y\) 上。记 \(mx_i,mn_i\) 分别表示 \(i\)\(y\) 的路径上,最大编号和最小编号。如果 \(l\le mn_i,mx_i\le r\)\(i\)\(y\) 就是联通的。而 \(x\) 又与 \(y\) 联通,所以 \(i\) 一定在要求的连通块内。

现在问题变成了:询问 \(l\le mn_i,mx_i\le r\) 的点的颜色数。离线后枚举 \(r\),对于\(mx_i\)\(r\) 左边的同颜色的点,只保留 \(mn_i\) 最靠右的,在 \(mn_i\) 上加 \(1\)。查询时就查个区间和,所以一个树状数组即可完成。

事实上并不需要建出点分树,只需要一次点分治。把所有当前分治中心联通的、且没有被处理过的询问,搜集起来,处理一遍。这样每个询问只会被最浅的分治中心处理。时间复杂度 \(O(n\log^2 n)\)

posted @ 2021-09-15 19:26  EverlastingEternity  阅读(32)  评论(0编辑  收藏  举报