模板
文章平均质量分 63
一些备用模板
荼白777
这个作者很懒,什么都没留下…
展开
-
PAT 1066 AVL树模板
AVL模板原创 2022-09-17 22:46:22 · 210 阅读 · 0 评论 -
双指针模板
核心思路首先打一个O(n2)O(n^2)O(n2)的暴力,然后考虑性质;当i,j具有单调性的时候,那么我们才可以用双指针来优化;例题最长连续不重复子序列传送门题面思路我们用rrr表示右指针,lll表示左指针;假设r向右移动的时候,l向左移动才是最优解;我们维护[l,r]表示当前的最长不重复的子段,那么当l向左移动才是最优解,那么就说明我们之前l指针向右移动是非法的;也就是说我们可以用向左移动的l替换掉当前的l,使得答案最优,那么就是不移动的情况;Code#include <i原创 2022-04-13 21:55:12 · 354 阅读 · 0 评论 -
二分图判定&二分图最大匹配模板
二分图定义可以把所有的点划分成两个集合,集合内部不存在边,集合之间存在边;01染色判定二分图性质一个图是二分图等价于不存在奇数环奇数环是指点的个数是奇数的环,如下图;有一个通俗的解释,奇数个点无法被两种颜色均分;那么我们的做法很简单,如果一个点没有被染色,那么我们将它(记为uuu)染为白色,将与uuu相连的点染成黑色;不断重复这个过程即可,若过程中发现同色相连,那么就产生矛盾了;染色法判二分图题面Code#include <iostream>#include原创 2022-03-31 21:28:53 · 632 阅读 · 0 评论 -
位运算枚举子集模板
位运算枚举子集模板给定n个元素,问这n个元素组成的每一个集合的所有子集;for(int s=0;s<(1<<n);++s){ for(int sub=s;sub;sub=(sub-1)&s){ //do something } }原理是这样的;集合S的任何一个子集,在二进制表示下,必然可以通过若干次-1得到;那按照这个思路,我们的算法流程如下;假设S0 = S,S0为要枚举的子集,S为集合;S0 - 1判断S0是否是S的子集原创 2022-03-27 23:11:39 · 516 阅读 · 0 评论 -
插入、支持删除、查询的MEX数据结构
Mex定义mexmexmex为序列中未出现的最小的非负整数如mex(0,2,1,4,3)=5mex({0,2,1,4,3}) = 5mex(0,2,1,4,3)=5性质只有在添加的数等于当前序列的mex时,mex的值才会变化;添加操作只会使得mex变大;模板struct Mex{ int cnt[N];//cnt(i)表示数字i出现的次数 set<int> st;//记录未出现的数字 multiset<int> mulst;//记录出现过的数原创 2022-01-27 16:25:53 · 695 阅读 · 0 评论 -
Trie树
引入Trie可以高效的存储和查找字符串集合的数据结构原创 2021-11-03 19:46:13 · 79 阅读 · 0 评论 -
KMP模板
思路好久没打KMP了,今天来复习一下;暴力首先我们考虑暴力思路我们设文章为SSS,待匹配串为PPP;枚举SSS的每一位,如果和PPP相同,那么继续;如果不相同,那么PPP从头再继续匹配;时间复杂度为O(n∗m)O(n*m)O(n∗m)KMP假设匹配成功到待匹配串的第kkk位,第k+1k+1k+1位匹配失败;比如abcabxabcabxabcabx,这个xxx匹配失败了,但是我们可以试试ccc;因为ababab是相同的,我们不用回到第一位;Code#include <iostr原创 2021-10-30 17:29:17 · 55 阅读 · 0 评论 -
两种树的直径
树的直径一般有两种说法;注意,每棵树的直径可能不唯一;第一种是树的边权总和最大的路径(有边权的树);另一种是树上经过最多边的路径(无边权的树);第一种题面题目思路权值最大的路径有两种可能;一种是一路走到黑;另一种是取一条路的最大值加另一条路的次大值对于第一种情况,我们直接往下取即可;对于第二种情况,我们相当于要取挂在某个结点上的两条路,也就是要穿过父节点;具体见注释Code#include <iostream>#include <cstdio原创 2021-10-16 15:19:46 · 89 阅读 · 0 评论 -
c++ __int128_t使用
前言有时候写题需要高精度,但是写起来特别麻烦;可以试试尝试用128位的int;编译器的gcc是不支持__int128这种数据类型的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准,IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同。点我试试#include <iostream>using namespace std;typedef __int128_t int128;int read(){ int128 x=原创 2021-10-08 17:23:28 · 7094 阅读 · 4 评论 -
树上差分思想与例题
前言笔者今天遇到一道题目,用到了树上边差分;记录一下个人学习树上差分的思考;引入我们想想数列的差分;比如想给区间[L,R]+C[L,R]+C[L,R]+C,那么是在差分数组b[L]+C,b[R+1]−C差分数组b[L]+C,b[R+1]-C差分数组b[L]+C,b[R+1]−C;也就是只会影响我们想要操作的区间,不会导致其他的数受影响;树上差分&数列差分我个人感觉,树上的差分可以看成从叶子到当前节点的一条链;如下图所示;树上点差分我们定义cnti表示点i被经过的次数cnt_i原创 2021-09-23 22:31:44 · 141 阅读 · 0 评论 -
龟速乘&快速幂
龟速乘其实本质我认为跟快速幂一样,都是利用二进制而已;龟速乘//a*b%pll q_mul(ll a,ll b,ll p){ ll ret = 0; ll base = a; while(b){ if(b&1){ ret+=base; ret%=p; } base+=base; base%=p; b>>=1; }原创 2021-08-16 21:22:42 · 71 阅读 · 0 评论 -
次小生成树
定理思路我们可以先构建出最小生成树;然后枚举边,如果这条边加进去会形成环;那么我们就用这条边替换最小生成树上最大的边;如果这条边与最大的边相等,那么就替换次大的边;试完所有连接会形成环的边以后,我们就得到了次小生成树;dist(i,j)表示点i往上2jdist(i,j)表示点i往上2^jdist(i,j)表示点i往上2j所得到的最大边权dist2(i,j)表示点i往上2jdist2(i,j)表示点i往上2^jdist2(i,j)表示点i往上2j所得到的次大边权使用LCA来询问这个环上除了原创 2021-09-18 17:15:47 · 1364 阅读 · 1 评论 -
ST表模板
题目题意本题就是模板题查询区间最大值Code1(自己处理log2)#include <iostream>#include <cmath>using namespace std;const int N = 2e5+10,M = 20;int f[N][M],n,m,a[N],mylog2[N];void init(){ int now = 0; for(int i=1;i<=N;i<<=1) mylog2[i] = no原创 2021-09-17 20:19:01 · 49 阅读 · 0 评论 -
LCA模板(倍增、tarjan)
#include <iostream>using namespace std;const int N = 1e6+10;struct Edge{ int next,v;}e[N<<2];int head[N];int cnt;int log2[N];int dep[N];int f[N][30];//f(i,j)表示当前点i的2^j个祖先是谁inline void add(int u,int v){ cnt++; e[cnt].next = head[u];原创 2021-03-20 13:06:32 · 122 阅读 · 0 评论 -
二分图匹配(匈牙利算法)
概念匈牙利算法这个算法的过程是这样的;枚举每一个左部点 uuu ,然后枚举该左部点连出的边;对于一个右部点vvv,如果它没有被先前的左部点匹配,那么直接将 uuu 匹配 vvv;否则尝试让 vvv 的之前配对的左部点去匹配其他右部点,如果之前配对的左部点匹配到了其他点,那么将 uuu 匹配 vvv,否则 uuu 失配。我的个人理解二分图最大匹配,就是一群人,喜欢一类东西,然后求最多满足能满足多少人的问题。以下是匈牙利算法的个人理解版本…一个人可以喜欢多样东西 也可以只喜欢一个东西 但是最原创 2021-05-15 17:24:32 · 111 阅读 · 3 评论