![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集训总结
文章平均质量分 93
(๑´•﹃•`๑)
♪♫风雨同周♪♬♪深情不移♫♪
展开
-
集合幂级数
定义形如∑i=02n−1aixi\sum_{i=0}^{2^n-1}a_ix^i∑i=02n−1aixi,其中 iii 是一个二进制数,表示 {1,2,...,n}\{1,2,...,n\}{1,2,...,n} 的一个子集。基本操作高维前缀和即要求:ci=∑j[j∨i=i]ajc_i=\sum_j[j∨i=i]a_jci=∑j[j∨i=i]aj先考虑一维前缀和:for(int i=1;i<=n;i++) a[i]+=a[i-1];然后考虑二维前缀和:for(int i原创 2021-08-08 21:37:01 · 302 阅读 · 0 评论 -
网络流&二分图匹配
网络流最大流问题简述:有一个有向图,存在源点 SSS 和汇点 TTT,每条边有一个流量,求从 SSS 到 TTT 最多能经过多少流量。例如,在下图中:最大流为4。最小割割:表示一个切面或切线,将网络分为分别包含源点和汇点的两个子集,该切线或切面与网络相交的边的集合,称为图像的割。最小割:网络的所有割中,边权值和最小的割。具体解释还可以参考百度百科。显然的,最大流=最小割。Ford-Fulkerson算法基本思想:这是一种贪心思想,只要存在从源点到汇点的路径,我们就沿着其中一个扩充原创 2021-08-02 20:58:50 · 267 阅读 · 0 评论 -
拓扑排序&2/3-SAT
拓扑排序概念:一个有向图的点的序列,满足对于任意一条条边 u→vu\to vu→v,都有 uuu 在序列中的位置在 vvv 之前。例如,在下图中,有合法的序列:1,2,3,41,2,3,41,2,3,4 或 1,3,2,41,3,2,41,3,2,4。其中,有环图一定没有拓扑序。在有向图中,每次选一个入度为0的点,将其加入拓扑序的末尾,再在原图中删除这个点及其所以出边。伪代码如下:add(x,y):...deg[y]++;for(i...n) if(!deg[i]) q.push(i);原创 2021-08-01 18:53:05 · 176 阅读 · 0 评论 -
强连通&边双&点双
强连通定义给定有向图 G=(V,E)G=(V,E)G=(V,E)。对于 u,v∈Vu,v\in Vu,v∈V,若 GGG 中同时存在 uuu 到 vvv 的路径和 vvv 到 uuu 的路径,则称 uuu 和 vvv 强连通 (strongly connected)\text{(strongly connected)}(strongly connected)。如果对于任意的 u,v∈Vu, v\in Vu,v∈V 都有 uuu 和 vvv 强连通,则称有向图 GGG 为强连通图。原创 2021-07-31 20:59:50 · 190 阅读 · 0 评论 -
后缀自动机ヾ(*////▽////*)ゞ
后缀自动机在后缀自动机之前还需要一些前置知识。End pos 集合即结束的位置集合,简称EpEpEp 集合,代表一个子串在原串中出现的右端点。例如在下面这个字符串:ZHOUSHENNISHISHENMEJUESHIDABAOBEI这些加粗的SHSHSH的右端点的位置分别是6,12,15,246,12,15,246,12,15,24,那么在这个字符串里,SHSHSH的EpEpEp 集合就是{6,12,15,24}\{6,12,15,24\}{6,12,15,24}。EpEpEp 相同的子串叫一原创 2021-07-28 19:56:36 · 156 阅读 · 0 评论 -
后缀数组(๑Ő௰Ő๑)ノ“
后缀数组与LCP后缀数组首先,将一个字符串的所有后缀按字典序排序。后缀数组 sa[i]sa[i]sa[i]:表示所有后缀在排完序后,排名为 iii 的后缀在原串中的位置。名次数组 rank[i]rank[i]rank[i]:表示所有后缀在排序完后,原字符串中第 iii 名现在的排名。显然,sasasa 与 rankrankrank 是互逆的,即rank[sa[i]]=i,sa[rank[i]]=i;rank[sa[i]]=i,sa[rank[i]]=i;rank[sa[i]]=i,sa[rank.原创 2021-07-27 20:07:22 · 96 阅读 · 0 评论 -
可持久化数据结构ヾ(◍´꒳`◍)ノ゙
可持久化数据结构即可以持久化的数据结构,维护所有历史版本。可持久化线段树(主席树)维护每个节点的左右儿子和权值。每一次修改时对于每个访问的点建立一个新节点,将这个节点修改后的权值和左右儿子填入新店内(本身权值不变)CODEvoid update(int pre,int &t,int l,int r,int pos){ t=++cnt; ls[t]=ls[pre]; rs[t]=rs[pre]; sum[t]=sum[pre]+1; if(l==r) return; int m原创 2021-07-26 19:04:41 · 123 阅读 · 0 评论 -
简单平衡树 (ノ`д´)ノ ミ ∵.: ┻━┻:·
不简单平衡树Splay算法旋转操作旋转过程如下图所示:右旋 & 左旋代码如下:bool get(int x) { return son[f[x]][1]==x;}void update(int x) { if(x){ siz[x]=cou[x]; if(son[x][0])siz[x]+=siz[son[x][0]]; if(son[x][1])siz[x]+=siz[son[x][1]]; }}void rotate(int x) { int old=f原创 2021-07-25 19:28:02 · 138 阅读 · 0 评论 -
分治ヾ(◍^▽^◍)ノ゙
普通分治思想:分成两个部分分别处理,然后合并答案朋友一张无向图,每次询问a到b不经过c的最短路。n<=200,Q<=1e5Floyd,不支持删点,可用分治加点模拟删点。复杂度O(n3logn)O(n^3\log n)O(n3logn)[ZJOI2016] 旅行者给定一个网络图和若干组询问,每次询问两点间最短路。n*m<=2e4,q<=1e5沿着长边从中间切成两半,是起点和终点在边的两边,将边上的点跑一边dijkstradijkstradijkstr原创 2021-07-24 18:58:04 · 265 阅读 · 0 评论 -
基础字符串(⊙x⊙;)
字符串Hash每个字符对于一个ASCII码,即可用一个数字表示将字符串转换为一个p进制数(常取p=131)hash代码如下:const int p=131;const int mod=99999991;int Hash(string s){ int hash=0; for(int i=0;i<strlen(s);i++) hash=(hash*p+s[i])%mod; return hash;}但单Hash仍比较容易发生冲突,所以可维护字符串长度来降低冲突。STL_has原创 2021-07-22 18:31:42 · 244 阅读 · 0 评论 -
数据结构day1
DAY1RMQRMQ即为Range Maximun/Minimum Query,范围内的区间最大/小值查询,可用线段树,树状数组,ST表等方法解决倍增ST表实现ST表算法是一种倍增的方式如下专门介绍快速幂预处理出a,a2,a4,a8...a,a^2,a^4,a^8...a,a2,a4,a8...考虑二进制,将aba^bab转换成一些数的乘积显然,若f[i]=a2if[i]=a^{2^i}f[i]=a2i,则f[i]=f[i−1]∗f[i−1]f[i]=f[i-1]*f[i-1]f[i.原创 2021-07-22 00:22:38 · 89 阅读 · 1 评论