
总结
文章平均质量分 69
一些知识的总结
Alex Su (*^▽^*)
清华大学计算机硕士 ACM-ICPC银牌 CCPC银牌 蓝桥杯国一 天梯赛国一 CSP全国前50
展开
-
新模板总结
H. Combination Lock(二分图博弈)这个当时想了很久没什么想法,没想到是一道模板题在一个二分图上,在某个点开始,两个人轮流选边到另一个点选过的点不能再选。谁无法再选就输了这个就是二分图博弈问题结论是当起始点一定在最大匹配中,先手获胜,否则先手必败。注意是一定证明是,如果起始点不在二分图匹配中,那么首先选一条边到一个点,这个点一定是匹配点,否则就有新的匹配边,就不是最大匹配了然后后手选匹配边。先手再选,这时先手依然选到的一定是匹配点,否则就有增广路,也不是最大匹配。原创 2021-12-04 09:43:15 · 140 阅读 · 0 评论 -
网络流建模技巧
网络流的题目主要在于如何建模 总结一下建模技巧主要来源于网络流24题,平时训练遇到的一些网络流题目,《算法竞赛进阶指南》最大流1.能处理1e4 ~ 1e5规模的网络2.最大流=最小割网络的割指割去一些边之后S与T不联通。边容量最小的割称为最小割网络的最大流量=最小割3.Dinic模板#include <bits/stdc++.h>#define _for(i, a, b) for(int i = (a); i <= (b); i++)#define原创 2021-12-03 17:09:38 · 846 阅读 · 0 评论 -
模板(三)
树链剖分#include <bits/stdc++.h>#define l(k) (k << 1)#define r(k) (k << 1 | 1)#define rep(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a, b) for(int i = (a); i <= (b); i++)using namespace std; const int N = 1e5 + 10;原创 2021-09-07 21:28:42 · 113 阅读 · 0 评论 -
新学知识的模板
网络流最大流(Dinic)Dinic可以加入新的边,然后直接在残量网络上跑。不需要重新建图#include <bits/stdc++.h>#define _for(i, a, b) for(int i = (a); i <= (b); i++)#define rep(i, a, b) for(int i = (a); i < (b); i++)using namespace std; typedef long long ll;原创 2021-07-17 09:58:02 · 225 阅读 · 1 评论 -
洛谷 P1939 【模板】矩阵加速(数列)
感觉矩阵乘法真的牛逼关于怎么构造矩阵,可以看这篇博客,自己先不看答案构造一遍看自己哪里不一样,做一遍就差不多会构造了矩阵构造这种矩阵快速可以优化一些比较简单的递推式构造出一个中间矩阵,然后先做中间矩阵的快速幂然后乘上初始矩阵就好了#include<cstdio>#include<cstring>#define REP(i, a, b) for(...原创 2018-09-22 16:19:21 · 146 阅读 · 0 评论 -
KMP算法题集
模板caioj 1177 KMP模板#include<bits/stdc++.h>#define REP(i, a, b) for(register int i = (a); i < (b); i++)#define _for(i, a, b) for(register int i = (a); i <= (b); i++)using namespace s...原创 2018-10-07 21:44:35 · 1269 阅读 · 0 评论 -
网络流最大流模板
EK算法 #include<cstdio>#include<vector>#include<cstring>#include<algorithm>#include<queue>#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespac...原创 2018-05-26 11:40:55 · 199 阅读 · 0 评论 -
下标中的加1减1问题
在平时写程序中,那些下标加1减1问题我总是纠结很久,现在总结一下(1)对称问题下标从0开始,是#include<cstdio>#define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using nam...原创 2018-09-24 09:19:21 · 823 阅读 · 0 评论 -
caioj 1069 动态规划入门(二维一边推2:顺序对齐)(最长公共子序列拓展总结)
caioj 1068是最长公共子序列裸体,秒过, 就不写博客了caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽 (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符 (2)初始化问题。 一般设f[i][j]为第一个字符前i个,第二个字符前j个的最优价值 f[0][0] = 0 ...原创 2018-08-21 18:58:06 · 5092 阅读 · 0 评论 -
51nod 1079 中国剩余定理模板
中国剩余定理就是同余方程组除数为质数的特殊情况我直接用同余方程组解了。记得exgcd后x要更新还有先更新b1再更新m1,顺序不能错!!(不然会影响到b1的更新)#include<cstdio>#include<cctype>#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _f...原创 2018-09-17 10:42:59 · 149 阅读 · 0 评论 -
对顶堆总结
大佬总结这个玩意是可以动态维护第k大的值(比如中位数)每次操作logn 我们要维护这两个堆。我们可以以小根堆的堆顶为“分界线”如果大于它,就加入小根堆反之加入大根堆如果两个堆的个数相差超过1,就把多的那个堆的堆顶弹出来,加入另一个堆的堆顶如果要求中位数的话,显然是两个堆中个数多的那一个的堆顶,这很容易理解。 加入的操作是这样priority_queue...原创 2018-10-08 19:32:17 · 3500 阅读 · 0 评论 -
caioj 1204 Catalan数(模板)
题目中对卡特兰数的总结很不错以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背)即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C(n,2n)/(n+1) 注:C(3,5)表示组合数5个数选3个的方案数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1);是不是很简单呀?下面的题也是Catalan数...原创 2018-09-17 10:08:21 · 141 阅读 · 0 评论 -
质数总结
poj 2689要对数据敏感,L和R很大,但是L-R很小。可以在(R - L)loglogR的时间内用筛法筛出所有质数。然后扫一遍就好了。有些细节要注意,有些地方会爆int,0和1不能算进去。#include<cstdio>#include<cstring>#include<vector>#define REP(i, a, b) fo...原创 2018-10-11 18:32:06 · 343 阅读 · 0 评论 -
同余问题题集
青蛙的约会(解不定方程)设走了t步,则第一只青蛙跳了,第二只是则有那么有所以可以列出不定方程 其中t和k为未知数。用拓展欧几里得求解。求完之后判断一下有没有解然后x乘上K /gcd就是真正的解然后b /gcd可以作为模,把x调整成最小正整数解最后注意开long long,数论题大多都要开long long#include<bits/stdc++.h&...原创 2018-10-12 20:29:25 · 2659 阅读 · 0 评论 -
归并排序模板(附求逆序对)
逆序对满足两个条件, i < j 和 ai > aj归并可以求逆序对, 因为是按顺序加入, 所以右区间加入的时候, 左区间的数满足 i < j, 然后左边还没有加入的数肯定比当前的a[q]要大, 应该是按大小加入的, 所以满足ai >aj, 所以这个时候计数器可以加上左区间还没加入数的个数, 即m-p, 注意是左闭右开区间, 所以m-p不用加一。 #inclu...原创 2018-04-23 18:57:22 · 196 阅读 · 0 评论 -
二进制总结(算法竞赛进阶指南)
常用操作最右一位为第0位,从右到左依次为 0, 1, 2, 3…… 取出n的第k位 (n >> k) & 1取出n的第0~k-1位 n & ((1 << k) - 1)n的第k位取反 n ^...原创 2018-09-20 17:20:53 · 1251 阅读 · 0 评论 -
树的直径题集
poj 1985(模板题)先随便找个点dfs一次找到距离最远的点,再从那个点再同样dfs一次,那个点到其他点最长的距离即为树的直径不过这种方法不适用于有负权边#include<cstdio>#include<cmath>#include<algorithm>#include<vector>#include<cstring&...原创 2018-10-02 11:32:52 · 301 阅读 · 0 评论 -
1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
根据最近做的几道树形dp题总结一下规律。(从这篇往前到洛谷 P1352 )这几道题都是在一颗树上,然后要让整棵树的节点或边满足一种状态。然后点可以影响到相邻点的这种状态然后求最小次数那么要从两个维度来设计状态第一个维度(1)以i为根的树的所有节点都满足这种状态(2)以i为根的树的只有i不满足这种状态第二个维度(1)i这个点取(2)i这个点不取所以就会有四种状态,不过最近几...原创 2018-09-02 10:40:33 · 289 阅读 · 0 评论 -
Manacher(最大回文字串)
很好的讲解注意两端的字符要不同,同时数组要开大一些【Manacher】最长回文子串#include<bits/stdc++.h>#define REP(i, a, b) for(register int i = (a); i < (b); i++)#define _for(i, a, b) for(register int i = (a); i <= (b...原创 2018-10-10 17:09:15 · 612 阅读 · 0 评论 -
dfs序题集
dfs序可以维护一个子树内的信息需要记录dfs进的时间以及所有子树都遍历完的时间void dfs(int u, int fa){ L[u] = ++id; for(int i = head[u]; ~i; i = e[i].next) { int v = e[i].to; if(v == fa) continue; dfs(v, u); } R[u] = id;...原创 2018-10-18 18:20:02 · 348 阅读 · 0 评论 -
二分题集
「一本通 1.2 练习 2」扩散显然联通块的个数是随时间越来越少的。所以可以二分时间。经过一波运算,可以得出两点需要联通的时间是(abs(x[i] - x[j]) + abs(y[i] - y[j]) + 1) / 2然后每次用并查集维护一下联通分块就好了。第一次写这种开结构体的并查集,感觉很酷炫。#include<bits/stdc++.h>#defi...原创 2018-10-10 19:21:40 · 498 阅读 · 0 评论 -
二分模板
二分分为二分查找和二分答案。 二分查找。实际上就是一个有序数列中有一个解,然后搜一遍求这个解。而直接for循环暴搜一遍的话时间复杂度是O(n),而用二分查找可以降低时间复杂度,为O(logn);而数组形象化出来的话就是0000010000000(0为无解,1为有解),二分就是要找中间的1,即为唯一解。所以开始l和r设为一定是无解的部分,代码如下。 int search(in...原创 2018-05-26 15:15:47 · 265 阅读 · 0 评论 -
最小表示法
poj 1509不知道为什么用算法竞赛进阶指南上的那个代码交上去会WA#include<cstdio>#include<cstring>#include<algorithm>#define REP(i, a, b) for(register int i = (a); i < (b); i++)#define _for(i, a, b) f...原创 2018-10-07 22:42:30 · 215 阅读 · 0 评论 -
组合数学题集
bzoj 1008逆向思维。一共有m^n种状态我们考虑不越狱的情况第一个人有m种选择,后面的所有人均是m-1种选择那么方案数就是 m^n - m * (m - 1) ^ (n - 1) 快速幂就好其实不难,自己不要怕,心理不要有障碍#include<bits/stdc++.h>#define REP(i, a, b) for(register int i =...原创 2018-10-12 19:56:15 · 1012 阅读 · 0 评论 -
约数总结
bzoj 1053比较经典的一道题。首先要观察出一些结论(1)质数不超过10个。前十个质数相乘已经超过最大值。(2)质数的指数是递减的。如果不是,可以把指数小的和大的交换一下,答案更小。然后就搜索就好了。这是一类数论+搜索的题目,要从题目看出一些剪枝,然后搜索即可。#include<bits/stdc++.h>#define REP(i, a, b) f...原创 2018-10-11 22:51:27 · 221 阅读 · 0 评论 -
HDU3001 Traveling (状压dp+三进制+Tsp问题总结)
(1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么void init(){ three[0] = 1; REP(i, 1, 11) three[i] = three[i-1] * 3; REP(i, 0, three[10]) { int t = i;...原创 2018-09-24 10:44:02 · 193 阅读 · 0 评论 -
最短路模板
(1)无负权边单源最短路 堆优化dijkstra#include<cstdio>#include<vector>#include<queue>#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 11234;stru...原创 2018-05-24 16:56:38 · 131 阅读 · 0 评论 -
拓扑排序模板
bool dfs(int u){ vis[u] = -1; REP(i, 0, g[u].size()) { int v = g[u][i]; if(vis[v] == -1) return false; else if(!vis[v]) dfs(v); } vis[u] = 1; ans[--t] = u; //注意这里倒序加入 return true;}b...原创 2018-06-18 10:08:06 · 118 阅读 · 0 评论 -
caioj 1075 动态规划入门(中链式2:能量项链)(中链式dp总结)
我又总结了一种动归模型……这道题和上一道题很类似,都是给一个序列,然后相邻的元素可以合并然后合并后的元素可以再次合并那么就可以用这两道题类似的方法解决 简单来说就是枚举区间,然后枚举断点加上断点左右两边的值(按照题目,可能不是加),然后在按题目加上计算合并后总的序列的值就这一道题而言f[i][j] = max(f[i][k] + f[k+1][j] + a[i] * a[(...原创 2018-08-21 20:07:24 · 166 阅读 · 0 评论 -
贪心总结
之前的总结区间相关问题NOIP2018提高组金牌训练营——贪心算法专题 #10005. 「一本通 1.1 练习 1」数列极差小的先处理,最后肯定最大大的先处理,最后肯定最小两个优先队列维护即可#include<cstdio>#include<queue>#include<functional>#define REP(i, ...原创 2018-10-04 19:21:01 · 195 阅读 · 0 评论 -
Hash大法
内容参考《算法竞赛进阶指南》之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分。hash涉及内容很多,这里只讨论字符串hash可以把字符串看成一个131进制位数,然后用ull储存,大过2的64次方后自动取模。这样的话hash值相等的话可以认为两个字符串是一样的(极少概率不一样)所以对于一个字符串,我们可以用O(n)的时间内算...原创 2018-10-07 23:06:11 · 569 阅读 · 0 评论 -
洛谷 P3390 【模板】矩阵快速幂
矩阵乘法百度上已经讲得很清楚了https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/5446029?fr=aladdin这个模板题记得全部都要开long long#include<cstdio>#include<cstring>#define REP(i, a, b) for(i...原创 2018-09-22 15:13:43 · 258 阅读 · 0 评论 -
线段树总结
大牛线段树总结,非常棒 模板题洛谷 P3372 【模板】线段树 1#include<cstdio>#define l(k) (k << 1)#define r(k) ((k << 1) + 1)#define REP(i, a, b) for(int i = (a); i < (b); i++)#define _for(i, a,...原创 2018-10-01 20:29:10 · 185 阅读 · 0 评论 -
欧拉回路模板
(1)判断欧拉回路(把所有边走一遍,最后回到起点)无向图的所有点度数为偶数, 且联通有向图的所有点入度=出度, 且联通欧拉道路(把所有边走一遍, 不回到起点)无向图所有点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。同时要联通(忽略方向)有向图所有点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1。同时要联通(忽略方向) (2)输出...原创 2018-06-18 10:23:17 · 230 阅读 · 0 评论 -
LCA题集
点的距离(模板题)树中两点间的距离就是d[u] + d[v] - 2 * d[lca(u, v)]#include<bits/stdc++.h>#define REP(i, a, b) for(register int i = (a); i < (b); i++) #define _for(i, a, b) for(register int i = (a); i &...原创 2018-10-02 09:53:40 · 467 阅读 · 0 评论 -
树状数组总结
非常棒的总结 模板题洛谷 P3374 【模板】树状数组 1单点修改+区间查询#include<cstdio>#include<algorithm>#define REP(i, a, b) for(register int i = (a); i < (b); i++)#define _for(i, a, b) for(register int...原创 2018-09-21 21:27:47 · 239 阅读 · 0 评论 -
快排模板(附求第k大的数)
#include<cstdio>#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 112;int a[MAXN], n;void sort(int l, int r){ if(l >= r) return; int i = l,...原创 2018-04-23 19:02:36 · 242 阅读 · 0 评论 -
区间相关问题(贪心)
摘自紫书第八章突破口一般是区间包含的时候怎么选, 以及怎么排序(1)选择不相交区间问题: 有n个开区间(ai, bi) 选择尽量多的区间, 使这些区间两两没有公共点。 按照b从小到大排序(这种情况a无所谓, 得出结果一样) 一定选第一个区间, 然后, 把所有和区间1相交的区间排除在外, 然后不相交就选下一个, 然后同理。 所以就记录区间编号, 扫一遍就ok。...原创 2018-05-07 17:05:43 · 1544 阅读 · 0 评论 -
读入优化摸板
void read(int& x) //isdigit头文件 cctype{ int f = 1; x = 0; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-1') f = -1; ch = getchar(); } while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = ...原创 2018-09-14 21:03:57 · 94 阅读 · 0 评论 -
倍增算法总结 ( 含RMQ模板)
部分题目来自《算法竞赛设计进阶》 问题 给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigma) 第一反应是二分,这个时候的复杂度是logn 还有第二种解法,用倍增的思想,复杂度为logk(所求答案)。显然倍增要好很多。我讲讲倍增。 如果是暴力的...原创 2018-10-01 08:29:54 · 1844 阅读 · 0 评论