• 2021.8


    CF1369E DeadLee

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

    P7789 [COCI2016-2017#6] Sirni

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

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

    CF1451E2 Bitwise

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

    若存在 (a_1oplus 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_ile n-1)([0,n-1])​​内的数全部出现过。

    由于 (n)(2) 的幂,(n-1) 二进制下全为 (1)(n-2) 形如 (111dots0)。必定存在 (a_i) 满足 (a_ioplus a_1=n-2),即 (a_i)(a_1) 只有最低位相同。可以询问 (a_i&a_1) 得出 (a_1) 最低位。同时必定存在 (a_i) 满足 (a_ioplus 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(qsqrt malpha(n)))​​。否则使用第二种暴力,各连通块大小平方和一定不超过点数平方,而点数不超过边数的二倍。这一部分时间复杂度 (O(nsqrt nalpha(n)))

    CF1108E2 Array and Segments (Hard version)

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

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

    用线段树维护,先把所有区间作用到序列上。枚举到某个位置时,把所有以这个位置开始的区间撤销((+1)),然后求出当前答案。再把所有以这个位置结束的区间作用回去。就可以做到 (O(n+mlog 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(qlog^2n))

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

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

    发现给某一行或某一列依次加上 (x,-x,x,-x,dots),每四个格子的和不变。设 (r_i,c_i) 分别表示第 (i) 行 / 列的操作数,就是要使 (0le a_{i,j}pm r_ipm c_jle 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_ioplus a_{i-1}),则一次区间 ([l,r]) 的翻转相当于 (b_l,b_{r+1}) 分别翻转。那么同时翻转 (b_l,b_r) 的条件就是 (r-l) 是奇素数。

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

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

    P1587 [NOI2016] 循环之美

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

    (sumlimits_{j=1}^m[(j,k)=1]sum_{d|j}mu(d)leftlfloorfrac{n}{d} ight floor=sum_{d=1}^mmu(d)leftlfloorfrac{n}{d} ight floorsumlimits_{j=1}^m[(j,k)=1][d|j])

    (=sum_{d=1}^mmu(d)leftlfloorfrac{n}{d} ight floorsumlimits_{j=1}^{leftlfloorfrac{m}{d} ight floor}[(jd,k)=1]=sum_{d=1}^mmu(d)leftlfloorfrac{n}{d} ight floor[(d,k)=1]sumlimits_{j=1}^{leftlfloorfrac{m}{d} ight floor}[(j,k)=1])

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

    原式 (=sum_{d=1}^mleftlfloorfrac{n}{d} ight floor S(leftlfloorfrac{m}{d} ight floor)[(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. (2xle mx)(iin[1,x]) 合并到 (i+x),然后打一个整块减 (x) 的标记。
    2. (2x>mx)(iin[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(nsqrt 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) 的路径上,最大编号和最小编号。如果 (lle mn_i,mx_ile r)(i)(y) 就是联通的。而 (x) 又与 (y) 联通,所以 (i) 一定在要求的连通块内。

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

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

  • 相关阅读:
    339. Nested List Weight Sum
    41. First Missing Positive
    366. Find Leaves of Binary Tree
    287. Find the Duplicate Number
    130. Surrounded Regions
    ubuntu18.04安装mongodb4.4
    阿里dataX配置使用
    MySQL主从同步简单介绍&配置
    阿里yugong配置使用
    ubuntu编译安装mysql
  • 原文地址:https://www.cnblogs.com/creating-2007/p/15282709.html
Copyright © 2020-2023  润新知