
数据结构
文章平均质量分 61
并查集 & 线段树 & 树状数组 ...
SHOHOKUKU
这个作者很懒,什么都没留下…
展开
-
LeeCode 1987 DP / Trie
用Trie维护子序列集合,树中每一个节点代表一个互异的子序列。维护Trie中子树数量小于2的节点数量,不断插入新元素,同时将新增的树节点计入答案。,则枚举子序列的第二个元素。为首元素的子序列集合为。进行转移,转移的位置是。原创 2024-06-15 22:28:32 · 882 阅读 · 0 评论 -
LeeCode 3165 线段树
考虑不含相邻子序列的最大和,在不带修改的情况下容易想到,以最后一个元素是否被选取为状态进行DP。从线性递推的角度难以处理待修改的情况。从分治的角度考虑,使用线段树维护区间内包含或不包含边界元素的信息,即可快速维护答案。原创 2024-05-27 13:11:10 · 272 阅读 · 0 评论 -
Codeforces 1945G 块状链表 / 堆
三元组唯一地确定,使用堆维护即可。初始化队列元素间顺序仅与元素索引有关,则单独使用一个队列维护,并使用。维护其优先级,仅当此队列中元素的优先级最大值严格小于堆顶元素的优先级,此时弹出堆顶元素。使用块状链表维护队列,链表每个节点维护。个元素,并维护元素的最大值,则可以实现。只关注插入元素间的顺寻,可以根据。原创 2024-04-27 22:47:10 · 1041 阅读 · 0 评论 -
LeeCode 1896 括号树 + 树形 DP
根据布尔表达式建立一颗括号树,具体而言,出现嵌套括号就新增一个虚拟子节点。建树过程可以用一个栈维护。此括号树满足各个节点的子节点集合是按照计算顺序排列且可以直接计算的节点。最后在树上以表达式取值为状态进行树形DP即可。原创 2024-03-16 11:28:08 · 450 阅读 · 0 评论 -
AtCoder ABC324G 启发式合并
个联通分量不断合并的过程,此时使用启发式合并,即规模较小的连通分量向规模较大的连通分量合并,以单个元素合并为基本运算,则基本运算次数为。使用 std::set 分别维护以索引和值为关键字的集合,每次分裂出较小的分量即可。逆则操作顺序考虑,可以看作至多。原创 2023-10-14 22:12:27 · 512 阅读 · 0 评论 -
AtCoder ABC265G 线段树
直接维护逆序对数量比较困难,考虑到元素值域很小,直接将不同数值对解耦进行维护。具体而言,线段树维护区间。原创 2023-09-23 13:41:15 · 181 阅读 · 0 评论 -
Codeforces 1625E2 括号树 + BIT
首先利用栈将原始字符串转换为合法的 RBS,不能匹配的括号设为 ‘.’。根据匹配的括号序列构造树,具体而言,遇到左括号,则新建节点向下递归,遇到右括号则回溯。则对于括号树上某一结点。操作 1 仅删除叶子节点与其双亲节点的连边,那么使用 BIT 维护节点的贡献和,以及每个节点的子树数量即可。对于某棵子树的答案,为子树的贡献,加上。为子树的数量,后一项贡献代表了连续的。,其代表的合法括号序列。原创 2023-08-30 23:08:05 · 335 阅读 · 0 评论 -
Codeforces 1828F 树的重心 + BIT
树的重心至少 1 个,至多 2 个。树存在·2 个重心,当且仅当节点数 $n$ 为偶数,且重心的最大子树规模为 $mx=n/2$。题目所求为 $n-2\cdot mx$。需要动态维护以树的重心为根的最大子树规模。原创 2023-07-27 12:18:52 · 116 阅读 · 0 评论 -
Codeforces 914E 点分治
一个字符串存在一个回文串排列,当且仅当字符串中出现次数为奇数的字符不超过一个。以 $v$ 为根,$a_u$ 代表根到节点 $u$ 间字母的奇偶性,则通过 $v$ 的路径 $u\rightarrow w$ 可以表为 $a_u\oplus a_w\oplus a_v$。考虑点分治。每次处理仅考虑通过重心的路径。对于重心,依次考虑子树贡献。对于非重心 $u$,这样的路径的一个端点必然在 $u$ 的子树内,递归相加即可。总时间复杂度 $O(20n\log n)$。原创 2023-07-26 22:59:00 · 220 阅读 · 0 评论 -
Codeforces 1535F 字符串 + 倍增 + BIT
若字符串 $a,b$ 的字符多重集合不相等,则 $f(a,b) = 1337$。反之,将 $a,b$ 整个串做排序必然相等,则 $f(a,b)\leq 2$。此时只用考虑 $f(a,b)=1$ 的情况。若仅对 $a$ 进行一次子串 $[l,r)$ 排序使 $a = b$,则字典序意义下 $a>b$;且 $a,b$ 在 $l$ 左侧的前缀与 $r$ 右侧的后缀相等,则字典序意义下 $a,b$ 的反串 $a^{\prime},b^{\prime}$ 满足 $a^{\prime}原创 2022-10-27 20:37:53 · 476 阅读 · 0 评论 -
Codeforces 1706E 并查集 + 启发式合并 + ST 表
区间 $[l,r]$ 连通的充要条件是 $[i,i+1], i\in [l,r)$ 连通。问题转化为求解使 $i,i+1,i\in [0,n - 1)$ 连通的最小的最大边编号;最后 RMQ 查询即可,实现上使用 ST 表。原创 2022-07-24 12:03:36 · 1438 阅读 · 0 评论 -
Codeforces 1444C 可撤销并查集
题意传送门 Codeforces 1444C Team-Building题解图中节点划分为不相交的点集 SSS,求满足所构成子图为二分图的点集对 (S1,S2)(S_1,S_2)(S1,S2) 数量。若点集 SSS 构成的子图存在奇环,则它与任意其他点集构成的子图都不可能是二分图。讨论满足二分图判定的点集即可。若两点间存在一条边,则两点划分至不同的集合,可以通过并查集维护这样的关系。依次考虑点集 SSS,处理与它存在连边的点集 TTT,判断 S,TS,TS,T 构成的子图是否为二分图即可。可以原创 2022-04-26 22:50:14 · 666 阅读 · 0 评论 -
P2178 [NOI2015] 后缀数组 + 并查集
题意传送门 P2178 [NOI2015] 品酒大会题解构造后缀数组,按照 lcplcplcp 从大到小依次处理,同时使用并查集维护连通分量中的最大、最小值与后缀数量。此时可以统计出 lcp=hlcp = hlcp=h 时的方案数与美味度最大值。根据相似度的定义,最后求一遍后缀即可。总时间复杂度 O(nlog2n)O(n\log^2 n)O(nlog2n)。#include <bits/stdc++.h>using namespace std;constexpr int MAXN原创 2022-04-15 10:54:00 · 153 阅读 · 0 评论 -
Codeforces gym103119J 线段树
题意传送门 Codeforces gym103119J Jewel Grab题解维护位置 iii 相同颜色的前一个位置 pre[i]pre[i]pre[i],每次查询从当前起点 lll 出发,可走到的区间 [l,r)[l,r)[l,r) 满足 pre[i]<s,i∈[l,r)pre[i]<s,i\in [l,r)pre[i]<s,i∈[l,r);此时 rrr 对应的颜色出现了多次(可走到这样的 rrr 至多 k+1k+1k+1 个),需要维护价值的最大值,然后再从 r+1r+1r+1原创 2022-04-14 10:21:17 · 190 阅读 · 0 评论 -
BZOJ 3451 点分治 + NTT
题意传送门 BZOJ 3451 Tyvj1953 Normal 题解若 vvv 取为分治中心时,uuu 与 vvv 连通,则 uuu 贡献为 111。u,vu,vu,v 再 vvv 取为分治中心时连通的条件为 u,vu,vu,v 路径上任意节点都未被选取为分支中心,不属于路径上的节点对于这个概率没有影响,则概率等价于 u,vu,vu,v 路径上的点中,vvv 被首先选取的概率,其等于 1/(dist(u,v)+1)1/\Big(dist(u,v) + 1\Big)1/(dist(u,v)+1)总贡献原创 2022-04-07 12:56:03 · 269 阅读 · 0 评论 -
计蒜客 A1617 Hall 定理 + 尺取法 + 线段树
题意传送门 计蒜客 A1617 LOVER II题解先不考虑区间查询。对于 bbb 与 aaa,令其升序排序。令 c[i]c[i]c[i] 等于满足 a[i]+b[j]≥ka[i] + b[j] \geq ka[i]+b[j]≥k 的 jjj 的数量。c[i]c[i]c[i] 单调不减,且满足条件的 jjj 是 aaa 的后缀。满足条件当且仅当 c[i]≥ic[i]\geq ic[i]≥i。可以通过 Hall 定理证明,满足上述条件时存在 aaa 的完备匹配。对于 bbb,若 lll 增加,满足条件原创 2022-04-02 16:58:12 · 1130 阅读 · 0 评论 -
Codeforces 1373G Hall 定理 + 线段树
题意传送门 Codeforces 1373G Pawns题解棋子 (x,y)(x,y)(x,y) 能安排在 y≤∣k−y∣+xy\leq \lvert k-y\rvert + xy≤∣k−y∣+x 的位置。令 f(j)f(j)f(j) 代表 i≥ji\geq ji≥j 必须安排的棋子数量,那么对于合法的最大行号 ttt,应该满足 f(j)≤t−j+1f(j)\leq t - j + 1f(j)≤t−j+1。根据 Hall 定理,将 f(j)f(j)f(j) 看作二分图需要构造完备匹配的一侧点集(显然原创 2022-04-01 22:58:06 · 490 阅读 · 0 评论 -
Codeforces 338E 线段树
题意传送门 Codeforces 338E Optimize!题解对于每一个 j(1≤j≤n−len+1)j(1\leq j\leq n-len+1)j(1≤j≤n−len+1),求是否存在一个次序使 a[j+i]=b[i],1≤i≤lena[j+i] = b[i],1\leq i\leq lena[j+i]=b[i],1≤i≤len。对于 lenlenlen 长的 bbb 与 aaa 的子数组,令其升序排序。令 c[i]c[i]c[i] 等于满足 b[i]+a[j]≥hb[i] + a[j] \g原创 2022-04-01 18:02:29 · 521 阅读 · 0 评论 -
Ural 1560 牛顿恒等式 + 线段树
题意传送门 Ural 1560 Elementary Symmetric Functions题解根据牛顿恒等式∑i=1kSibk−i+k×bk=0,k∈N+\sum\limits_{i=1}^{k} S_ib_{k-i} + k\times b_k = 0, k\in N^+i=1∑kSibk−i+k×bk=0,k∈N+ 其中 Sk=∑l≤i≤raikS_k = \sum_{l\leq i\leq r} a_i^kSk=∑l≤i≤raik,且 bk=(−1)kfkb_k = (-1)^原创 2022-03-31 19:40:36 · 621 阅读 · 0 评论 -
P3588 [POI2015] 线段树优化建图 + 差分约束系统
题意传送门 P3588 [POI2015] PUS题解若 ai>aja_i>a_jai>aj,则有 ai−1≥aja_i-1\geq a_jai−1≥aj,转化为差分约束系统。对于这样的关系,从 aia_iai 向 aja_jaj 连一条权值为 −1-1−1 的边。对于已知值的情况,最坏情况下连边数为 O(n2)O(n^2)O(n2),可以通过建立虚节点进行优化。具体而言,对于 (u,v,−1)(u,v,-1)(u,v,−1) 对应的边,建立虚节点 ppp,连边变为 (u原创 2022-03-15 22:34:05 · 283 阅读 · 0 评论 -
Codeforces 786B 线段树优化建图 + Dijkstra
题意传送门 Codeforces 786B Legacy题解建两颗线段树 otr,itrotr,itrotr,itr,分别代表出点与入点。首先,对于 [0,n)[0,n)[0,n) 各点,从其入点向出点连一条边权为 000 的边。接着 otrotrotr 上子节点向父节点连一条边权为 000 的边, itritritr 上父节点向子节点连一条边权为 000 的边。对于各个操作,以 v→[l,r]v\rightarrow [l,r]v→[l,r] 为例,从 vvv 在 otrotrotr 上的编号,向原创 2022-03-15 17:30:50 · 357 阅读 · 0 评论 -
Codeforces 1649F 线段树
题意传送门 Codeforces 1649F Serious Business题解枚举第一行的最右侧位置和最后一行的最左侧位置,将表达式分离变量可以得到max0≤i≤j<n{fi+gi+cost(i,j)}\max\limits_{0\leq i\leq j<n}\{f_i+g_i+cost(i,j)\}0≤i≤j<nmax{fi+gi+cost(i,j)} 其中,sumsumsum 为前缀和,cost(i,j)cost(i,j)cost(i,j) 为打通第二行 [i,j]原创 2022-03-14 21:22:31 · 1727 阅读 · 0 评论 -
Codeforces 741D dsu on tree
题意传送门 Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths题解若某条路径的字符可以构成回文串,则至多一个字符数量为奇数,那么关注字符的奇偶性即可。设字符集的规模为 BBB,对字符集的奇偶性进行状态压缩,满足条件的两个字符集状态异或结果至多存在一个 111。若某个字符集的状态,O(B)O(B)O(B) 即可枚举满足条件的另一个状态。dsu on tree 维护子树中各个节点字符集状态对应的最大深度,统原创 2022-03-13 18:01:43 · 1122 阅读 · 0 评论 -
P5355 [Ynoi2017] 莫队 + bitset + 分块
题意传送门 P5355 [Ynoi2017] 由乃的玉米田题解std::bitset 配合莫队维护区间元素集合。减法操作 a−b=xa-b=xa−b=x,对于 bbb,判断是否存在 a=x+ba=x+ba=x+b;加法操作 a+b=xa+b=xa+b=x,对于 bbb,判断是否存在 a+105−x=105−ba+10^5-x=10^5-ba+105−x=105−b。这两类操作都可以通过 std::bitset 平移后按位与进行求解。乘法操作 ab=xab=xab=x,O(n)O(\sqrt{n})O原创 2022-03-13 16:38:23 · 1099 阅读 · 0 评论 -
P4137 权值线段树 / 回滚莫队
题意传送门 P4137 Rmq Problem / mex题解权值线段树将查询离线,按照右界升序排序后依次处理。权值线段树维护每个元素出现的索引最大的位置,特别的,将 [0,maxn)[0,maxn)[0,maxn) 初始化为 −1-1−1。那么对于查询 [l,r)[l,r)[l,r),答案为索引值小于 lll 的最小值。总时间复杂度 O(nlogn)O(n\log n)O(nlogn)。#include <bits/stdc++.h>using namespace std;#d原创 2022-03-12 21:38:14 · 670 阅读 · 0 评论 -
Codeforces 840D 回滚莫队
题意传送门 Codeforces 840D Destiny题解区间中严格大于 (r−l+1)/k(r-l+1)/k(r−l+1)/k 的数不超过 k−1k-1k−1 个,维护区间最大的 k−1k-1k−1 个数即可。区间新增元素可以 O(k)O(k)O(k) 地维护最大的 k−1k-1k−1 个数,删除操作可能要使用基于值域维护的数据结构,效率不如新增操作。应用不带删除的回滚莫队即可,总时间复杂度 O(knn)O(kn\sqrt{n})O(knn)。#include <bits/stdc++原创 2022-03-11 20:37:20 · 605 阅读 · 0 评论 -
Codeforces 786C 分块 + 二分 / 可持久化线段树
题意传送门 Codeforces 786C Till I Collapse题解朴素的做法是从左边界开始贪心地取元素,直到当前维护的区间颜色数量大于 kkk,则新增一个区间。总时间复杂度 O(n2)O(n^2)O(n2)。分块 + 二分若区间颜色的最大数量为 kkk,则区间数的上界为 n/kn/kn/k,当 kkk 较大时,存在多个连续的 kkk 满足区间数相同,此时可以二分求解。设边界值为 ttt,则 k<tk<tk<t 时朴素的求解,反之二分答案,总时间复杂度 O(tn+n2/原创 2022-03-11 20:16:54 · 533 阅读 · 0 评论 -
P4688 [Ynoi2016] 莫队 + bitset
题意传送门 P4688 [Ynoi2016] 掉进兔子洞题解std::bitset 维护区间元素,由于需要统计相同值的元素出现的个数,离散化时不做去重处理,那么有序数组的相邻元素 ai,ai+1a_i,a_{i+1}ai,ai+1 的最小索引之间的距离(同时也是离散化的值之间的距离)为 aia_iai 在数组中出现的个数,那么对于 cnt[ai]cnt[a_i]cnt[ai] 个 aia_iai,只需要将 std::bitset 的 [ai,ai+cnt[ai])[a_i,a_i+cnt[a原创 2022-03-09 10:54:49 · 314 阅读 · 0 评论 -
Codeforces 1642F bitset / Trie
题意传送门 Coodeforces 1642F Two Arrays题解bitset将数组按照 www 升序排序。std::bitset 维护存在值 ai,ja_{i,j}ai,j 的数组 iii 的集合。枚举数组,O(m)O(m)O(m) 处理出与其存在相同元素的数组集合。时空复杂度均为 O(n2m/32)O(n^2m/32)O(n2m/32)。可以通过将包含较少元素的集合暴力处理,较多元素的集合用 std::bitset 维护的方法,降低空间开销。#include <bits/stdc原创 2022-03-01 20:28:22 · 308 阅读 · 0 评论 -
Codeforces 1642E 线段树
题意传送门 Codeforces 1642E Anonymity Is Important题解对于 t=0t=0t=0 的询问,若 x=0x=0x=0,则区间内所有人的状态是确定的,即都没有生病。使用 std::set 维护状态仍不确定的人的集合,通过二分求 [l,r][l,r][l,r],就可以 O(logn)O(\log n)O(logn) 将明确状态为没有生病的人从集合中删除。若存在一个 x=1x=1x=1 的区间 [l,r][l,r][l,r],满足 l≤i≤rl\leq i\leq rl原创 2022-02-27 22:33:47 · 702 阅读 · 0 评论 -
Codeforces Round #772 (Div. 2)
传送门Codeforces Round #772 (Div. 2)A按位考虑,若存在第 kkk 位为 111 的元素,则可以用这个元素将其余元素的第 kkk 位变为 000;为满足操作的约束,存在 111 的每个数位至少需要保留一个元素。故最小和为所有元素的按位或。总时间复杂度 O(n)O(n)O(n)。#include <bits/stdc++.h>using namespace std;#define pb push_backtypedef long long ll;cons原创 2022-02-23 16:56:31 · 243 阅读 · 0 评论 -
LeeCode 472 Trie + DP
题意传送门 LeeCode 472 连接词题解令单词数量为 nnn,单词长度为 mmm。dp[i]dp[i]dp[i] 代表单词 sss 从位置 iii 到结尾处,能否由至少一个较短单词构成,边界条件 dp[m]=1dp[m]=1dp[m]=1。可以通过建 TrieTrieTrie,O(m)O(m)O(m) 枚举以 s[i]s[i]s[i] 为开头的较短单词,记忆化求解。总时间复杂度 O(nm2)O(nm^2)O(nm2)。bool cmp() class Solution{ const原创 2022-01-14 19:50:11 · 232 阅读 · 0 评论 -
P6018 [Ynoi2010] Trie
题解传送门 P6018 [Ynoi2010] Fusion tree题解将无向图处理为有根树。对任一节点 uuu,使用 TrieTrieTrie 维护 child[u]child[u]child[u] 的异或和,那么查询的时额外查询一次 parent[u]parent[u]parent[u] 即可。为方便处理,TrieTrieTrie 由低位向高位维护数字。对于操作一,直接修改 parent[u]parent[u]parent[u] 以及 parent[parent[u]]parent[parent原创 2021-12-19 20:01:55 · 286 阅读 · 0 评论 -
P5677 [GZOI2017] BIT
题意传送门 P5677 [GZOI2017]配对统计题解AAA 中元素各不相同,那么将其排序后,对任一位置 iii,满足条件的 jjj 只可能出现在 i−1,i+1i-1,i+1i−1,i+1,此时得到 O(N)O(N)O(N) 组好的配对 (i,j)(i,j)(i,j)。问题转化为已知多组二元组的条件下,查询某个区间包含多少个二元组。二元组 (i,j)(i,j)(i,j) 对查询区间 (l,r)(l,r)(l,r) 有贡献,仅当 l≤i,j≤rl\leq i,j\leq rl≤i,j≤r。对于这类原创 2021-11-27 19:39:31 · 215 阅读 · 0 评论 -
Codeforces 1535E 树上倍增 + 贪心
题意传送门 Codeforces 1535E old Transfer题解节点 uuu 的单位黄金花费严格大于祖先节点。那么根据贪心策略,对任意花费最小的购买,一定从祖先节点开始。问题转化为如何高效求解任一节点至根节点路径上剩余黄金数量非零且深度最小的节点。参考倍增 LCALCALCA 的思路,预处理出节点 uuu 的 2k2^k2k 辈祖先,即可 O(logq)O(\log q)O(logq) 求出这样的节点。总时间复杂度 O(qlogq)O(q\log q)O(qlogq)。#includ原创 2021-09-25 08:54:55 · 103 阅读 · 0 评论 -
Codeforces 343D dsu on tree + 权值线段树
题意传送门 Codeforces 343D题解离线处理。将操作按照时间顺序编号为 [0,Q)[0,Q)[0,Q),那么对于编号为 iii 的查询操作,只需关注父节点中区间 [0,i)[0,i)[0,i) 编号最大的灌水操作,与子节点中区间 [0,i)[0,i)[0,i) 编号最大的抽水操作,编号最大的即查询的结果。那么开两颗权值线段树分别维护父节点与子节点信息。应用 dsu on treedsu\ on\ treedsu on tree,统计子节点信息,同时在原创 2021-09-09 23:29:54 · 114 阅读 · 0 评论 -
P6834 [Cnoi2020] BIT
题意传送门 P6834 [Cnoi2020]梦原题解考虑已知树的形状,所需魔法的最少次数;即使用最少的各节点权值为 111 的连通块,使各连通块点权求和后,满足树上任一节点 iii 点权为 AiA_iAi。先考虑在链上的情况,答案为 ∑max(0,Ai+1−Ai)\sum\max(0,A_{i+1}-A_{i})∑max(0,Ai+1−Ai)。容易证明,若后继节点 i+1i+1i+1 与当前节点 iii 差分为正,则 i+1i+1i+1 需要叠加 Ai+1−AiA_{i+1}-A_iAi+1原创 2021-09-06 10:03:57 · 93 阅读 · 0 评论 -
P6588『JROI-1』线段树
题意传送门 P6588『JROI-1』向量题解考虑相邻区间 A,BA,BA,B,尝试求解满足 i∈A,j∈Bi\in A,j\in Bi∈A,j∈B 的贡献∑i∑jai⃗⊕aj⃗=∑i∑j(xiyj−xjyi)=∑ixi∑jyj−∑iyi∑jxj\sum_i\sum_j \vec{a_i}\oplus \vec{a_j}=\sum_i\sum_j(x_iy_j-x_jy_i)=\sum_i x_i\sum_j y_j-\sum_i y_i\sum_j x_ji∑j∑ai⊕aj=i∑j∑原创 2021-09-03 22:41:49 · 264 阅读 · 0 评论 -
P6843 [BalticOI 2015] DFS
题意传送门 P6843 [BalticOI 2015]File Paths题解将’/'看作目录或文件的前缀,与之相连;从上层目录向其放置的目录或文件连一条边,边代表子节点对应的字符串,那么得到一颗 TrieTrieTrie;仅考虑长度,那么得到一个树形 DAGDAGDAG。问题转化为在一个树形 DAGDAGDAG 中添加至多一条端点非叶子节点的边,求能否找到一条从根节点到各叶子节点的路径,使之权值和为 KKK。考虑’/’,使 SSS 增一。设 ds[u]ds[u]ds[u] 为 root→uroot原创 2021-09-02 23:13:02 · 191 阅读 · 0 评论 -
P6856「EZEC-4.5」线段树
题意传送门 P6856「EZEC-4.5」子序列题解先考虑没有子序列 px−p1≤kp_x - p_1 \leq kpx−p1≤k 限制的情况。则所有的子序列与 NNN 个元素可构成的子集一一对应。设 A,BA,BA,B 为两个不相交区间的元素构成的非空集合,a,ba,ba,b 代表对应的非空子集,则有∑a∈A,b∈B(∑a+bsi×∏a+bsi)=∑a∈A,b∈B[(∑asi+∑bsi)×(∏asi∏bsi)]=∑a∈A(∑asi×∏asi)×∑b∈B(∏bsi)+∑b∈B(∑bsi×∏bsi原创 2021-08-31 20:55:29 · 161 阅读 · 0 评论