![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
题解
用于acwing,洛谷,cf,leetcode等的题解
舍故景如旧
等候千帆过境的等候~
展开
-
trie树
trie树即为对每个字符串出现的字母进行插入操作使其形成一个树状结构例如:当我们要插入{abcd,dcb,bcd,ac}时,其形成的树状结构为由于每个不同的字符串的相同的字母所在的位置不同,则每个字母的节点数也不同,因此当前以节点为下标的字母出现的次数即为以该字母结尾的字符串的出现次数上代码: 1 #include<iostream> 2 using namespace...原创 2020-11-04 02:00:00 · 320 阅读 · 0 评论 -
朴素并查集
并查集(又加找父亲 hh) 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,并就是按一定顺序将属于同一组的元素所在的集合合并。 并查集的基本操作: 1.初始化,使每个节点的祖宗节点为自己。 2.将两个集合合并成一个集合。 3.查找两个元素是否在一个集合。 最关键的就是...原创 2020-11-05 02:04:00 · 46 阅读 · 0 评论 -
01背包
上题目:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是v[i],价值是w[i]。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有N行,每行两个整数v[i],w[i],用空格隔开,分别表示第i件物品的体积和价值。...原创 2020-11-04 15:12:00 · 40 阅读 · 0 评论 -
树和图的存储
树和图的存储方式是用链表来实现。 一般较常使用的单链表和邻接矩阵 由于目前只学了单链表就只叙述下单链表的实现单链表:(这里使用数组模拟的方式)单链表实现树和图的储存即开一个几个数组:e[i](储存当前节点的数值)h[i](储存每个节点的数值的头指针)ne[i](储存每个节点指向的下一个节点)1 void add_to_head(int a)//头结点插入一个a2 {3 ...原创 2020-10-28 12:04:00 · 418 阅读 · 0 评论 -
朴素Dijkstra算法
Dijkstra算法Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。问题引入:指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、...原创 2020-10-30 19:14:00 · 174 阅读 · 0 评论 -
二维未优化的动态规划的理解
动态规划的实质就是使用分治的思想,将当前的大问题分割成一个一个小问题来解决,最后用递推来实现每种问题之间的联系。未优化的动态规划就是使用二维数组来存储每种状态(按照我目前学的进度是这样,不能绝对的说)。 本质是对每一个小问题求出最优解,并且用递推的思想的来这种最优解的状态送到下一个问题,使得下一个问题能在保持上一个问题的最优解的情况下求当前问题的最优解。 例如:洛谷P1216(这题也...原创 2020-11-04 15:06:00 · 625 阅读 · 0 评论 -
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。(定义来自百度百科) 哈希表将关键值映射到一个表中,是通过对当前的数进行进行模运算,并以运算后的值作为下标来映射。当然这也就不可避免的会使多个值同时映射成同一...原创 2020-11-06 02:15:00 · 52 阅读 · 0 评论 -
字符串哈希
字符串哈希 说得通俗一点,字符串哈希实质上就是把每个不同的字符串转成不同的整数。 为什么会有这样的需要呢?很明显,存储一个超长的字符串和存储一个超大但是能存的下的整数,后者所占的空间会少的多,但主要还是为了方便判断一个字符串是否出现过,这是最基础的部分。并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复出现过。 当然也很容易想到,如果有不同的字符串转成同一个整数...原创 2020-11-06 19:47:00 · 68 阅读 · 0 评论 -
旅行商问题 —— 状态压缩
二进制的很多应用离不开集合这个概念,我们都知道在计算机当中,所有数据都是以二进制的形式存储的。一般一个int整形是4个字节,也就是32位bit,我们通过这32位bit上0和1的组合可以表示多大21亿个不同的数。如果我们把这32位bit看成是一个集合,那么每一个数都应该对应集合的一种状态,并且每个数的状态都是不同的。比如上图当中,我们列举了5个二进制位,我们把其中两个设置成了1,其余的设置成了...原创 2020-11-13 12:55:00 · 146 阅读 · 0 评论 -
spfa算法
以下理解为照搬两位大佬的理解,附上链接(%%%)1、什么是spfa算法?SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA一般情况复杂度是O(m)O(m) 最坏情况下复杂度和朴素 Bellman-Ford 相同,为O(nm)O(nm)。bellman-ford算法操作如下:for n次for 所有边 a,b,w (松...原创 2020-11-07 21:48:00 · 196 阅读 · 0 评论 -
约数
试除法求约数 1 vector<int> get_divisors(int x) 2 { 3 vector<int> res; 4 for (int i = 1; i <= x / i; i ++ ) 5 if (x % i == 0) 6 { 7 ...原创 2020-11-15 01:33:00 · 63 阅读 · 0 评论 -
堆优化的Dijkstra算法
堆优化的Dijkstra算法 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 这里的Dijkstra算法是经过堆优化的算法,...原创 2020-11-07 16:55:00 · 1898 阅读 · 0 评论 -
bellman_ford算法
Bellman-Ford算法,对于一个有向图,可以分别求出图中所有点到一个确定点的最短距离。基本思想就是枚举每一个点,判断通过该边能否使得其起点到原点的距离变短。对于边3-2,它可以使3-1变成3-2-1,从而使其距离变短,此过程称为松弛。(松弛点数,拉紧距离)边3-2可以松弛的条件:1.边3-2存在。(对于核心代码来说,枚举所有边就已经保证了其存在,否则将不可能被枚举出来)2.边2...原创 2020-11-07 19:46:00 · 116 阅读 · 0 评论 -
acm必学及各个阶段
转自CSDN大佬第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来。1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除4.二分查找.(代码可在五行以内)5...原创 2020-11-12 02:37:00 · 329 阅读 · 0 评论 -
Acwing 282.石子合并 —— 区间dp
区间dp问题,其基本思路就是对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优值。设F[i,j](1<=i<=j<=n)表示区间[i,j]内的数字相加的最小代价最小区间F[i,i]=0(一个数字无法合并,∴代价为0)每次用变量k(i<=k<=j...原创 2020-11-12 02:21:00 · 132 阅读 · 0 评论 -
分组背包问题
有NN组物品和一个容量是VV的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vijvij,价值是wijwij,其中ii是组号,jj是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数N,VN,V,用空格隔开,分别表示物品组数和背包容量。接下来有NN组数据:每组数据第一...原创 2020-11-10 01:57:00 · 47 阅读 · 0 评论 -
完全背包
有NN种物品和一个容量是VV的背包,每种物品都有无限件可用。第ii种物品的体积是vivi,价值是wiwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,VN,V,用空格隔开,分别表示物品种数和背包容积。接下来有NN行,每行两个整数vi,wivi,wi,用空格隔开,分别表示第ii种物品的体积和...原创 2020-11-09 16:29:00 · 47 阅读 · 0 评论 -
spfa判负环
算法分析使用spfa算法解决是否存在负环问题求负环的常用方法,基于SPFA,一般都用方法 2(该题也是用方法 2):方法 1:统计每个点入队的次数,如果某个点入队n次,则说明存在负环方法 2:统计当前每个点的最短路中所包含的边数,如果某点的最短路所包含的边数大于等于n,则也说明存在环每次做一遍spfa()一定是正确的,但时间复杂度较高,可能会超时。初始时将所有点插入队列中可以按如下方式理解:...原创 2020-11-08 11:32:00 · 195 阅读 · 0 评论 -
树和图的宽度优先遍历与深度优先遍历
树和图的两种遍历方式即为特殊的DFS和BFS用单链表储存树和图时,从每一个节点的头指针只能储存当前节点能到达的下一层的节点宽度优先遍历没有进行递归所以每一次搜索都是以头结点指向的位置 例如 1->2 1->3 1->5 2->8 3->6 3->7即h[1]->5->3->2->-1;h[2]->8->-1...原创 2020-10-28 12:13:00 · 257 阅读 · 0 评论 -
多重背包
有N种物品和一个容量是V的背包。第i种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有N行,每行三个整数vi,wi,si,用空格隔开,分别表示第i种物品的体积、价值和数量。输出格式输出一个整...原创 2020-11-10 02:19:00 · 41 阅读 · 0 评论 -
筛法求欧拉函数
顾名思义就是在用线性筛求质数的过程中将每个数的欧拉函数求出,时间复杂度为O(n);欧拉函数:题目:思路:求质数的过程中遇到了三种情况,分别是 if (!st[i]) prime[cnt ++] = i;if (i % prime[j] == 0) break;st[prime[j] * i] = true;接下来对三种情况分别进行分析:第一种情况表示当前的数 ...原创 2021-03-19 23:06:00 · 199 阅读 · 0 评论 -
欧拉函数
定义(来自WiKi):在数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)或是欧拉总计函数(totient function,由西尔维斯特所命名)。例题:AcWing: 873.约数之和代码: 1 #include <iostream> 2 #include <cstring>...原创 2021-03-19 01:57:00 · 86 阅读 · 0 评论 -
AcWing 166.数独
使用的优化:优化搜索顺序:每次选择分支最少的格子进行搜索可行性优化:每行每列每个九宫格不能有重复数字二进制优化:每行每列每个九宫格使用二进制数来表示每个数是否能够被使用,如果是1那么就能被使用,0就不能被使用,这样可以通过对行列九宫格进行与运算和lowbit运算可以快速的求出能使用哪些数#include <iostream>#include <cstring...原创 2021-03-10 01:43:00 · 103 阅读 · 0 评论 -
Acwing 272.最长公共上升子序列 —— 单调序列+最长公共子序列
熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。小沐沐说,对于两个数列A和B,如果它们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列,而所有的公共上升子序列中最长的就是最长公共上升子序列了。奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子序...原创 2020-12-22 03:00:00 · 67 阅读 · 0 评论 -
并查集(维护每个连通块的大小和每个点到根节点的距离版本)
例题Acwing 238.银河英雄传说有一个划分为N列的星际战场,各列依次编号为1,2,…,N。有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列。有T条指令,每条指令格式为以下两种之一:1、M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。2、C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间...原创 2020-12-21 22:11:00 · 194 阅读 · 0 评论 -
Acwing 242.一个简单的的整数问题 —— 差分树状数组(简单版)
题目链接:https://www.acwing.com/problem/content/248/ 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 8 ...原创 2020-12-29 18:15:00 · 66 阅读 · 0 评论 -
洛谷P1525 —— 带权值并查集
题目链接:https://www.luogu.com.cn/problem/P1525题目描述S 城现有两座监狱,一共关押着 N名罪犯,编号分别为 1 - N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为 c的罪犯被...原创 2020-12-24 18:40:00 · 80 阅读 · 0 评论 -
最小生成树——稀疏图——kruskal算法
kruskal算法适用于求稀疏图的最小生成树,其基本思想基于贪心,核心操作为并查集的查询和合并操作。思路为先对所有的权边进行排序,可以使用algorithm所带有的sort函数,然后枚举每一条边,如果入点和出点没有在同一个集合(并查集的查询操作)中那么就将这两个加入到同一个集合中(并查集的合并操作)。当每一条边都被枚举之后所求的就是最小生成树。我们可以简单地证明一下该算法,当两个点没有在同一...原创 2020-12-08 00:13:00 · 1420 阅读 · 0 评论 -
Acwing 239.奇偶游戏(带权值并查集和扩展域并查集)
小A和小B在玩一个游戏。首先,小A写了一个由0和1组成的序列S,长度为N。然后,小B向小A提出了M个问题。在每个问题中,小B指定两个数 l 和 r,小A回答 S[l~r] 中有奇数个1还是偶数个1。机智的小B发现小A有可能在撒谎。例如,小A曾经回答过 S[1~3] 中有奇数个1, S[4~6] 中有偶数个1,现在又回答 S[1~6] 中有偶数个1,显然这是自相矛盾的。请你帮助小B检查...原创 2020-12-24 00:09:00 · 2854 阅读 · 0 评论 -
洛谷2814(nt数据题)
链接:https://www.luogu.com.cn/problem/P2814输入格式输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。...原创 2020-12-22 02:04:00 · 53 阅读 · 0 评论 -
存图方式
ps:写这篇博客的原因是因为在一次比赛中需要按字典序来遍历图,就是这样一道简单的题,由于本蒟蒻只会链式前向星存图方式导致一直做不出来,深切感受到了来自图论的恶意!!!三种常见的存图方式;一、邻接矩阵邻接矩阵是使用二维的数组来实现存图方式,用于储存稠密图,第一维表示每一个点,第二维表示以这个点为出点的边,如果没有这条边则标记为无穷大。 1 //初始化 2 void init() 3 ...原创 2020-12-08 01:19:00 · 727 阅读 · 0 评论 -
Codeforces Round #683 (Div. 2, by Meet IT)部分题目
https://codeforces.com/contest/1447A题除了选中的数其他的都加上j等价于当前数减去j,因此只需从前往后依次输出即可。 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 6 usi...原创 2020-11-16 16:01:00 · 46 阅读 · 0 评论 -
Acwing 243. 一个简单的整数问题2 —— 差分树状数组(复杂引用版本)
题目链接:https://www.acwing.com/problem/content/244/ 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 8 ...原创 2020-12-29 18:28:00 · 109 阅读 · 0 评论 -
Acwing 1010.拦截导弹 —— 单调子序列
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导...原创 2020-12-05 03:43:00 · 134 阅读 · 0 评论 -
矩阵快速幂
矩阵快速幂 ———— 主要用于求解于斐波那契数列有关的题目。洛谷1962请你求出Fn % 1e9 +7 的值。【数据范围】 1 <= n <= 263代码:#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using nam...原创 2021-03-18 21:49:00 · 46 阅读 · 0 评论 -
最小生成树——稠密图——prim算法
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 #include <iostream> 5 6 using namespace std; 7 8 const int N = 505, INF = 0x3f3f3f3f; 9 int n, m;...原创 2020-11-28 02:41:00 · 698 阅读 · 0 评论 -
dfs常用剪枝策略
1.优化搜索顺序 大部分情况下应该选择优先搜索分支较少的点。2.排除等效冗余3.可行性剪枝4.最优性剪枝5.记忆化搜索原创 2021-03-09 21:09:00 · 1176 阅读 · 0 评论 -
Nim游戏
定义Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(简称ICG)。条件满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限...原创 2020-11-20 03:12:00 · 3287 阅读 · 0 评论 -
AcWing 1076.迷宫问题 —— 记录路径的bfs
给定一个n×nn×n的二维数组,如下所示:int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。数据保证至少存...原创 2021-01-22 17:04:00 · 57 阅读 · 0 评论 -
算法数学知识需用定理
费马小定理费马小定理(Fermat's little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,即a和b两个数互质,则有a^(p-1)≡1(mod p)。裴蜀定理裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a...原创 2020-11-16 21:05:00 · 151 阅读 · 0 评论