摘要: 虽然没什么特别需要说的,但还是建了这么个东西。 文章都可以在分类和标签中找到!实在找不到还可以站内搜索。 lougu Link 阅读全文
posted @ 2022-02-24 11:59 cbdsopa 阅读(84) 评论(0) 推荐(0)
摘要: 简单的东西就简单说说把,实际上就是一棵树,每条边上有一个字符,然后一个点代表的字符就是根到达它的路径上的字符按遍历顺序组成的字符串。 #include<bits/stdc++.h> using namespace std; int n,m; int edge[500010][26],tot; int 阅读全文
posted @ 2022-02-24 11:53 cbdsopa 阅读(80) 评论(0) 推荐(0)
摘要: 思想:把字符串变成数值比较。 我们选取这个 hash 公式: \[hash(s)=\sum_{i=1}^{len} s_i\times p^{len-i}(mod\ M) \]hash方法 自然溢出hash 我们使用 unsigned long long hash[N]; (\(hash[k]\)) 阅读全文
posted @ 2022-02-24 11:52 cbdsopa 阅读(98) 评论(0) 推荐(0)
摘要: 手动模拟出奇迹 #include<bits/stdc++.h> using namespace std; inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||'9'<ch) {if(ch=='-') f=-1;ch=get 阅读全文
posted @ 2022-02-24 11:52 cbdsopa 阅读(47) 评论(0) 推荐(0)
摘要: AC自动机 其实是trie树的改图。每次状态转移在末尾增添一个字符。 其使用失配指针 \(fail\) 指向自动机中自己的最长后缀,以达到多模匹配的效果。 模板题 代码: 其实也不多说了,就是trie加一个fail指针。 其中fail指针如何求?我们遍历全图,当遍历到一条链的第二个点时,我们在初始状 阅读全文
posted @ 2022-02-24 11:51 cbdsopa 阅读(32) 评论(0) 推荐(0)
摘要: 简单说一下,首先我们类似扩展KMP一样的维护右端点最右的区间。我们直接把当前的点放到这个最右区间内翻转,直接用这个翻转的位置更新回文长度,然后由于不能保证区间外的回文性,于是取个min,具体看代码。 然后为了统一处理奇偶回文,我们在字符直接以及字符串开头结尾添加 # ,代表空。那么对于一个偶数 \( 阅读全文
posted @ 2022-02-24 11:50 cbdsopa 阅读(99) 评论(0) 推荐(0)
摘要: 做了相当一部分的退火题练手,现在才算刚刚入了门。 于是做一个经验总结。 随机函数 有没有觉得 \(rand()\) 莫名的不好用?我们在此为您推荐 \(mt19937!\) 在支持 \(c++14\) 的环境下,可以生成更大的随机数,而且更快,岂不美哉? 实用展示 mt19937 rd_ori(ti 阅读全文
posted @ 2022-02-24 11:49 cbdsopa 阅读(123) 评论(0) 推荐(0)
摘要: 由于算法基于随机,不适宜作为题目正解,但在参数调得好的时候可以得到较高分数甚至AC,用于实在迫于无奈时的算法或暴力算法范围外的骗分算法 典型的邪教算法(我就喜欢邪教的) 基本思想是随机转移,从而确定最优解,大多数用于计算几何(但其实你如果够牛也可以在其他情况下用来骗分) 基本的实现步骤是: 1.取一 阅读全文
posted @ 2022-02-24 11:49 cbdsopa 阅读(56) 评论(0) 推荐(0)
摘要: 随便提几笔吧,时间不太充裕就不写太多了。 就是在区间的基础上再加上一个时间。 来个例题 数颜色|维护队列 直接就是考虑按照 \(l\) 所在块, \(r\) 所在块, \(t\) 的优先级排序,然后可以证明在块长取 \(n^{\frac{2}{3}}\) 时最优,可用最劣情况证明其复杂度。 然后就是 阅读全文
posted @ 2022-02-24 11:48 cbdsopa 阅读(42) 评论(0) 推荐(0)
摘要: 引入 如果你已知一个序列,你已知其 \([2,6]\) 的区间和以及原序列,现在要你求$[2,7]$的区间和,你会怎么办? 显然我们可以在 \([2,6]\) 的基础上加上原序列的第 7 位,就得到了 \([2,7]\) 的区间和。 同理,如果我们需要求出 \([2,5]\) 的区间和,我们只需要在 阅读全文
posted @ 2022-02-24 11:47 cbdsopa 阅读(66) 评论(0) 推荐(0)
摘要: 思想就是分治! 然后就是每次二分区间,然后在分治统计左右区间之后,考虑统计跨越左右区间的数对。 给个模板题 陌上花开。 我们对于这个三维偏序问题,可以考虑CDQ分治。 先对于原序列按照a,b,c排序,这样保证a的单调增。 然后分治,对于每个小区间按照b,a,c排序,这样在右边区间的a大于左边区间的前 阅读全文
posted @ 2022-02-24 11:46 cbdsopa 阅读(40) 评论(0) 推荐(0)
摘要: 概念 中缀表达式 就是我们平时用的式子。 前缀表达式 也叫波兰式,除了处理顺序与后缀表达式相反(从右往左),其他完全一致。 后缀表达式 也叫逆波兰式,从左往右处理,如果扫到数字,就把数字入栈;如果是字符,那么从栈顶取出两个数字进行运算,在将计算结果入栈。最后栈中的元素为结果。 表达式转换 前、后缀转 阅读全文
posted @ 2022-02-24 11:44 cbdsopa 阅读(63) 评论(0) 推荐(0)
摘要: 发现以前都没有真的理解二分边界应该取多少。所以手写lower_bound出了一些锅,于是用了3种不同方式拍了几组数据改了下错,才真正理解了。 先上对拍程序(windows) \(mian.cpp\) #include<bits/stdc++.h> #include<windows.h> using 阅读全文
posted @ 2022-02-24 11:41 cbdsopa 阅读(39) 评论(0) 推荐(0)
摘要: 对拍模板,很好理解,就不多讲了。 #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("data.exe > data.in"); int t=clock(); system("hard.exe < da 阅读全文
posted @ 2022-02-24 11:39 cbdsopa 阅读(55) 评论(0) 推荐(0)
摘要: 我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用。 ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把求 LCA 转换为 RMQ问题。我们对于树求一遍欧拉序,就是那个回溯也会记录的那个。我们处理出每个数 阅读全文
posted @ 2022-02-24 11:37 cbdsopa 阅读(78) 评论(0) 推荐(0)
摘要: 预处理复杂度\(O(n\ log\ n)\),查询复杂度\(O(log\ n)\)。 主要思想是倍增,通过预处理出夫亲的倍增数组实现快速求LCA 1 的父节点取 0 是为了方便树上差分,1 的深度设置得比 0 大是为了防止在求LCA时跳到0. 挺好理解的。 #include<bits/stdc++. 阅读全文
posted @ 2022-02-24 11:36 cbdsopa 阅读(63) 评论(0) 推荐(0)
摘要: 在用树剖解决问题时发现,每次跳链的时候,就有跳到两点LCA的可能。 所以还是有之前树剖的思想,其实和倍增的LCA很像。 优点:常数小,实现很好理解也很好写。预处理复杂度$O(n)$,查询$O(log\ n)$,附带常数小。 感觉比倍增好写,而且还快。 实现如下:(预处理点这里) inline voi 阅读全文
posted @ 2022-02-24 11:36 cbdsopa 阅读(41) 评论(0) 推荐(0)
摘要: #include<bits/stdc++.h> using namespace std; #define N 2010 #define M 200010 #define INF 0x3f3f3f3f inline int read() { int s=0,f=1; char ch=getchar() 阅读全文
posted @ 2022-02-24 11:35 cbdsopa 阅读(153) 评论(0) 推荐(0)
摘要: 不是费用流都需要用 SPFA 吗。 众所周知,SPFA 去世了,然后网络流显然有负边。于是我们可以像 Johnson 全源最短路一样,给边加上势能,具体实现看我之前的 博客 啦。 然后对于每一次跑 Dijkstra ,然后得到最短路,把势能要再加上这个最短路,可以证明这样操作一次图上不会再有负边。 阅读全文
posted @ 2022-02-24 11:34 cbdsopa 阅读(71) 评论(0) 推荐(0)
摘要: 最大流 #include<bits/stdc++.h> using namespace std; #define N 210 #define M 5010 #define INF 0x3f3f3f3f int n,m,S,T; vector<int>head,to,nxt,val; void joi 阅读全文
posted @ 2022-02-24 11:33 cbdsopa 阅读(71) 评论(0) 推荐(0)
摘要: 学这个是为了支持在带负权值的图上跑 Dijkstra. 为了这个我们要考虑把负的权值搞正。 那么先把我们先人已经得到的结论摆出来。我们考虑先用 SPFA 对着一个满足三角形不等式的图跑一次最短路,具体就是在原图的基础上建立超级源点。 然后我们把得到的这个东西称为 势能 $h$ ,我们对于原图的每条边 阅读全文
posted @ 2022-02-24 11:32 cbdsopa 阅读(40) 评论(0) 推荐(0)
摘要: 需要注意树上做最短路是$O(n)$,因为只需要一次dfs SPFA #include<bits/stdc++.h> using namespace std; int n,m,ss; bool vis[500010]; int q[1000010],dis[500010]; vector<int>he 阅读全文
posted @ 2022-02-24 11:31 cbdsopa 阅读(31) 评论(0) 推荐(0)
摘要: 用于解决前置性问题,如选A前需要先选择完B和C,或者求A前需要先求B。 具体来说,每次选择入度为0的点,并为与之有连边的点解锁度数。 vector<int>t; queue<int,vector<int> >q; bool topo() { t.clear(); for(int i=1;i<=n;+ 阅读全文
posted @ 2022-02-24 11:30 cbdsopa 阅读(33) 评论(0) 推荐(0)
摘要: 做一次最短路,并且记录最短路径中通过的边数,若边数 \(\ge n\) 则最短路中出现环,即出现负环。最长路正环同理。 #include<bits/stdc++.h> #define ll long long #define db double #define filein(a) freopen(# 阅读全文
posted @ 2022-02-24 11:29 cbdsopa 阅读(76) 评论(0) 推荐(0)
摘要: #include<bits/stdc++.h> #define ll long long #define db double #define filein(a) freopen(#a".in","r",stdin) #define fileot(a) freopen(#a".out","w",std 阅读全文
posted @ 2022-02-24 11:28 cbdsopa 阅读(32) 评论(0) 推荐(0)
摘要: 闭合图 我们给出闭合图的定义:对于有向图中的点,其相邻的节点全部属于这个有向图,那么这个图就被称为闭合图。 也就是说这个图的终点一定是出度为0的。 最大权闭合子图 就是对于一个有向图,每个点有一个权值,权值属于实数,现在考虑选择一个闭合子图使得这个子图中的点的权值和最大。 我们尚且思考一下,不难发现 阅读全文
posted @ 2022-02-24 11:25 cbdsopa 阅读(64) 评论(0) 推荐(0)
摘要: 平面图 就是放在平面上展开,存在一种画法能够使得图的边与边之间没有交点,这玩意就叫平面图。 一般来说网格图喜欢考这个,提到网格图可以留个心眼。 但是一般来说吧,这个东西要配和着对偶图来使用。 对偶图 就是对于原平面图的每一条边,将与其接壤的两个面在对偶图中连一条边。特殊地,当且仅当对于一条边两边的面 阅读全文
posted @ 2022-02-24 11:22 cbdsopa 阅读(406) 评论(0) 推荐(0)
摘要: 冬令营突然发现的一个比较厉害的东西。 Dancing Links 用于解决覆盖性问题的利器。 两个不同分支,一个精准覆盖问题,一个可重复覆盖问题。 先讲相对基础的精准覆盖问题。 精确覆盖问题 就是说全集由多个集合恰好覆盖,各个集合间无交。 这个问题我们先考虑一个具体一些的问题。 我们用下面的那个 模 阅读全文
posted @ 2022-02-24 11:20 cbdsopa 阅读(53) 评论(0) 推荐(0)
摘要: 本质上大概是搜索优化。我们将bfs使用的队列改为优先队列,并使用结构体存储节点,重载 '<' 小于号。 然后我们提高搜索效率的方法就是通过一个估价函数,评估当前情况与答案情况的差异,然后选取差异最小(或根据题目,并基于个人经验选取能够更快找到答案的情况) 由于优先队列存在复杂度,有时候估价函数写得不 阅读全文
posted @ 2022-02-24 11:18 cbdsopa 阅读(495) 评论(0) 推荐(0)
摘要: 注:\(A*\) 求解K短路效率极其低下,时间复杂度$O(nklog\ n)$,空间视题目而定,因为本质是爆搜,可求解数据范围较小的题目。 我们使用$A*$求解k短路: 首先需要预处理出估价函数。对于原图建立反向图,然后跑终点的单源最短路。用终点到这个点的距离作为$A*$的估价函数,可以完全保证搜索 阅读全文
posted @ 2022-02-24 11:17 cbdsopa 阅读(126) 评论(0) 推荐(0)
摘要: 考模拟赛考到了线段树合并,于是学了树上启发式合并(?) 它相较于线段树合并的优点在于: 空间开销小 无线段树的常数 写法简单易理解 好那么开始进入正题。 首先说一下它的用途,可以用来解决一些子树问题。 具体的做法是先 dfs 预处理,然后像树剖那样剖出重儿子,可以剖出 dfs 序为之后加上一点常数优 阅读全文
posted @ 2022-02-24 11:15 cbdsopa 阅读(60) 评论(0) 推荐(0)
摘要: #include<bits/stdc++.h> using namespace std; #define re register #define MAXN 5010 struct side { int u,v,w; }s[200010]; int fa[MAXN],n,m,ans,cnt,cnt1; 阅读全文
posted @ 2022-02-24 11:14 cbdsopa 阅读(28) 评论(0) 推荐(0)
摘要: 在某些情况下可以和树剖替换。(当然某些情况替代不了,我愿称之为小树剖) 前置知识 倍增求LCA 了解差分思想 (既然要替代树剖怎么可能会用树剖求LCA呢/xyx) 引入 首先我们都知道差分是可以用来通过单点修改维护区间信息的(如单修区查的树状数组),因为我们在前面加上,再在后面减掉,中间这一段是得到 阅读全文
posted @ 2022-02-24 11:13 cbdsopa 阅读(43) 评论(0) 推荐(0)
摘要: 相当于把树上的链抽出来变成区间进行操作。 重链剖分(本文重点): 本文依照P3384 【模板】轻重链剖分/树链剖分的实现进行讲解。 就是剖分出重链覆盖全树。 重链:除开头的端点为轻儿子外,其他节点全为重儿子的链。 重儿子:一个节点的儿子中子树大小最大的儿子。 要进行树链剖分,先要进行预处理。需要处理 阅读全文
posted @ 2022-02-24 11:12 cbdsopa 阅读(45) 评论(0) 推荐(0)
摘要: 用于解决树上路径长问题的算法,复杂度是比较优秀的 \(O(nlogn)\) 直接按照题目来讲。点分治1 我们要维护树上路径长度为 \(k\) 的路径是否存在(当然视题目而定,点分治的操作比较灵活)。这类问题我们选用点分治。 具体怎么操作呢? 一般就是,每次用vis标记删除根节点,然后对于所有没被删除 阅读全文
posted @ 2022-02-24 11:11 cbdsopa 阅读(39) 评论(0) 推荐(0)
摘要: 可以说是带修改的点分治。(当然也可以不带修改,是那种需要多次询问的) 灵活性很强,我们可以维护一些树上点对问题。 话不多说了,直接进入正题。 具体操作 我们考虑对于保存点分治的路径,然后把这些点依次连接起来,点分树就建好啦。(很显然这个只是把树重构,然后保证树高为 \(log\ n\)) 可以发现这 阅读全文
posted @ 2022-02-24 11:10 cbdsopa 阅读(60) 评论(0) 推荐(0)
摘要: Tarjan系列!我愿称Tarjan为爆搜之王! 1.Tarjan求LCA 利用并查集在一遍DFS中可以完成所所有询问。是一种离线算法。 遍历到一个点时,我们先将并查集初始化,再遍历完一个子树之后,将该子树的根的父亲指向当前点。 最后在回溯的时候给询问的答案更新一下,枚举一下 $v\in [1,n] 阅读全文
posted @ 2022-02-24 11:06 cbdsopa 阅读(61) 评论(0) 推荐(0)
摘要: 什么叫分层图最短路,我不会/kk 感觉自己做法和其他题解不大一样所以过来发篇题解了。 未刻意卡常拿下最优解 题目大意 就是说给你一个 \(n \times n\) 的网格图和 \(m\) 个可换乘点,然后你只能在同一行或同一列(如果在行上移动,就不能在列上移动;反之同理)上移动,除非这个点是可以换乘 阅读全文
posted @ 2022-02-24 11:03 cbdsopa 阅读(79) 评论(0) 推荐(0)
摘要: 前言 本蒟蒻重学线段树,发现了这道题可以用线段树做。 虽然数据范围很小可以直接暴力,但由于在练习线段树所以打算用线段树写这道题。 本题解针对已经有线段树基础的巨佬,不懂线段树原理的话可以学习线段树后再阅读本题解。 审题 刚看题的时候以为大概是个线段树模板,结果发现事情并不简单。 题目要求的不是剩下多 阅读全文
posted @ 2022-02-24 10:59 cbdsopa 阅读(192) 评论(0) 推荐(0)
摘要: 当时考场上因为这个炸掉,一年后回来复仇。 这里提供一个与大多数人不一样的做法。 首先考虑一个简单一些的问题,怎么应付单个询问? 不难想到,我们对于一个日期,让他从 \(-4713\) 年 \(1\) 月 \(1\) 日开始,然后一年一年地加,年加不了了加月,月加不了了加日。这样很容易做,具体的细节可 阅读全文
posted @ 2022-02-24 10:58 cbdsopa 阅读(228) 评论(0) 推荐(0)
摘要: 题意简述 \(n\)( \(1≤n≤2×10^5\) )个点,每个点 \(i\) 有一个点权 \(a_i\) ( \(1≤a_i≤2×10^{12}\) ),将两个点 \(i\),\(j\) 直接相连的花费是两个点的点权和 \(a_i+a_j\),并且对于特别的$m$( \(1≤m≤2×10^5\) 阅读全文
posted @ 2022-02-24 10:57 cbdsopa 阅读(41) 评论(0) 推荐(0)
摘要: 可参考资料: 资料1 资料2 实现如下: LL CRT(){ LL num=1,ans=0; for(int i=1;i<=n;++i) num*=a[i]; for(int i=1;i<=n;++i){ LL mum=num/a[i],x,y; exgcd(mum,a[i],x,y); ans=( 阅读全文
posted @ 2022-02-24 10:56 cbdsopa 阅读(32) 评论(0) 推荐(0)
摘要: 前置知识 对于\(N^*=\{\lfloor n/i \rfloor|i\in[1,n]\}\). (1) 满足 \(\lfloor n/i \rfloor = x\in N^*\) 的最大的 \(i\) 为 \(\lfloor n/x \rfloor\). (1)证明: 显然有 \(x\le n/ 阅读全文
posted @ 2022-02-24 10:55 cbdsopa 阅读(62) 评论(0) 推荐(0)
摘要: 狄利克雷卷积 定义:\((f*g)(n)=\sum_{d|n}f(d)g(n/d)\) 很显然满足交换律和结合律。 积性函数 为积性函数的有: \(I (n)\) (或$1(n)$ ),恒等于1,所以叫恒等函数 \(\epsilon (n)\) (或者$e(n)$ ),当且仅当 \(n=1\) 时, 阅读全文
posted @ 2022-02-24 10:54 cbdsopa 阅读(62) 评论(0) 推荐(0)
摘要: 直接给公式,你会发现它直接覆盖了费马小定理。 \(a^b=a^{b\% \varphi(p)},gcd(a,p)=1\ (mod\ p)\) \(=a^b,gcd(a,p)\not=1,b < \varphi(p)\ (mod\ p)\) \(=a^{b\%\varphi(p)+\varphi(p) 阅读全文
posted @ 2022-02-24 10:53 cbdsopa 阅读(39) 评论(0) 推荐(0)
摘要: P1082 #include<bits/stdc++.h> using namespace std; #define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout) int exgcd(int a,int b,int & 阅读全文
posted @ 2022-02-24 10:19 cbdsopa 阅读(29) 评论(0) 推荐(0)
摘要: 优秀资料 素数 这个很好写。我们可以很好的理解埃氏筛,然后加一些优化即可得到线性筛。 inline void get_pri(int n){ for(int i=2;i<=n;++i) not_pri[i]=0; not_pri[1]=1; for(int i=2;i<=n;++i){ if(!no 阅读全文
posted @ 2022-02-24 10:17 cbdsopa 阅读(58) 评论(0) 推荐(0)
摘要: 我们对于一个要求的数论函数 $f(x)$,定义 $S(n)=\sum_{i=1}^nf(x)$ 然后我们考虑构造一个 $S(n)$ 关于 $S(\lfloor\frac{n}{i}\rfloor)$ 的一个递推式子。 我们发现,对于任意的一个数论函数 $g(x)$ ,我们有: $$\sum_{i=1 阅读全文
posted @ 2022-02-24 10:16 cbdsopa 阅读(39) 评论(0) 推荐(0)
摘要: 筛选素数 枚举每个数,并枚举它的倍数,给它的倍数打上非质数标记 用bitset存储标记会加速一倍,空间开销小一倍 { pri[1]=1; for(int i=2;i<=n;i++) { if(!pri[i]) { for(int j=2;i*j<=n;j++) { pri[i*j]=1; } } } 阅读全文
posted @ 2022-02-24 10:14 cbdsopa 阅读(56) 评论(0) 推荐(0)
摘要: 优点: 1.回带比原版高斯消元少,速度更快(一般情况下) 2.精度更好 3.代码实现更简单 代码如下:模板P3389 #include<bits/stdc++.h> using namespace std; #define file(a) freopen(#a".in","r",stdin),fre 阅读全文
posted @ 2022-02-24 10:13 cbdsopa 阅读(42) 评论(0) 推荐(0)
摘要: 前置知识 矩阵乘法 矩乘快速幂 领接矩阵k次方的意义 因为我不知道怎么证明这个,就直接告诉你,若 \(A\) 是一个领接矩阵,那么 \(A^{n}_{i,j}\) 的意义为点 i,到达点 j 长度为 k 的路径数量。 是不是看着就觉得很好用 但是很显然 k 比较大的时候我们不可能一层一层乘上去。所以 阅读全文
posted @ 2022-02-24 10:11 cbdsopa 阅读(216) 评论(0) 推荐(0)
摘要: 封装一个矩阵,带乘法,加法和清空 struct matrix { int n,m; long long a[N][N]; friend matrix operator * (matrix x,matrix y) { matrix c; c.n=x.n;c.m=y.m; c.clear(0); for 阅读全文
posted @ 2022-02-24 10:11 cbdsopa 阅读(51) 评论(0) 推荐(0)
摘要: 维护半平面交 这个我喜欢读(tu1 ke2)。我们先从简单的入手。 这个分为上凸壳和下凸壳。顾名思义就是一个维护多条函数的最大值,一个维护最小值。 这个我们有一个例题 水平可见直线 其实是因为考场上没学但是写出来了而作为纪念找到的!(虽然那道题还是因为没调完爆零了/kk) 我们考虑按照每条直线的斜率 阅读全文
posted @ 2022-02-24 10:09 cbdsopa 阅读(90) 评论(0) 推荐(0)
摘要: 用于处理矩形覆盖问题,因为是线段树实现所以拥有 \(O(nlogn)\) 的复杂度。 主要思想是虚拟出一条平行与 x 或 y 轴的无限长的线,我们称之为扫描线。一路扫过去,如果发现触碰到矩形的边(被当前扫描线完全覆盖)就停下进行相关操作。 1 "对于点的坐标太大,不就变成暴力一样的的东西啦?" 对于 阅读全文
posted @ 2022-02-24 10:08 cbdsopa 阅读(212) 评论(0) 推荐(0)
摘要: 简单讲一下极角排序。 我们对于极角排序,就是以x轴为始边,然后到当前点所在的终边,以原点为顶点所形成的角来排序。第二关键字按照到原点的距离。 tan2极角排序 我们把坐标放入 $tan2(y,x) $ 就可以得到极角了。返回的范围是 \([-\pi,\pi]\) 其中c是我们想要以其为中心进行极角排 阅读全文
posted @ 2022-02-24 10:06 cbdsopa 阅读(137) 评论(0) 推荐(1)
摘要: 废话不多说,直接入正题。 误差 const db eps=1e-9; inline int sgn(T x){ return x<-eps?-1:x<eps?0:1; } 我们浮点数计算计算几何的时候是存在误差的,我们用上面这个函数来修正。 对于 \(x < -eps\) ,我们认为它属于负数,返回 阅读全文
posted @ 2022-02-24 10:06 cbdsopa 阅读(89) 评论(0) 推荐(0)
摘要: 快速幂 在你保证两个数相乘不爆 long long 的情况下使用。 本质上是拆成二进制之后乘起来。 inline int qpow(int a,int b){ int res=1; while(b){ if(b&1) res=mul(res,a); a=mul(a,a); b>>=1; } retu 阅读全文
posted @ 2022-02-24 10:04 cbdsopa 阅读(65) 评论(0) 推荐(0)
摘要: 先给出最为基本的公式 \(\lvert\bigcup_{i=1}^{n}A_i\rvert=\sum_{C\subseteq A}(-1)^{size(C)-1}\lvert\bigcap_{e\in C}e\rvert\) 这个可以看一些小学的具体一点的问题就可以比较好的理解然后推广。严谨证明我们 阅读全文
posted @ 2022-02-24 10:03 cbdsopa 阅读(69) 评论(0) 推荐(0)
摘要: 费马小定理(模数是质数) long long power(long long a,long long b,long long c) { a=a%c; long long res=1; while(b>0) { if(b&1) res=(res*a)%c; a=(a*a)%c; b=b>>1; } r 阅读全文
posted @ 2022-02-24 10:02 cbdsopa 阅读(56) 评论(0) 推荐(0)
摘要: \(A{^m_n}=\frac{n!}{(n-m)!}\) \(C{^m_n}=\frac{n!}{m!(n-m)!}\) 实现直接调用逆元套公式即可 \(C{^m_n}\) 也写作 \(\tbinom{n}{m}\) ,读作 "n 选 m". 阅读全文
posted @ 2022-02-24 10:01 cbdsopa 阅读(102) 评论(0) 推荐(0)
摘要: 也是直接给公式了 \(\big(^n_m\big) mod\ p=\big(^{n\%p}_{m\%p}\big)\big(^{\lfloor n/p\rfloor}_{\lfloor m/p\rfloor}\big)\) 阅读全文
posted @ 2022-02-24 09:57 cbdsopa 阅读(49) 评论(0) 推荐(0)
摘要: 有的时候我们为了方便对于低位进行操作,我们要把二进制数翻转过来,这样可以避免使用大量的取模操作。 直接入正题 思想解释+具体代码 我们要求 \([0,2^{len})\) 的区间中的每一个翻转。 首先要知道的是什么叫一个 \(a\) 进制数的翻转。 我们以 \(2\) 进制为例,\((x_{n}.. 阅读全文
posted @ 2022-02-24 09:56 cbdsopa 阅读(364) 评论(0) 推荐(0)
摘要: 来,背 稍微提一下原根的求法,我们对于模数(p-1)质因数分解,然后暴力枚举原根,我们发现原根满足 \(^{n}_{i=1}g^{\frac{p-1}{p_i}}\not\equiv 1(mod\ p)\) 就没了。 然后就是模数需要满足是$X\times 2_n+1$ 的形式,否则上任意模数NTT 阅读全文
posted @ 2022-02-24 09:53 cbdsopa 阅读(250) 评论(0) 推荐(0)
摘要: 建议全文背诵 3->2优化 #include<bits/stdc++.h> using namespace std; #define LL long long #define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout 阅读全文
posted @ 2022-02-24 09:52 cbdsopa 阅读(57) 评论(0) 推荐(0)
摘要: 普通生成函数 对于一个序列 \(a\) ,其生成函数形如(本质上是个多项式): \(F(x)=\sum_{n}a_nx^n\) 用通俗一点的话来解释生成函数这个概念,其实就是把序列按照编号从小到大的顺序放到多项式次数从低到高的系数里。所以说,如果该序列有通项公式,那么其生成函数的系数就是通项公式。 阅读全文
posted @ 2022-02-24 09:51 cbdsopa 阅读(257) 评论(0) 推荐(0)
摘要: 对于一个多个子游戏的博弈,我们借助其SG函数烟究(某数学老师的口音)这个先后手的胜负。 给一个定义,其中 \(x\) 可以到达 \(x_i\) \(SG(x)=mex\{SG(x_1),SG(x_2),...,SG(x_n)\}\) 然后对于mex,我们定义其为集合中没有的第一个非负整数。 然后我们 阅读全文
posted @ 2022-02-24 09:48 cbdsopa 阅读(35) 评论(0) 推荐(0)
摘要: 用于维护异或的数据结构。(又是模拟赛保龄过来补) 废话多不多说了,直接上正题。 先说什么是线性基吧。() 就是说对于一个集合,如何它对于异或在线性基集合中封闭。那么我们认为之歌构造出的集合是线性基。对于异或封闭是什么意思?就是说它内的元素异或来异或去就只会得出原集合的东西。 怎么构造? 考虑对于每一 阅读全文
posted @ 2022-02-24 09:45 cbdsopa 阅读(47) 评论(0) 推荐(0)
摘要: 同trie,只是维护的字符只有0和1 可以通过每次如果可以选择不同字符则选择不同字符的贪心思想维护最大异或和。多用于解决异或问题。 为什么上面那样操作可以维护最大异或和?因为我们按照从高位往底的顺序,如果当前答案这一位异或得1,其他答案的更高位都不超过当前答案的更高位,且其他答案这一位异或得0,那么 阅读全文
posted @ 2022-02-24 09:44 cbdsopa 阅读(67) 评论(0) 推荐(0)
摘要: 终于来补线段树合并了,之前本来打算写的,结果懒了。 前置知识 动态开点线段树 算法操作 就是对于每个点维护一颗不全的线段树,对于每个节点记录其对应线段树的根节点。对于需要其子树贡献的节点,自下而上合并线段树,再查询。 很显然,和 Dsu on tree 是同类的算法. 具体实现 我们只需要知道线段树 阅读全文
posted @ 2022-02-24 09:42 cbdsopa 阅读(51) 评论(0) 推荐(0)
摘要: 就是对于一颗动态开点的线段树(而且一般为权值线段树),我们把它拆开拆成两份(一般来说:为了方便,按sz分裂) 可以用来干嘛呢,小编也很疑惑,或许是可以用于把这边线段树的区间转移到另一边? 那么废话不多说直接开始。 实现原理 有点类似于求排名为 \(k\) 的数的过程,考虑其左子树的值,如果这个值大于 阅读全文
posted @ 2022-02-24 09:41 cbdsopa 阅读(363) 评论(0) 推荐(0)
摘要: layout: post title: 权值线段树 subtitle: 线段树的特殊运用,可以称之为小小平衡树 categories: 数据结构 tags: [线段树] 顾名思义,维护权值的线段树。在一定情况下可以代替平衡树使用。 原理是用线段树维护桶,节点维护子树中数的个数。所以空间开销与数据的值 阅读全文
posted @ 2022-02-24 09:36 cbdsopa 阅读(65) 评论(0) 推荐(0)
摘要: 多用于 权值线段树 用多少点开多少点,空间复杂度降至 \(O(nlog{n})\) P3369 #include<bits/stdc++.h> using namespace std; #define file(a) freopen(#a".in","r",stdin),freopen(#a".ou 阅读全文
posted @ 2022-02-24 09:34 cbdsopa 阅读(47) 评论(0) 推荐(0)
摘要: 发现以前学的时候摸鱼,都没有搞明白原理,现在来捡了。 左偏树是一种可并堆,满足以下性质: 堆的性质:根的值比儿子大 左偏性质:左子树的距离不小于右子树的距离 距离是什么意思?就是指当前节点到最近的外节点的距离。 外节点是什么?就是不完整的节点,也就是儿子个数不满的节点。 堆的性质决定了左偏树的作用, 阅读全文
posted @ 2022-02-24 09:32 cbdsopa 阅读(57) 评论(0) 推荐(0)
摘要: 支持修改区间加、区间乘、查询区间和的线段树结构体封装版 可以类比的写出其他操作 struct node { int l,r,mid; long long d,lazyadd,lazymul; }; struct tree { node t[N*4]; void build(int i,int l,i 阅读全文
posted @ 2022-02-24 09:31 cbdsopa 阅读(45) 评论(0) 推荐(1)
摘要: 简单论一下区间修改,单点查询的树状数组。 我们是考虑维护一个对于原数组的差分数组,然后取答案时用原数组加上查分数组得到。 资料 二维树状数组 参考资料:资料 单点修改 void modify(int i,int j,int k) { a[i][j]+=k; for(int x=i;x<=n;x+=( 阅读全文
posted @ 2022-02-24 09:28 cbdsopa 阅读(24) 评论(0) 推荐(0)
摘要: Splay,即伸展树,较为受众的平衡树,依靠双旋的速度称霸(虽然替罪羊更快,但是splay在之后有光明的未来(可以发展为LCT),总之是比treap快) 平衡树调试两大题:P3369+P6136 注: 本文采用非递归 信息维护 我们对于splay树上的一个节点维护以下信息: \(sz\) 子树大小 阅读全文
posted @ 2022-02-24 09:26 cbdsopa 阅读(58) 评论(0) 推荐(0)
摘要: #include<bits/stdc++.h> using namespace std; int n,m,tot; struct treap { int ch[3],pri,size,v; }t[100010]; void update(int x) { t[x].size=1+t[t[x].ch[ 阅读全文
posted @ 2022-02-24 09:25 cbdsopa 阅读(30) 评论(0) 推荐(0)
摘要: 因为之前学东西学得太菜所以重学了。 不说多了直接正题。 思想解析 本质上就是普通的BST,只是多了一个重建不平衡子树的重构操作。 很显然每个平衡树都有一个维护平衡的操作,那么替罪羊树的平衡操作就是重构。 最开始的时候教练说替罪羊十分暴力,一不平衡整棵树拍扁重构。但是其实并不是整棵树重构,而且操作并不 阅读全文
posted @ 2022-02-24 09:24 cbdsopa 阅读(55) 评论(0) 推荐(0)
摘要: 我们先把跳表入个门。 我们发现很多时候我们能不写平衡树就不写,像有的巨神喜欢用线段树一样(但是线段树的常数我们就不多说了),那我们就也整一点比较怪的东西。我们考虑用链表维护一些平衡树的信息。 最近学了链表之后发现这个东西就是个神,支持很多常数小的操作甚至直接配合其他算法整出各种优越于其他做法的复杂度 阅读全文
posted @ 2022-02-24 09:21 cbdsopa 阅读(134) 评论(0) 推荐(0)
摘要: 可持久化就是支持维护不同时间下的版本的数据结构啦。 那么可持久化线段树能干什么很显然了。 可持久化线段树又叫主席树,因为来历大家都知道就不多说了。 那么就直接讲核心操作了,就是克隆节点。 克隆节点 就是在修改的时候(或者维护多棵有公共节点的线段树时)使用。把有变化的节点新建,由于每次如果进行单点修改 阅读全文
posted @ 2022-02-24 09:20 cbdsopa 阅读(70) 评论(0) 推荐(0)
摘要: 我们可以令$f[i][j]\(表示区间\)[i,i+2^{j}-1]$的最大值(最小值同理) 所以有$f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])$ (根据上面的定义可以得出) 注:可以预处理出log2数组,进一步卡常。 #include<bits/stdc++. 阅读全文
posted @ 2022-02-24 09:18 cbdsopa 阅读(36) 评论(0) 推荐(0)
摘要: 完全顶替map const int S=10000019; struct HashMap{ std::vector<int>head,nxt; struct node{ int x,v; };std::vector<node>to; inline void clear(){ head.resize( 阅读全文
posted @ 2022-02-24 09:15 cbdsopa 阅读(35) 评论(0) 推荐(0)
摘要: 对于每一个集合维护点与根的权值。 如果对权值取模,可以得到种类并查集,相当于同时维护数与数之间的多种关系,如包含与不包含。 典型例题:P2024 [NOI2001] 食物链 两种实现方式:(以 P2024食物链 为例) 1.维护点到根的关系值,通过权值判断两点是否在同一集合。 实现如下: #incl 阅读全文
posted @ 2022-02-24 09:11 cbdsopa 阅读(44) 评论(0) 推荐(0)
摘要: 一般用于连通块查询 加入size数组可以做到查询连通块大小 #include<bits/stdc++.h> using namespace std; int fa[100010],n,m; inline int find(int x) { return fa[x]==x?x:fa[x]=find(f 阅读全文
posted @ 2022-02-24 09:10 cbdsopa 阅读(30) 评论(0) 推荐(0)
摘要: 实际上就是个链表。 #include<bits/stdc++.h> using namespace std; int n,m; vector<bool>vis; vector<int>head,next,to,val; /* head[i]存储以i为起点的第一条边的编号 next[i]存储编号为i的 阅读全文
posted @ 2022-02-24 09:07 cbdsopa 阅读(51) 评论(0) 推荐(0)
摘要: 快读 inline int read() { int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();} while('0'<=ch&&ch<='9') {s=s*10+(ch^48); 阅读全文
posted @ 2022-02-24 09:03 cbdsopa 阅读(64) 评论(0) 推荐(0)
摘要: 算法标签:排序,随机化,分治。 我这个人很喜欢比较玄学但是优秀的算法和数据结构。 众所周知,我们考试的时候经常遇到毒瘤出题人卡算法。但是我们也知道:“如果我自己都不知道我在干什么,你就别想卡我啦。” 所以说 \(mt19937\) 天下第一!(不是CCF准用 c++14了嘛) 浅谈mt19937 简 阅读全文
posted @ 2022-02-24 09:02 cbdsopa 阅读(50) 评论(0) 推荐(0)
摘要: 我们考虑一个问题 玩具装箱 我们很简单可以求出 $O(n^2)$ 的巨简单的做法。 我们设 $f_i$ 表示 $$f_i=min_{j<i}{f_j+(sum_i-sum_j+i-j-1-L)^2}$$ 我们考虑用 $s_x$ 代替 $sum_x+x$, $L'$ 代替 $L+1$ ,并且把与 $j 阅读全文
posted @ 2022-02-24 08:57 cbdsopa 阅读(51) 评论(0) 推荐(0)
摘要: 用于优化多重背包。 对于每一种物品的可选个数,把它按照二进制拆分出来,如: \(24->1+2+4+8+9\) 然后把这些数分别乘到大小和价值数组里面(每个数开一个)然后跑01背包即可。 因为这样的数可以拼凑出所以需要的情况。 代码实现如下: for(int i=1;i<=n;++i){ int C 阅读全文
posted @ 2022-02-24 08:55 cbdsopa 阅读(55) 评论(0) 推荐(0)
摘要: 模板题链接:P2516 HAOI2010最长公共子序列 我们借题解第一篇的巨佬的图 我们$O(n^2)$的枚举$i$,\(j\)(分别对应两个串的下标) 我们记两串分别为$a,b$,记$dp[i][j]$为截止到$i,j$时的最长公共子序列,如果$a[i]==b[j]$匹配成功,我们可直接用$dp[ 阅读全文
posted @ 2022-02-24 08:52 cbdsopa 阅读(39) 评论(0) 推荐(0)
摘要: 突然发现自己dp极其菜,背包一个不会/kk(我没开玩笑) 那全部学一遍。 01背包 问题:n 种物品,每种物品有一个大小 \(v_i\),一个价值 \(c_i\) 可以选择一个或不选,求背包容量为 m 的情况下(指所选物品大小之和小于等于m)选择的物品价值和的最大值。 我们可以设 \(f_{i,j} 阅读全文
posted @ 2022-02-24 00:32 cbdsopa 阅读(50) 评论(0) 推荐(0)