- 博客(43)
- 收藏
- 关注
原创 莫比乌斯反演及其前置知识
积性函数是一种数论函数(即定义域在正整数上的函数)如果∀abab1fabfa⋅fb∀abab1fabfa⋅fb,则该函数为积性函数设fngnf(n), g(n)fngn是两个数论函数,则它们的狄利克雷卷积也是一个数论函数,记为hn∑d∣nfd⋅gdhn∑d∣nfd⋅gd,简记为hnfn⋅gnhnfn⋅gn。
2023-08-20 23:51:23
266
原创 Hello 2023题解
由于此时与栈顶元素相同,不消耗剃刀。同理,如此将所有的元素扫描一遍。如果遇到剃刀数量不够的情况,则输出。然后从前往后扫描一遍,利用单调栈来存储头发的长度,每次将小于当前长度的头发弹出。中放任最小值乘上-1,并将操作次数+1。然后下一个遇到的长度是。中的最大值乘上-1,并将操作次数+1。的位置,然后判断是否交换即可。从m+1不断往后加,如果。首先读入的时候判断,如果。当n为奇数时,循环输出。当n为偶数时,循环输出。从m往前不断加,如果。将所有的剃刀数量存入。以上样例,我们先是将。依次存入栈当中,剃刀。
2023-01-04 13:26:49
960
原创 Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT题解
我是废物,掉大分了。
2022-12-20 15:31:56
660
2
原创 Codeforces Round #839 (Div. 3)题解
我们可以将数分为三类,一类是只有先手想要染的(数量为a),第二类是只有后手想要染的(数量为b),第三类是两者都要染的(数量为c)。上述例子中,后手想要赢的话,只要将3、4、5都染成蓝色, 那么他就可以将这三个数从新排布得到降序的数组;而先手想要赢的话,就要将所有的都染成蓝色, 所以后手赢。这题的题意有点含糊,其大意是,两个操作,将一个红色染成蓝色, 或者将蓝色的位置之间任意排序。我是撒比,这题开始用二分答案来写,卡了一个半小时。此时可以选择3或者5将其染成蓝色,这里不做演示。,不足的在从大到小标记。
2022-12-19 16:26:42
1231
原创 Educational Codeforces Round 140 (Rated for Div. 2)题解
看看时间还有十几分钟,开不出来题了,写个题解。
2022-12-17 00:35:53
738
原创 Educational Codeforces Round 139 (Rated for Div. 2)题解
以上19种情况,一位和二位去满各有九种情况,三位只能取一种情况,所以共19种。只要有两个相同的两位子串,就说明可以用小于n次操作将字符串输入。然后通过差值寻找答案即可,当差值为k的时候,长度一定是k的因数。这里的话,我们将每一纵坐标标记为三种状态,状态1(2), 偶数个状态3,状态2(1)状态1(2), 偶数个状态3,状态1(2)有且仅有两者差值为1的时候,链可以无限长。,满足题目要求的情况有。当n为3位数时,例如。
2022-12-13 19:03:53
751
10
原创 Quests题解
这题的rating是1500,是我上个月写的。闲着没事再写一遍,发现不能一遍过,写个题解。的数值,得到最大的就可以。当然,这里使用二分来进行优化。我们只需要将数组进行从大到小排序排序,然后尝试每个。如果最后的结果是-1,则说明不存在。最后我们来看看完整代码。然后是check函数。
2022-12-11 11:02:49
180
原创 十一月codeforces题单与总结
在意识到自己的思维过于呆板只会写板子题之后,我决定搞点思维题来练练思维,这个月都在忙着写基础的思维题,没有花时间在算法学习上。之后慢慢减轻思维题的时间占比,提高算法学习的占比QAQ
2022-12-03 16:10:51
508
原创 Codeforces Round #836 (Div. 2)题解
交换,来减小字典序。那么,与3交换的下标除了满足是3的倍数这一条件之外,还要是18的因数,这样才能将18放在上面。我们将18放在了3上,18是3的倍数,这个操作是可行的。上,构造出一个可行但是字典序不一定是最小的数组。的倍数时,我们无法将所有坐标填满,则不存在。这题倒是简单,将字符串正反输出一遍就好了。的倍数,可以将他们当中的数与。然后我们继续往后看,发现。就这样一直交换下去即可。不难看出,他们的和为。,最大值和最小值的差为。不难看出,他们的和为。
2022-11-26 17:52:06
219
1
原创 Mark and His Unfinished Essay题解
这题的rating是1400,对于我这种蒟蒻来说,还是稍微有点难度的QAQ但是这题没有涉及任何算法,纯纯的思维题,还是有点巧妙的(有点类似KMP的思路,使用跳转数组)
2022-11-15 01:02:53
272
原创 Ela‘s Fitness and the Luxury Number题解
这道题的rating是1300,是一道数论题,代码实现倒是比较简单,所以这里着重讲解公式的推导,代码贴在最后就好了。注意:这里的开根号不能用sqrt函数,会有精度问题,要用二分来写。我们假设有一个数x,它的取值范围为[上边就是整个的推到过程了,代码在下边。)之间的符合要求的数,即[那么,我们来算一下在[是整数,其余的都是分数。如果我们将它们重新乘上。内符合要求的数的数量为。,在这些数之间,只有。
2022-11-09 00:27:58
207
原创 C++搜索算法
搜索一、Flood Fillflood fill算法通常是用于计处理连通块问题,由于其算法思路由一个连通块蔓延到周围的连通块,类似洪水蔓延,故得此名。flood fill算法本质上还是bfs算法,将周围的连通块看作同一父结点的子结点,不难看出是一个树状结构。模板如下://Flood Fillbool vis[N][N];//标记一个点是否被搜索过int mx[4]{0,-1,0,1},my[4]{-1,0,1,0};//偏移数组int bfs(int i,int j)//从i,j开始搜
2022-05-23 18:13:45
2370
原创 班级小工具二【随机抽取同学】
这里还是和之前的一样,先在src文件夹下创建ANSI格式的.txt文件用于存储名单,我这里用到了接龙检测中用到过的班级名单,还有将男生和女生分别列了出来class Random_People{#include<ctime> string name[40]; ifstream op; bool vis[40]; int num, oprt; int num_people[4]{ 0,39,20,19 };public: void get_na
2022-05-07 00:03:52
1018
原创 班级小工具一【微信接龙】
该段代码的作用就是检查班级中谁没有在微信群中接龙。直接将最后一位接龙的同学发的接龙信息复制粘贴进来即可。在使用该段代码之前,在源代码同一文件夹下创建一个名为src的文件夹用于存储各种名单,此时在src文件夹内创建一个ANSI格式的.txt文件,用于存储班级名单。class Name_Solitaire{ string name[40], cname[40], b; ifstream op; bool vis[40]; char c;public: void ge
2022-05-06 23:59:53
927
2
原创 A_star算法
A*算法A* 搜索算法,即A star search algorithm,简称A* 算法。 是一种在图形平面上对于多个节点的路径求出最低通过成本的算法。是对图的遍历和最佳优先搜索算法,也是对BFS的改进。其思想在于为每个状态建立启发函数,用启发函数制约搜索沿着最有效的方向行进。如图为八数码,求将左图变为右图需要的步骤。传统的BFS算法是将0四周的数与0交换,然后将其放入队列中,通过盲目地对有限的数据进行尝试最后求得答案,这样的时间复杂度较为复杂。而A*算法中通过加入启发函数对搜索的优先次序进行约束,以
2022-04-28 18:04:23
1814
原创 数学知识(数论)
数学知识一、素数(质数)假如给你以一个正整数N,你能否找到1~n之间所有的素数?素数的脾气,可不好惹。1.双层循环暴力求值这个求法没什么好讲的,就是两个for循环嵌套一下遍历所有的数,代码如下。void Prime(int n){ vis[0] = vis[1] = 1; for(int i = 2;i <= n;i++) { for(int j = 2;j < i;i++) { if(i % j
2022-04-14 17:08:49
927
1
原创 矩阵快速幂以及其优化【华东交大课程】
矩阵快速幂以及其优化【华东交大课程】快速幂基础:C++快速幂_Kicamon的博客-CSDN博客矩阵快速幂就是在快速幂的基础上结合矩阵运算的用法,其用途较为广泛,可以很大程度上优化代码。一、矩阵快速幂的实现在矩阵快速幂中,我们利用类来存储矩阵及其运算法则。我们先来看看代码的具体实现,再来讲解其语法。struct Matrix{ ll a[N][N]; Matrix()//构造函数 { memset(a,0,sizeof a); }
2022-03-20 00:12:40
442
5
原创 C++动态规划
动态规划文章目录动态规划一、背包问题1、01背包问题2、完全背包问题3、多重背包3.1、多重背包的朴素实现3.2、二进制优化多重背包4、分组背包二、线性DP1、数字三角形2、最长上升子序列2.1、最长上升子序列的朴素实现2.2、优化3、最长公共子序列4、最短编辑距离三、区间DP四、计数DP五、数位统计DP六、状态压缩DP1、蒙德里安的梦想2、最短Hamilton路径七、树形DP八、记忆化搜索一、背包问题1、01背包问题01背包问题就是通过遍历选择是否选第i个物品,以达到总价值最大:#include
2022-03-15 19:39:58
2345
1
原创 二分图相关
二分图相关一、染色法判定二分图二分图要求边的两端点处于不同的集合,那么将两端点分别染成不同的颜色,如果没有冲突,则说明是二分图。首先是dfs函数,深搜进行染色:bool dfs(int u,int c){ color[u] = c; for(int i = h[u];i != -1;i = ne[i]) { int j = e[i]; if(!color[j]) { if(!dfs(j,3 -
2022-02-24 00:33:05
88
原创 最小生成树
最小生成树一、Prim求最小生成树Prim最小生成树的原理是将一 点与集合中距离最近的点连接,在将其加入集合中,循环此操作。代码与dijkstrs算法类似,如下:const int INF = 0x3f3f3f3f;int dist[N],g[N][N];bool vis[N];int prim(){ memset(dist,0x3f,sizeof dist);//dist储存的是每个点到集合的距离,先将其初始化为无限大 int ans = 0;//存储答案 for
2022-02-22 19:08:40
133
原创 利用spfa算法求最短路与判断负权回路
利用spfa算法求最短路与判断负权回路spfa算法是对dijkstra算法的优化,大致内容与dijkstra算法相似,但是在更新距离前会判断,距离是否缩小。如果距离缩小,则更新并将该点加入队列,反之则不更新也不加入队列。一、求最短路先看看dijkstra算法的写法:void dijkstra(){ memset(dist,0x3f,sizeof dist); dist[1] = 0; proirity_queue<PII,vector<PII>,
2022-02-19 13:11:25
312
原创 有边数限制的最短路
有边数限制的最短路在只能经过有限边数的限制之下,想要求出最短路问题使用的算法是Bellman-Ford算法比如这题:853. 有边数限制的最短路 - AcWing题库控制边数的方法是限制循环的次数,而不是像dijkstra算法那样讲所有的边都遍历一遍。但是有一点需要注意,由于结点的更新,可能会发生局部深搜。如图:#mermaid-svg-EtWqIu2r3he4qucL .label{font-family:'trebuchet ms', verdana, arial;font-family:v
2022-02-18 21:48:54
268
原创 Dijkstra求最短路
Dijkstra求最短路dijkstra算法是利用贪心的策略,每次遍历访问一结点未被访问的邻接结点,每次比较距离决定是否更新最短路。一、朴素dijkstra算法在数据范围较小的时候,可以使用邻接矩阵的储存方式完成dijkstra算法。首先声明一个二维数组g用于储存两节点的距离,在初始化时将其设置为0x3f3f3f3f(即两节点未连接之前距离为无限大),由于存在重边,每次比较取最小值即可。即g [i] [j]存储的就是i到j的距离。然后利用取当前距离起始点最近的点,因为该点的距离已经被确定为
2022-02-17 00:30:04
541
原创 有向图的拓扑序列
有向图的拓扑序列一、简介1、概念拓扑序列是顶点活动网中将活动按发生的先后次序进行的一种排列。 拓扑排序,是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。2、简单举例:#mermaid-svg-3au2N9m0Q7aYz8kq .label{
2022-02-14 23:42:57
9048
原创 数与图的深度优先遍历&树与图的广度优先遍历
树与图的深度优先遍历&树与图的广度优先遍历树与图的两种遍历方法是基于dfs和bfs思想之上的算法,其思想依然是递归,但是遍历对象变成了无向图,所以在图的构建和搜索过程中多了一些注意事项。一、树与图的深度优先遍历深度优先遍历与dfs类似,将树与图中的各条分支给依次遍历一遍。1、构造由于是无向图,它构建起来不同于普通的树,首先看代码:int e[N],ne[N],h[M];//M = 2 * N;int idx;void daa(int a,int b){ e[idx]
2022-02-14 18:50:01
597
原创 哈希表的简介与应用
哈希表的简介与应用如题:840. 模拟散列表 - AcWing题库将-109 ~ 109范围内的数映射到0 ~ 105中,是这题的重点。如何让一个较大的数变成一个较小的数呢?一般我们想将数的范围缩小是将这个数取模,想要将数据控制到什么范围内,就对这个数取模。比如这题,我们将输入的x mod 1e5之后就得到它的存储下标。什么意思呢?例如需要插入的数为1e8+648,那么将他储存在数组中下标为1e3+648的位置中。不过还有一个问题,那就是取模后的重复问题,不同的数在取模时候可能是相同的,那么这时候如何
2022-02-12 15:42:10
457
原创 C++模拟堆
模拟堆一、什么是堆?堆是一类特殊数据结构的总称,通常可以看作一棵树的数组对象,且满足以下性质:堆中的某个节点的值总是不大于或不小于其父结点的值堆是一颗完全二叉树堆可以用STL实现,但是这里用代码去模拟它以学习它的思想,这里用最小堆为例。堆的每个结点(除了最后一层)都存在两个子结点,这两个子结点均不小于该节点的值,见下图:#mermaid-svg-ul0zbzZC10r2Tl6G .label{font-family:'trebuchet ms', verdana, arial;font
2022-02-11 22:58:19
681
原创 并查集的原理与应用
并查集的原理与应用并查集是一种树状数据结构,作用是查找或者合并集合。比如查找元素a是否在集合1中、合并集合1与集合2,都可以通过并查集做到。一、并查集的原理(一)集合的创建:并查集是树状数据结构,创建集合的原理是将元素看作结点,将结点连接即可做到创建一个集合。当集合只有一个元素时,该结点与自己连接。在初始化时,我们可以将所有的元素都看作一个集合。如图:#mermaid-svg-DcAjIRYtmVe6fDrR .label{font-family:'trebuchet ms', verdan
2022-01-24 15:48:12
556
原创 Trie树
Trie树Trie树,即字典树,是一个非常巧妙的数据结构,能够有效得优化代码的运算速度,最重要的是学习它的思想。1.什么是Tire树?Tire树是一种具有快速搜索特性的树状数据结构,常常被单词查询系统使用。它的特点如下:具有一个不包含任何元素的空结点作为根节点,任何搜索都从根节点开始。从根节点到某一分结点,这条路径上的与每个节点的元素组合起来就是查询结果。每个结点的子节点的元素各不相同。我们就以用它来存单词为例:存入单词:abandon、aboard、afterward、baby
2022-01-23 15:14:09
418
原创 KMP算法
KMP算法kmp算法通常被用于查找某一字符串的子串位置的的问题中,也叫做串的模式匹配。比如说主串为 1,2,5,2,2,5,4,3模板串为 2,2,5如果位置从0开始,那么字串的位置为3,返回3即可。kmp就是快速是实现这一操作的算法。以这题为例:831. KMP字符串 - AcWing题库朴素算法实现:首先我们看看朴素算法,朴素算法就是利用两层for循环对比主串和子串,这么做会TLE下边来看看代码,比较简单:char p[N],s[N];for(int i = 0;i <
2022-01-23 11:01:39
618
原创 单调栈与单调队列
单调栈与单调队列1. 单调栈单调栈,顾名思义就是一个具有单调性的数列,而且它具有栈的性质。例如这题:830. 单调栈 - AcWing题库实现单调栈只需要一个for循环即可,这里是单调递增的单调栈的代码:for (int i = 0; i < n; i++) { int a; cin >> a; while (tt && b[tt] >= a)--tt; if (tt)cout << b[tt] << ' ';
2022-01-21 18:36:30
494
原创 利用递归实现从数列中选取n个数相加
利用递归实现从数列中选取n个数相加这个问题是本质上是高中的排列组合问题的一种,比如从3,6,8,9四个数中任选三个数相加,有以下几种选法:3 + 6 + 8 = 173 + 6 + 9 = 183 + 8 + 9 = 206 + 8 + 9 = 23利用c/c++的递归可以实现这一过程例如这题:[P1036 NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)先用利用筛法将1e8范围内的素数全部筛出来,用bool数组标记为true,然后判断递
2022-01-21 12:21:08
513
原创 dfs与bfs
dfs与bfs1.dfsdfs全称为Depth First Search,即深度优先搜索。它的思想是沿着每一条可能的路径一个节点一个节点地往下搜索,搜到了路径的到终点再回溯,一直到所有路径搜索完为止。在回溯的时候,需要将该结点恢复成原样。其特定是后进先出。如图,它的搜索路径为:a -> b1 -> c1 -> b1 -> c2 -> b1 -> a -> b2 -> c3 -> b2 -> c4 实现它的方法与递归类似,比如说这道排
2022-01-20 15:11:36
789
原创 C++快速幂
快速幂所谓快速幂,就是快速求以a为底的n次幂(即an)的相关操作。1.低精度的快速幂1.例如这题:875. 快速幂 - AcWing题库由数学知识可知:a * b mod m = (a mod m) * (b mod m) mod m。那么就可以将ab mod p转换为若干ak(k = 2n) mod p的乘积。这一操作在二进制上进行,例如:35 mod 2,5的二进制为101,那么就是(3a mod 2) * (3b mod 2) mod 2【a = 20,b = 22】#define ll
2022-01-19 09:10:48
3187
原创 整数有序区间和的注意事项
整数有序区间和的注意事项区间和是离散化的运用到典例。所谓离散化,是一种缩小程序数据的方法,能够降低程序的时间复杂度。先看例题:802. 区间和 - AcWing题库这道题的完整代码如下:#include<iostream>#include<vector>#include<algorithm>using namespace std;const int N = 3e5 + 10;int n, m;typedef pair<int, int&g
2022-01-18 00:43:20
307
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人