随笔分类 - 专题学习
反悔贪心
摘要:一直搞不明白这东西自身的正确性。我更愿意将其理解为模拟费用流或者某种dp优化,事实上证明正确性的时候往往也是这么证的。 基于dp优化的理解 AT_dwango2016qual_e 令 表示 i 时刻在位置 j 的最小代价。 转移: \[dp_{i,j}=min_{k<=j}
区间dp
摘要:最近写了3个区间dp题,感觉还是很妙的。 CCPC2023北京市赛 史莱姆工厂 考虑对于一个序列,最终删除掉的一定是一个子序列,再考虑这个子序列需要满足什么性质: 可以被分成两个长度不大于k的部分 隔出来的每个子序列的最后一次消除的颜色不能是当前消除的这个子序列的颜色。 计
上下界网络流
摘要:代码均使用自这里,特此注明出处。 无源汇上下界可行流 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=1e4+1212; const int N=250; const int inf
带权拟阵交
摘要:带权拟阵交板题 2023HDU多校3 1006 注意带权拟阵交是指在最大交的前提下的最大权值的交。 #include<cstdio> #include<vector> #include<algorithm> #include<bits/stdc++.h> using namespace std; t
贪心构造题目
摘要:CF83C 枚举可能的 种经过的集合方案,算一下到(n,m)的可达性,然后从(1,1)开始贪心即可。 CF1738F 每次找一个度数最大的点,遍历所有出边,如果邻居被遍历过,那么把当前集合加入邻居的集合,否则把邻居加入当前集合。 (这个真的有2400吗) CF1208F 这种只有
对dijkstra算法的再思考
摘要:这篇文章的起因是这道题。本题的题解中提到了广义dij这个东西。我个人的理解是dij只是一个模板,只要能完成其中的关键性质,那么跑的东西可以不是最短路。 考虑最短路dij的正确性到底是基于什么的:在每次把dis最小的点加入当前集合时,我们可以断言这个点不会再被其他点松弛。在最短路中这一点很好证明:其他
一些值得记录的小tips
摘要:multiset 的erase如果喂val会将指定val的所有元素删掉,如果只想删一个那么是 S_of_dp.erase(S_of_dp.find(x));。 如果不确定操作的合法性: auto it=SET.find('b'); if(it!=SET.end()) SET.erase(it); X
PAM+回文串border理论
摘要:PAM板子 #include <bits/stdc++.h> using namespace std; const int maxn = 300000 + 5; namespace pam { int sz, tot, last; int cnt[maxn], ch[maxn][26], len[m
计数题目总结
摘要:## [WC2019 数树](https://www.cnblogs.com/thedreammaker/p/13160328.html) ## [P4463 国家集训队 calc](https://www.cnblogs.com/thedreammaker/p/11160829.html)
字符串题目总结
摘要:cmdoi2019 口头禅 广义后缀自动机串定位 #include<bits/stdc++.h> using namespace std; const int L=3e5+5; struct yuansu { int ch[26]; int len,fa,self_ch,val; yuansu()
tarjan/2-sat
摘要:tarjan求割点板子 ```cpp #include #define min(x, y) ((x) (y) ? (x) : (y)) #define Fanv(x) for(int i=edge::sum[x-1]+1,now_v=edge::e[i].y;i'9'||ch='0') { x=x*
最小生成树
摘要:这个东西实现难度不大,就不单独打模板了。 主要是总结一下算法流程和各个算法的正确性。 kruskal:边权升序排序,每次并查集判联通,不连通则将当前边加入边集。 正确性:假设这样得出的不是最小生成树,设第一次和真正的最小生成树有偏差是在从小到大的第i条边,那么对于真正的最小生成树,一定在之后的某一条
单源最短路径
摘要:封装了dijkstra和johnson的板子 dijkstra(johnson明天更): ```cpp #include #define min(x, y) ((x) (y) ? (x) : (y)) #define Fanv(x) for(int i=edge::sum[x-1]+1,now_v=
关于二维二项式反演的正确性
摘要:前言 我第一次看到这个idea是神 去年6月份的时候出了一套题目,里面用到了这个东西,不过他当时没有给出证明。后来看到了 在 上发的计数合集,里面证明了这玩意儿的正确性,我个人认为还是一个非常妙的东西,所以专门开个坑记录一下。 柿子 \[
关于凸函数的一个等价形式的应用
摘要:UPD on 2021/2/10 : 想到可能因为年代过于久远,2014年集训队论文中的一个小结论要找的话稍微有点麻烦,这里直接挂出来算了。 前置芝士: \[ 上凸函数 \Leftrightarrow \forall x_{1},x_{2} \in 定义域,f(\frac{x_{1}+x_{2}}{
浅谈一类转移带有数据结构操作特征的DP的优化
摘要:前言 有一类DP的转移是带有数据结构特征的,针对这一点,我们可以使用合适的数据结构来优化转移。 可能这么干说着不好理解,下面会给出两道题目来详细说明。 例子 1.【arc073f】Many Moves 题目大意: 你有两个整数 和 。 现在 个操作,依次执行,每次
DP专题
摘要:## UNR #2 积劳成疾 dp 把贡献剥离为每个数的每个数作为区间最大的次数次方的乘积。 考虑一个比较经典的套路,对于一个值域全部为[1,i-1]的序列,枚举第一个插入i的位置,那么,包含i的区间个数可以计算(已知左边数的个数和右边数的个数),就y有了这个dp柿子: 是任意一个割,那么f的值不超过割CUT(S,T)的容量。(任意割容量>=任意流流量) 感性理解,一个割上的边(包括正向边和反向边),f最接近割的容量的时候就是割上的所有边都是正向边,且全部跑满,