![](https://img-blog.csdnimg.cn/20210224090223269.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
学习总结
文章平均质量分 73
基础算法
Wangduoyu
这个作者很懒,什么都没留下…
展开
-
暴力算法 --- 莫队
基础莫队带修改莫队书上莫队原创 2022-12-03 11:41:05 · 616 阅读 · 0 评论 -
第十一届蓝桥杯国赛C++B组题解(A - J)
第十一届蓝桥杯国赛C++B组题解(A - J)原创 2022-11-16 12:39:03 · 3078 阅读 · 0 评论 -
【DP学习总结】树形DP
文章目录【例题1】没有上司的舞会【例题2】Strategic game【例题3】选课【例题4】有依赖的背包问题本文参照:OI Wiki 树形DP树形DP,顾名思义就是在树上进行的DP。我把它分为两类,1. 有根树, 2. 无根树有根树又分为两种,一种是普通的DP,一种是树上背包DP。接下来,就来以此介绍【例题1】没有上司的舞会题目链接:P1352题意: 有编号为1∼N1 \sim N1∼N的NNN个职员,他们之间的关系就是一棵有根树,父节点是子节点的上司。他们将要举办舞会,每个人都有一个开心值v原创 2022-04-08 15:11:22 · 444 阅读 · 0 评论 -
【DP学习总结】区间DP
文章目录前言例题例题【1】石子合并例题【2】回文子序列小结例题【3】环形石子合并(破环成链)例题【4】多边形前言区间dp,顾名思义,是解决一类区间问题的动态规划。通常用来f[l][r]f[l][r]f[l][r]来表示区间[L,R][L, R][L,R]上的最优解。主要难在对于状态的转移。区间dp有迭代和递归两种写法,而递归写法就是一个记忆化搜索。通用模板for (int len = 1; len <= n; len ++) { 枚举长度 for (int l = 1; l +原创 2022-04-03 15:59:14 · 833 阅读 · 0 评论 -
【DP学习总结】数位DP
文章目录求【L,R】区间满足某种性质数的个数不要62windy数花神的数论题Beautiful numbers求【L,R】区间满足某种性质数的平方和,立方和恨7不成妻不要666升级版求【L,R】区间满足某种性质数的个数模板:int dfs(int pos, int pre, int lead, int limit){ if(!pos) { 边界 } if(!limit && !lead && dp[pos][pre] != -1) return dp[p原创 2021-12-10 17:30:50 · 439 阅读 · 0 评论 -
【DP学习总结】状态机模型
文章目录股票买卖DP+KMP设计密码题意:solution:codeDP+AC自动机文本生成器题意:solution:code:修复DNA题意:solution:code:与矩阵快速幂的结合GT考试股票买卖DP+KMP设计密码题目链接:Acwing 1052题意:你现在需要设计一个密码 SSS,SSS 需要满足:SSS 的长度是 NNN;SSS 只包含小写英文字母;SSS 不包含子串 TTT;请问共有多少种不同的密码满足要求?答案对1e9+71e9+71e9+7取模对于此题,有原创 2021-12-10 13:55:57 · 385 阅读 · 0 评论 -
【DP学习总结】背包例题
文章目录1. Steadily Growing Steam题意:solution:Code:2. 选数题意:solution:Code:1. Steadily Growing Steam题目链接:2021上海区域赛 I题题意:有NNN个物品,每个物品的体积为tit_iti,价值为viv_ivi。在选择物品之前,你可以选择0∼k0 \sim k0∼k个物品的体积翻倍,然后需要在这NNN个物品中选出若干个物品分成AAA,BBB两堆,使得这AAA和BBB的体积相同,并且价值之和最大。求这个价值的最原创 2021-12-09 20:56:13 · 598 阅读 · 0 评论 -
【DP学习总结】背包九讲(模型)
文章目录01背包完全背包多重背包混合背包分组背包二维费用背包有依赖的背包背包问题求具体方案背包问题求具体方案数01背包问题描述:有NNN件物品和一个容量为VVV的背包。第iii件物品的体积是v[i]v[i]v[i],价值是w[i]w[i]w[i]。求解将哪些物品装入背包可使价值总和最大。思路:01背包的特点:每件物品可以选择放或者不放。状态表示:f[i][j]f[i][j]f[i][j]表示前iii个物品,容量不超过jjj的所有方案数中价值的最大值状态计算:不选:f[i][j]=f[i−1]原创 2021-12-09 15:00:24 · 804 阅读 · 0 评论 -
【DP学习总结】数字三角形模型
DP1原创 2021-12-07 20:21:12 · 605 阅读 · 2 评论 -
古代猪文--(全是数论QwQ)
题目链接题意:Sol:首先当qqq为999911659999911659999911659时,答案为000.否则的话,因为999911659999911659999911659是质数,根据欧拉定理的推论有:q∑d∣nCnd≡q∑d∣nCnd mod 999911658( mod 999911659)q^{\sum_{d|n} C_n^d} \equiv q^{\sum_{d|n} C_n^d \bmod 999911658} ( \bmod \ 999911659)q∑d∣nC原创 2021-10-31 19:27:58 · 181 阅读 · 0 评论 -
高斯消元解线性方程组
高斯消元:O(n3)O(n^3)O(n3)写出增广矩阵,将增广矩阵通过初等行变换变成阶梯型,然后往回带适用于求解包含nnn个方程,nnn个未知数的多元线性方程组例如下式多元方程组:{a1,1∗x1+a1,2∗xi+⋯+a1,n∗xn=b1a2,1∗x1+a2,2∗xi+⋯+a2,n∗xn=b2⋮an,1∗x1+an,2∗xi+⋯+an,n∗xn=bn\begin{cases} a_{1,1}*x_1 + a_{1,2}*x_i +\quad \cdots \quad+ a_{1, n}*x_n =原创 2021-10-30 16:11:44 · 146 阅读 · 0 评论 -
矩阵乘法加速递推
矩阵快速幂加速递推式原创 2021-10-30 13:41:24 · 478 阅读 · 0 评论 -
中国剩余定理以及扩展中国剩余定理
中国剩余定理设m1,m2,⋯ ,mnm1, m2,\cdots, m_nm1,m2,⋯,mn是两两互质的整数,对于下式的一元线性同余方程组有整数解{x≡a1( mod m1)x≡a2( mod m2)⋮x≡an( mod mn)\begin{cases} x \equiv a_1(\bmod m_1) \\ x \equiv a_2(\bmod m_2) \\ \qquad \vdots \\ x \equiv a_n (\bmod m_n) \end{cases}⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡a1原创 2021-10-29 20:38:21 · 266 阅读 · 0 评论 -
数学知识——数论分块
对于一个式子:∑i=1n⌊ni⌋\sum_{i=1}^{n} \left \lfloor \frac{n}{i} \right \rfloori=1∑n⌊in⌋我们容易发现在某段区间[l,r][l, r][l,r], ⌊ni⌋\left \lfloor \frac{n}{i} \right \rfloor⌊in⌋的值是一样的。那么我们如何获取这个区间呢。我们假设区间左端点为lll,同时令k=⌊nl⌋k = \left \lfloor \frac{n}{l} \right \rfloork=⌊l原创 2021-10-28 01:10:21 · 543 阅读 · 1 评论 -
Codeforces Round #725 (Div. 3) G. Gift Set (神奇的二分)
Link题意:有xxx颗红糖,yyy颗蓝糖用来组装成礼包。一个礼包有aaa个红糖和bbb个蓝糖或者 aaa个蓝糖和 bbb个红糖。现问有最多能组装成多少个礼包。Sol:首先保证:x>yx > yx>y,a>ba > ba>b然后二分一个方案: sss个。首先将xxx和yyy都减去bbb,剩下 (x−b,y−b)\left ( x- b , y - b\right )(x−b,y−b),然后就是求a=a−ba = a - ba=a−b的个数了。首先是a==0a =原创 2021-10-21 12:43:56 · 92 阅读 · 0 评论 -
codeforces F. Moving Points (树状数组 + 离散化)
Link题意数轴上有NNN个点。其中坐标为xix_ixi的点有一个速度为viv_ivi(沿xxx轴正向)。问每两个点之间的最小距离之和。Sol对于两个点iii和jjj,只有xi≤xjx_i \le x_jxi≤xj并且vi≤vjv_i \le v_jvi≤vj时,此时两点无法相遇,最短距离就是∣xi−xj∣| x_i - x_j|∣xi−xj∣;其他情况都会相遇,最小距离为0。将距离从小到大排序,然后速度离散化,每次对答案的贡献就是:比当前点速度还小的点的个数乘上当前点的坐标减去前原创 2021-10-17 18:30:16 · 98 阅读 · 0 评论 -
单词(AC自动机,拓扑排序)
题目链接题意:有一篇论文,是由很多的单词构成。但他发现一个单词会出现多次现在有NNN个单词,问这个NNN个单词出现的次数Sol:建立Trie的同时,记录一个f[i]f[i]f[i]数组记录当前单词出现的次数(类似前缀和)。然后同样利用bfs构建failfailfail数组,另外bfs的队列里面记录的节点顺序应该为Trie图的拓扑序列。在所有单词中求某个单词的出现次数的时候,就是求所有前缀当中后缀出现的单词(failfailfail数组的定义),最后就是从后往前累计单词的出现次数。Code:原创 2021-10-13 17:04:13 · 146 阅读 · 0 评论 -
HDU 2222 Keywords Search (AC自动机模板题)
题目链接题意:给出NNN个单词,然后给出一个文本,问在这个文本当中有多少单词出现过?Sol:前置知识:Tire树以及KMPAC自动机的过程构造一棵Trie树,建立failfailfail指针(数组),就像KMP算法一样,当匹配失败的时候利用Next数组进行跳转。类似的,在AC自动机里,当前不匹配时,跳到具有最长公共后缀与前缀匹配的字符串位置继续匹配。failfailfail数组的定义是:从aaa串跳到bbb串,bbb串一定是aaa的字串,那么bbb串一定也是aaa串某个前缀的后原创 2021-10-13 01:03:34 · 93 阅读 · 0 评论 -
Monopoly (数学,数据结构,同余域)
题目链接Code:#include<bits/stdc++.h>#define int long long#define endl '\n' #define br putchar('\n') #define _x fixed << setprecision#define debug(x) cerr<< #x << '=' << x << '\n'#define ok() cout << "Yes\n" #原创 2021-10-12 21:04:35 · 246 阅读 · 0 评论 -
Nun Heh Heh Aaaaaaaaaaa(动态规划,排列组合)
题目链接Code#include<bits/stdc++.h>#define int long long#define endl '\n' #define br putchar('\n') #define _x fixed << setprecision#define debug(x) cout << "------" << x << "-----\n";#define ok() cout << "Yes\n" #de原创 2021-10-11 11:36:42 · 230 阅读 · 0 评论 -
2021 CCPC 网络赛重赛 Jumping Monkey(并查集重构树,dfs)
题目链接题意给出一个nnn个结点的树,每个节点有一个权值aia_iai。现在有一个猴子,他可以从iii结点跳到jjj结点的要求是:在iii->jjj的最短路径上jjj的权值是最大的。现在询问k⊆(1,n)k \subseteq (1, n)k⊆(1,n)时,猴子能跳到的最多结点数量。SolCode#include<bits/stdc++.h>#define int long long#define endl '\n' using namespace std;typ原创 2021-10-11 10:34:50 · 426 阅读 · 0 评论 -
可持久化线段树(静态,第k小数)
第k小数题目链接题意:给定长度为NNN的序列AAA,下标为1∼N1 \sim N1∼N现在要执行 MMM 次操作,其中第 iii 次操作为给出三个整数 li,ri,kil_i,r_i,k_ili,ri,ki,求 A[li],A[li+1],⋅⋅⋅,A[ri]A[l_i],A[l_i+1],···,A[r_i]A[li],A[li+1],⋅⋅⋅,A[ri] (即 AAA 的下标区间 [li,ri][l_i,r_i][li,ri])中第 kik_iki 小的数是多少。Sol:可持久原创 2021-10-03 20:09:02 · 140 阅读 · 0 评论 -
可持久化Trie树
文章目录朴素版Trie树可持久化Trie树例题:题意:Sol:Code:朴素版Trie树朴素版Trie树可持久化Trie树可持久化Trie树,对于每个版本,需要将所有结点创建出来并与上一个版本建立联系。优点:从某个版本开始,能够遍历到该版本内的所有结点。可以解决动态的异或问题。例题:最大异或和题意:给定一个非负整数序列 aaa,初始长度为 NNN。有 MMM 个操作,有以下两种操作类型:A x:添加操作,表示在序列末尾添加一个数 xxx,序列的长度 NNN 增大 111。Q l原创 2021-10-03 16:55:20 · 213 阅读 · 0 评论 -
营业额统计(Treap的简单应用)
Treap的简单应用题目链接题意:设第 iii 天的营业额为 aia_iai,则第 iii 天(i≥2i \ge 2i≥2)的最小波动值 fif_ifi 被定义为:fi=min1≤j<i∣ai−aj∣f_i=min_{1 \le j < i}|a_i-a_j|fi=min1≤j<i∣ai−aj∣求出每一天的fif_ifi总和,其中:f1=a1f_1 = a_1f1=a1Sol:建立平衡树,查询每天营业额在平衡树的前驱后继与之比较统计code:#inclu原创 2021-10-02 22:45:26 · 337 阅读 · 0 评论 -
平衡树(模板)
平衡树の模板您需要写一种数据结构,来维护一些数,其中需要提供以下操作:插入数值 xxx。删除数值 xxx(若有多个相同的数,应只删除一个)。查询数值 xxx 的排名(若有多个相同的数,应输出最小的排名)。查询排名为 xxx 的数值。求数值 xxx 的前驱(前驱定义为小于 xxx 的最大的数)。求数值 xxx 的后继(后继定义为大于 xxx 的最小的数)。Code:#include <bits/stdc++.h>using namespace std;const int原创 2021-10-02 22:35:51 · 160 阅读 · 0 评论 -
亚特兰蒂斯(线段树,扫描线,离散化,二分)
亚特兰蒂斯题目链接题意:有n个矩形,求这些矩阵的总面积(矩阵有重叠)Sol:将y离散化,线段树维护区间的长度。Code:#include<bits/stdc++.h>using namespace std;const int N = 100010;int n;struct Segment{ double x, y1, y2; int k; bool operator < (const Segment &b) const {原创 2021-09-28 22:02:19 · 194 阅读 · 0 评论 -
补题の快乐
题目链接J.Leaking Roof题意:有n×n的方格,每个格子有个高度,初始时每个格子的水量为m,每个点均匀严格由高往低流。问最终高度为零的地方的水量,其余地方输出0即可。Sol:按照题意,从最高地方模拟流水。注意最后输出,高度不为0的地方直接输出0.Code:#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 550;double w[N][原创 2021-09-27 01:45:17 · 104 阅读 · 0 评论 -
树状数组训练
树状数组训练文章目录A. Ultra-QuickSortB.敌兵布阵C.Color the ballD.JapanE.MatrixA. Ultra-QuickSort题意:交换相邻元素使n个元素的序列成为升序Sol:求逆序对的数量逆序对(归并排序,树状数组)Code:归并排序#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>us原创 2021-09-19 14:50:08 · 92 阅读 · 0 评论 -
Prime Independence(素数+奇偶分图+最大独立集)
题目链接题意:给出nnn个数,在这nnn个数组成的集合中,两两之间相除不出现素数。问这个集合的最大值SOL:最大独立集=nnn— 二分图的最大匹配值对于两个数,如果他们的质因子数量是相等的,那么一定能在一个集合里面。所以,建立按照数字的奇偶性,建立二分图。用匈牙利算法求二分图的最大匹配值Code:#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int n;int a[N], all[N],原创 2021-09-14 14:54:10 · 210 阅读 · 0 评论 -
并查集练习
并查集练习文章目录A.畅通工程C.The SuspectsB.Find them, Catch themD.食物链A.畅通工程题意:n个城市,m条道路,问还需要多少条道路能将n个城市连起来(不必需要直接道路)Sol:根据m条道路,将n个城市进行合并操作,最终找出有多少个连通块,答案为联通块的数量减1.(n个城市连起来需要n-1条道路)Code:#include<bits/stdc++.h>using namespace std;struct UNF{ vector&原创 2021-09-13 18:10:53 · 162 阅读 · 0 评论 -
DP学习笔记
文章目录记忆化搜索背包**一.01背包Easy\color{green}{Easy}Easy**二.完全背包Easy\color{green}{Easy}Easy三.多重背包Mid\color{orange}{Mid}Mid四.分组背包Easy\color{green}{Easy}Easy线性DP[数字三角形Easy\color{green}{Easy}Easy](https://www.acwing.com/problem/content/900/)[最长上升子序列LISMid\color{orange}原创 2021-08-13 10:02:14 · 365 阅读 · 0 评论 -
基础训练——(线段树)
文章目录A:I Hate ItB:Balanced LineupC:Minimum Inversion NumberD: Count ColorA:I Hate It链接Solution:线段树维护区间最大值Code:#include<bits/stdc++.h>using namespace std;const int N = 1000010;int tree[N];void build(int l, int r, int node){ if( l ==原创 2021-05-04 19:06:16 · 78 阅读 · 0 评论 -
基础训练 ——(树形DP)
文章目录A:Common SubsequenceB:免费馅饼A:Common Subsequence链接Solution:LCS问题代码:#include<bits/stdc++.h>using namespace std;const int N = 1e3 + 5;int dp[N][N];char a[N], b[N];int main(){ while(cin >> a+1 >> b+1) { int la原创 2021-05-03 16:41:06 · 122 阅读 · 0 评论 -
数据结构——堆
文章目录手写堆的基本操作模拟堆手写堆的基本操作两个基本操作:down(int x) : 向下调整up(int x) : 向上调整代码:// 小根堆的down与up操作void down(int x){ int t = x; if (2 * x <= Size && h[2 * x] < h[t] ) t = 2 * x; if (2 * x + 1 <= Size && h[2 * x + 1] < h[t]原创 2021-04-08 17:04:52 · 70 阅读 · 0 评论 -
数据结构——Trie树
文章目录什么是Trie树Trie树的实现Trie树的应用什么是Trie树Trie树,又称字典树,是一种树形结构。用于统计和排序大量的字符串(但不仅限于字符串)。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。但是Trie树的内存消耗非常大。Trie树的实现**例子:**对于"abana" “become” “insert” "abbb"建立的Trie树的样子为:Tire树的插入:从原创 2021-04-07 16:42:15 · 301 阅读 · 1 评论 -
数据结构——KMP算法
文章目录KMP算法的作用KMP的代码实现KMP算法的作用KMP算法是一种高效的字符串匹配算法,用来在主字符串中寻找模式串的位置暴力方法:在主字符串依次截取m(模式串的长度)进行匹配;时间复杂度O(N*N);优化:我们希望在匹配的过程中,我们希望不单纯的向后移动一位,而是找到某些规律从而移动多位来加快匹配的速度。举个例子:对于在abdababa中寻找aba模式串的位置,当匹配的主串的d与模式串的a不等时,可以直接将模式串往后移两位,从而减少了匹配的次数。Next数组的含义:Next数组用原创 2021-04-04 13:13:36 · 322 阅读 · 0 评论 -
数据结构——并查集
文章目录概念代码实现实例:概念定义:并查集是一种树形结构,用于处理一些不相交集合的合并及查询问题主要构成:p[]数组记录每个点的根节点,find函数是找到哪个集合或是祖宗节点,join函数用于集合的合并代码实现find函数()// 路径压缩int find(int x){ if(x != p[x]) // 自己不是祖宗节点 p[x] = find(p[x]); //递归搜索 return p[x];// 最后返回}join函数()void join(int a,原创 2021-02-25 11:38:46 · 139 阅读 · 0 评论 -
数据结构——链表
文章目录单链表双链表单链表单链表操作:向表头插入一个数,删除第k个数后面的数在第k个数后面插入一个数代码实现://idx表示当前用到的下标,head表示头节点,e数组表示数值,ne表示指针只向下一个数int idx, head, e[N], ne[N]; void init() // 初始化 { idx = 0; head = -1;}void add_head(int x) // 将x插入链表头 { e[idx] = x; ne[idx] = head; h原创 2021-02-24 09:39:20 · 159 阅读 · 0 评论 -
数据结构——栈与队列
文章目录栈队列单调栈单调队列(deque)栈栈是一种操作受限的线性表只允许从一端插入和删除数据。栈的实现(1):STL中的stack:定义:stack<数据类型> P(变量名);插入x: P.push(x);返回栈顶元素:P.top();删除栈顶元素:P.pop();判断栈是否为空:P.empty(),为空返回1栈的大小:P.size();栈的实现(2)://数组模拟: int P[N], top; void init()// 初始化{ top =原创 2021-02-24 10:11:02 · 302 阅读 · 0 评论