09 2021 档案
摘要:斯坦纳树 定义: 最小斯坦纳树,就是花费最少的代价,联通给定的 \(k\) 个关键点。 感觉有点像迪杰斯特拉,但是又不太一样。 引入: 用一道例题引入: [模板] 最小斯坦纳树 参考:ix35题解 这个问题可以用 状压 \(DP\) 来解决,发现一个结论: 答案的子图一定是树 证明:如果答案存在环,
阅读全文
摘要:[ZJOI2015]幻想乡战略游戏 题意: 给定一个树,每个节点上有 \(a_i\) 个人,每条边有长度。 现在设定一个节点,每个人都要到这个节点,消耗人数 \(*\) 距离的价值。 给定 \(Q\) 个询问,每个询问可以增加/减少一个点上的人。 问你每次消耗价值的最小值。 分析: 这题虽然看起来像
阅读全文
摘要:\(dsu on tree\) 定义: 这里简称 \(dsu\) 好了。 这个主要是用来解决一类树上询问问题,一般有两个特征: 只有对子树的询问 没有修改 这时候就可以用 \(dsu\) 了。 可能特征 \(1\) 不显然,题目中不明确问你子树 \(i\) 的答案,需要把问题转化后算子树 \(i\)
阅读全文
摘要:树的重心 分析: 就是在深搜的时候记录这个点的两边子节点的最大值 如果小于等于这个树上的点的数量的一半,就是重心。 代码长这样: void dfs1(int x,int fa){ sizes[x]=wei[x]=1; for(int i=head[x];i;i=nxt[i]){ int y=ver[
阅读全文
摘要:\(ST\) 表 引入: \(ST\) 表是用于解决可重复贡献问题的数据结构。 可重复贡献问题 是指对于运算 \(opt\) ,满足 \(x opt x=x\) ,则对应的区间询问就是一个可重复贡献问题。 例如,最大值有 \(max(x,x)=x\) ,\(gcd\) 有 \(gcd(x,x)=
阅读全文
摘要:CF911F Tree Destruction 题意: (洛谷上写的中文题意太离谱了) 给定一棵树,要求选择两个节点,并把之间距离添加到答案中,然后删去一个点,再次进行这样的操作.... 进行 \(n-1\) 次后,只剩一个顶点,询问最大答案,并且输出每次选择的两个点和删去的那个点。 分析: 什么情
阅读全文
摘要:斜率优化 \(DP\) 引入: 通过一道题来引入吧: [HNOI2008]玩具装箱 题意: 给你一些物品,每个物品有大小,你可以选择多个背包装这些东西,背包费用由背包中物品大小决定,问你这些物品放进背包中,需要背包制作的总费用最少值。 分析: 这题暴力的 \(dp\) 方程得出来比较简单,记为: \
阅读全文
摘要:动态 \(DP\) 引入: 一般来说,树上 \(DP\) 问题是不做改变的,只用计算一遍就行了。 但是给你说:更改一个点的权值,再去询问你答案。 这时候再算一遍?或者是只处理这个点的父亲部分?但是这样万一成链,那不是时间复杂度又爆了? 所以,我们引入了 动态 \(DP\) 这个概念。 解决问题: 直
阅读全文
摘要:UVA10817 校长的烦恼 Headmaster's Headache 题意: 一开始有一些老师,又来了一些申请者 每个老师能教一个或多个科目 校长想要选择一些申请者以保证每个科目都至少有两名老师能教 同时总共花的钱要最小。 分析: 一眼状压 \(dp\) . 我们考虑压缩科目,设置 \(dp[i
阅读全文
摘要:\(minmax\) 搜索: 定义: 也叫对抗搜索,搜索时同时取最大/最小。 形式: 两人相互博弈,都希望自己的答案更优秀,即: \(A\) 希望自己答案更大,\(B\) 希望 \(A\) 的答案更小。 解决: 在搜索时,我们进行人物的判断: 若当前是 \(A\) ,我们的转移方程中就取 \(max
阅读全文
摘要:P4363 [九省联考2018]一双木棋chess 题意: 两人下棋,要求下棋时上面左面必须全有棋子,否则不能下,双方采用得分最优策略,询问两人得分之差。 分析: 棋盘的状态可以用一个倒着的三角形表示(因为下棋限制条件),同时因为数据范围: 可以用到 轮廓线 \(dp\) 。 设竖着的状态是 \(1
阅读全文
摘要:区间 \(DP\) 定义: 区间类动态规划是线性动态规划的拓展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并有很大关系。 操作: 定义 \(f[i][j]\) 表示将下标位置 \(i\) 到 \(j\) 的所有元素合并能获得的价值的最大值。 \(f[i][j]=max(f
阅读全文
摘要:背包 \(dp\) 定义: 选择一组有每一组的贡献值,有选择的上限,询问贡献值的题目 分类: \(0/1\) 背包: 这里需要注意一下的就是节省一维,需要倒序枚举的 \(O(nw(背包上限))\) 的写法: for(int i=1;i<=n;i++) for(int j=W;j>=w[i];j--)
阅读全文
摘要:CF372C Watching Fireworks is Fun 题意: 城镇中有 \(n\) 个位置,有 \(m\) 个烟花要放。第 \(i\) 个烟花放出的时间记为 \(t_i\) ,放出的位置记为 \(a_i\) 。如果烟花放出的时候,你处在位置 \(x\),那么你将收获 \(b_i-|a_i
阅读全文
摘要:[HEOI2013]Eden 的新背包问题 题意: 多重背包,但是每一个询问会有一种物品不能选,询问最大价值。 分析: 首先进行二进制拆分是肯定的,但是这样直接算肯定不行。 我们回想起来原先 \(dp\) 状态的设定: \(dp[i][j]\) 表示选到第 \(i\) 个物品,背包上限为 \(j\)
阅读全文
摘要:upper/lower_bound 的用法: 这俩都是利用二分查找的方法在一个排好序的数组(可以是各种数据结构,如 \(map\) 之类的)中进行查找的。 数组从小到大: lower_bound(begin,end,num); 找第一个 \(\geq num\) 的数字,返回地址,不存在则返回 \(
阅读全文
摘要:折半搜索 引入: 一般来说,很多元素少的题都可以用暴力搜索直接写。 比如说枚举每个点的使用情况...每个物品的使用....这类问题,时间复杂度为 \(O(2^n)\) 但是,当给定的 \(n\) 变大时,我们应该怎么办,这就引出了折半搜索( \(meet in the middle\) ). 定义:
阅读全文
摘要:最小表示法: 定义: 就是一个字符串的最小表示形式 解决过程: 将原字符串 \(s\) 复制一遍放在串尾 s=s+s; 设 \(i=0\) 指向字符串头,\(j=i+1\)。 int i=0,j=1,len=s.size()/2; 再设一个偏移量 \(k=0\) ,如果 \(s[i+k]==s[j+
阅读全文
摘要:哈希表 引入: 如果我们要存放一堆数据,但是这些数据很大,直接用 \(vis\) 之类的不能忍一下。 而且要求尽量做到 \(O(1)\) 查询 那么就引入了哈希表。 定义: 散列表(又称哈希表,\(Hash Table\))是一种常用数据结构。它按照哈希特征分类存放,能够实现插入 \(O(1)\),
阅读全文
摘要:[CERC2014]Virus synthesis 题意: 初始有一个空串,有以下操作: 串开头或末尾添加一个字符 向前复制,形成回文串 询问要操作成给定的串需要多少次操作。 分析: 首先,我们还是先求出来对应给定的串的后缀自动机。 可以大致推算出来,这种题目一般都是 \(DP\) ,我们设 \(d
阅读全文
摘要:P5685 [JSOI2013]快乐的 JYY 题意: 给定两个字符串,求出两个串公共回文子串的个数。 分析: 还是先建立出 \(A\) 的后缀自动机。 考虑对于一个节点,我们应该记录它表示的回文串以它为后缀的回文串的总的出现次数。 统计以某个节点为后缀的,则总只会记录当前加入的 \(B\) 字符的
阅读全文
摘要:PAM-回文自动机 内容来自Vscoder 解释: 回文自动机是接受一个字符串的所有回文子串的自动机。 定义: 节点: 回文自动机中每个点表示在它的父节点两侧各加上一个儿子字符。 奇根偶根: 由于回文串有奇数长和偶数长两种情况,所以我们的回文自动机会有两种根-奇根和偶根。 偶根的节点编号为 \(0\
阅读全文
摘要:\(Manacher\) 算法 引入: 先看两个字符串: \(abccba\) \(abcdcba\) 显然这两个字符串是回文的,但是两个串的对称中心的特性不同。 第一个串,它的对称中心是两个 \(c\) 中间,但是第二个串,对称中心就是 \(d\). 如果我们这样记录回文串的对称中心,就会复杂(因
阅读全文
摘要:P4052 [JSOI2007]文本生成器 题意: 给定一堆短字符串,再给定 \(m\) 长度的随机字符串(小写字符),求短字符串在随机字符串中出现的次数,对 \(10007\) 取模。 分析: 这种关于字符串出现次数之类的题目,基本上都是 \(AC\) 自动机。 有人说过,\(AC\) 自动机的
阅读全文
摘要:\(AC\) 自动机中的 \(Fail\) 树 引入: 思考一下 \(AC\) 自动机的匹配过程: 从第一个字符开始,每到达一个节点 \(x\) ,就从 \(x\) 开始不断跳 \(fail\) 到根。 期间跳到的节点代表的串都在文本串中出现。 进阶: 既然可以从文本串的每位开始向上跳 \(fail
阅读全文
摘要:P2607 [ZJOI2008]骑士 题意: 上司的舞会增强版 思路: 因为一个骑士有且只有一个最讨厌的人,而且这个骑士不会讨厌自己,即该图中是没有自环的。 利用有向图去维护信息: 我们把 \(x\) 所讨厌的人 \(y\) 设为 \(x\) 的父亲节点,这样每一个人都有且只有一条出边,每个点的出度
阅读全文
摘要:P2279 [HNOI2003]消防局的设立 题目大意: 有一棵树,有一些标记节点可以覆盖距离小于 \(2\) 的点,要求所有点都被覆盖,求这些节点个数最小值。 分析: 进行贪心分析:我们标记一个节点时,如果标记了根节点,那么一定是比叶子节点更加优秀的点。 这个贪心很好证明,画个图就可以了。 我们通
阅读全文
摘要:P4438 [HNOI/AHOI2018]道路 题意: 从叶子节点到根节点,会经过 \(i\) 条烂公路 \(j\) 条烂铁路。 每个叶子节点的贡献为 \(c[i]*(a[i]+i) * (b[i]+j)\) 我们可以翻修 \(n-1\) 条路,求 \(\sum_{叶子节点 i} c[i]*(a[i
阅读全文
摘要:图片来源 扫描线: 使用一条垂直于 \(x\) 轴的直线,从左到右扫描这个图形,例如这样: 只有碰到矩形的左边界或者是右边界时这个线段所扫描到的情况才会改变。 因此,我们可以把所有矩形的入边和出边按 \(x\) 值排序,根据 \(x\) 值从小到大去处理。 用线段树维护扫描到的情况。 如上图: 如果
阅读全文
摘要:线段树进阶:\(pushdown\) 如果我们每进行一次加的操作,就将全部线段树更改一边,时间复杂度会很高。 因此,我们需要进行一个延迟加和的操作。 思路:如果 \([l,r]\) 区间增加 \(a\),在查询时,就可以把 \([l,r]\) 区间标记的增加量推下去就可以直接求值了。 这时候,我们需
阅读全文
摘要:P3780 [SDOI2017]苹果树 题目大意: 给定一个有根树,每个节点有权值 \(v_i\),节点值至多取 \(a_i\) 次,选儿子节点一定要同时选父亲节点一次,取 \(k\) 个节点值。 除此之外,还可以取一条最长链,求最大权值。 思路: 拿到这道题,先转化成理解的形式:树上背包 \(dp
阅读全文
摘要:P3413 SAC#1 - 萌数 解题思路: 我们反着来考虑这道题:如何判断一个数不含回文串。 思考一下,会发现:当一个数的任意一位都不和前两位的数字相同时,这个数就不含回文串 设 \(f[pos][pre][gpre]\) 表示在 \(pos\) 位时前一位是 \(epre\) 前两位是 \(gp
阅读全文
摘要:数位dp 特点: 数据范围贼大 \(O(n)\) 算法绝对不行 看上去很套路,统计各种数在序列中出现的个数或者之类的。 引入: 数位 \(dp\) 解决的是什么问题呢? 一般来说:求出在给定区间中,符合条件 \(f(i)\) 的数 \(i\) 的个数,条件 \(f(i)\) 一般和数的大小没关系,和
阅读全文
摘要:CF1521 C:Nastia and a Hidden Permutation 一个比较容易想的策略是,先找到 \(1\),然后一个个求出剩下的。 如果询问 \(t=2,x=1\),回答就是 \(min(max(1,p_i),max(2,p_j))\)。如果回答 \(≤2\),可以断言 \(p_i
阅读全文
摘要:状压题目详解 P3475 [POI2008]POD-Subdivision of Kingdom 本题是让我们求出来点集合,看数据范围,\(n\leq 26\) 。 我们枚举所有点存在的情况,普通的状压肯定不行( \(26\) 还是挺大的). 我们因此考虑搜索:因为 \((^{26}_{13}) \
阅读全文
摘要:CF1515 A:CF1515A Phoenix and Gold 因为所有数并不相同,所以这个题解决起来很简单,如果前缀和 \(ans=x\) 时,交换前后两个数位置就行了,其他的正常输出。 #include<bits/stdc++.h> using namespace std; int T,n,
阅读全文
摘要:P5675 [GZOI2017]取石子游戏 有两种 \(Alice\) 不胜利的方法: \(SG\) 之和为 \(0\) ,肯定不成功 \(SG\) 之和不为 \(0\) ,选择的堆的石子的个数,一定小于其他石子堆石子个数的异或和。 为什么呢?从二进制考虑:无论从该堆选择多少石子,都无法将异或和变为
阅读全文
摘要:\(SG\) 函数 本文借鉴了自为风月马前卒的博客 基本定理: \(ICG\) 游戏: 游戏两人轮流,并且决策最佳 无法决策时游戏结束,并且在有限步内结束。 同一个状态不能多次表达,且没有平局出现。 游戏者在任意状态做出的决策和自己无关,只与当前状态有关。 满足以上条件就为 \(ICG\) 游戏,属
阅读全文
摘要:博弈论基础介绍: 巴什博弈: 例子: 一堆石子 \(n\) 个,任意取 \([1-m]\) 个,问先手必赢/输。 分析: 分类进行考虑: \([1,m]\) 个,先手必赢。 \(m+1\) 个,先手必输。 \([m+2,2m]\) 先手可以拿走几个,剩下 \(m+1\) 个,先手必胜。 我们发现,面
阅读全文
摘要:CF1517 B: Morning Jogging 我们只需要把前 \(m\) 小的数放在不同的行中,即可得到最小的疲惫总值。 有个小陷阱就是注意写的时候行和列的顺序。 #include<bits/stdc++.h> using namespace std; int T,n,m; const int
阅读全文
摘要:$KMP$专题 [POI2006]OKR-Periods of Words 解题思路: 求成为两倍前缀的前缀长度之和,那么我们就用 \(F(nxt)\) 数组的性质: 前缀 \(i\) 的长度为 \(F[i]\) 的前缀和后缀是相等的 说明,如果有 \(i\) 一个公共后缀长度为 \(j\) ,那么
阅读全文
摘要:P2561 [AHOI2002]黑白瓷砖 题目大意: 一共 \(\frac{n(n+1)}{2}\) 个六边形,组成一个等边形,六边形只有黑白,问有多少种不能通过旋转使其方案相同的染色方案数。 解题思路: 一看到黑白染色和计数,就是置换问题。 明显的 \(burnside\) 定理,一共有 \(6\
阅读全文
摘要:CF1499 A:Domino on Windowsill 对于一个任意 \(2*2\) 的矩形,都是最多放两个。 定义 \(mini=min(k_1,k_2)\) 这时我们发现,无论 \(mini\) 是奇数还是偶数,化简后的 \(ans\) 都是 \(min(k_1,k_2)+(abs(k_1-
阅读全文
摘要:Polya定理 本篇文章并不是详细讲解,而是加深自己的记忆 群: 群的定义: 集合 \(G\) 和作用于集合 \(G\) 的二元计算 \(×\),满足以下 \(4\) 个性质就记为 \((G,×)\)。 封闭性:\(a,b∈G\), \(a × b∈G\) 结合律:$ (a\times b)\tim
阅读全文
摘要:CF1534 A: Colour the Flag 只有两种情况: 在奇数位置上: \((i+j)\%2==1\) 在偶数位置上: \((i+j)\%2==0\) 因此,我们需要判断当前第一次出现的字符在哪种位置上,记录之后,看剩下的字符是否匹配对应的位置,最后输出匹配情况即可。 注意考虑特殊情况。
阅读全文
摘要:CF1528 A: Parsa's Humongous Tree 关于这种树上的计算权值的题基本上都是树形 \(dp\). 我们先证明结论:一个数轴上有两个点,取另一个点 \(a\),点 \(a\) 在这两个点中间任意位置对距离和没有影响,但是在这两个点的左侧/右侧时,偏离的越远,距离之和越大。 这
阅读全文
摘要:CF1530 A: 序列中最大值,输出即可。 #include<bits/stdc++.h> using namespace std; int T; char s[15]; int main(){ cin>>T; while(T--){ scanf("%s",s+1); int len=strlen
阅读全文
摘要:CF1523 A: 分析题意后,可以得到4种情况 字符串位置本来就是1,不变 本身是0,但两边1的距离相等,不变成1. 本身是0,左右两边1距离小于操作次数,就输出1。 其余情况都为0 这样我们就可以前缀和后缀进行计算,同时处理边界情况,就可以解决问题了。 #include<bits/stdc++.
阅读全文