算法
基于C++
Zqchang
这个作者很懒,什么都没留下…
展开
-
今日洛谷题
P8278 「MCOI-08」Fill In一个灰常简单的题目让我做了三个小时,得到的启发就是,不要觉得想的对就是对的,写出来,化简一下看看sum - sum / (cnt + 1) * (cnt + 1) 和 sum % (sum / (cnt + 1)) 有区别吗,看起来有点困难是吧a - a / b * ba %( a / b )那这样呢?是不很明显不一样,然后我就是这里挂了P8279 「MCOI-08」Fill In REMATCHP8279 「MCOI-08」Fill In原创 2022-07-07 20:14:07 · 152 阅读 · 0 评论 -
单调队列之滑动窗口
滑动窗口单调栈和单调队列都是一样的,就是先考虑用栈和队列暴力的模拟原来这个问题,再看一下朴素算法里面,栈和队列哪些是没有用的,然后把这些所有没有用的元素删掉,在看一下是不是有单调性,如果剩下的元素有单调性的话,就可以做优化了,取极值和最值可以直接取两个端点。找一个值就可以用二分我来形象的解释一下原理,比如这个题目的样例以最小值为例#include <cstdio>#include <iostream>#include <algorithm>#include原创 2022-04-27 14:56:43 · 294 阅读 · 0 评论 -
map和set如何按照自己的想法来排序
今天做题,终于想起来去解决这个困扰了我不少时间的问题了第一:vector会吧,把map或者set里面的元素用auto或者迭代器输出到vector里面,然后再进行自定义一个cmp,用sort就可以啦由于这个过于比较简单,就不多写什么了第二map会按照key进行排序,这已经不是什么秘密了就是要自定义一个类了,这个类应该是一个结构体类型的,就像是这样参考1struct cmpp //自定义set排序{ bool operator()(const pair<int, string&g原创 2022-04-18 21:06:33 · 188 阅读 · 0 评论 -
宽度优先搜索(BFS)基础版
BFSFlood Fill(洪水覆盖算法)核心思想实现效果例题最短距离最小步数特点1.BFS可以求最小,第一次搜到就最小2.BFS是一个基于迭代的算法,所以他有一个很重要的特点就是,他不会爆栈,这个主要是针对DFS说的,也就是当一个问题的搜索层数可能很深的时候,但是节点个数不深的时候, 如过DFS和BFS都可以的话,我们优先选择BFSFlood Fill(洪水覆盖算法)核心思想核心思想:从一个起点开始,然后每一次,我们随机选择一个新加进来的格子,然后看一下它周围,能不能扩展新的格子,如果周围能扩原创 2022-04-04 20:08:17 · 1384 阅读 · 0 评论 -
龟速乘(用加法实现乘法)
好处是不需要写高精度,当两个数很大的时候,相乘也不会需要写高精度,只需要用龟速乘就可以实现,写法类似快速幂,只不过快速幂是用乘法实现乘方long long 的最大范围内是2632^{63}263 - 1也就是9 x 101810^{18}1018我看了题解,感觉自己闲的写这个博客,就是把快速幂所有的乘法变成了加法ll qadd(ll a, ll b, ll p){ ll res = 0; while(b) { if(b&1) res = (res +原创 2022-03-26 19:43:37 · 396 阅读 · 0 评论 -
启发式合并
启发式合并定义普通启发式合并树上启发式合并类似并查集里面的按秩合并定义一开始是每一个数单独一个集合每一次是将某一个集合里面所有元素,合并到另外一个集合里如果用暴力来进行合并的话,假设每一次合并都是O(op)的时间复杂度,然后按照最坏的情况,一共有n个,第一个合并到第二个里面,第二个再合并到第三个里面,以此类推,然后这样的话,第一次操作一个数,第二次操作两个数,以此类推,一直到最后一个需要操作n-1位数,这样总共的时间复杂度就是O(n2n^2n2op)时间复杂度较高然后我们在合并的时候,可以考虑做一原创 2022-03-26 18:22:02 · 1664 阅读 · 0 评论 -
并查集的笔记
并查集朴素版路径压缩按秩合并合并维护size的并查集维护到祖宗节点距离的并查集参考网站好久之前学的了,但是之前就只会用板子,不会默写,昨天跟hr一起打了浙江的一个小比赛,发现hr真猛啊,基本上都会默写,不过也理解了hr为什么上ban位,下次建议把hr嘴一起封上啊并查集无非两个操作嘛,并和查然后合并的时候呢,为了快,又有两个优化,一个是路径压缩,另一个就是按秩合并先写一个朴素版的朴素版// 递归int find(int x) { // 寻找x的祖先 if (fa[x] == x) /原创 2022-03-21 19:09:44 · 54 阅读 · 0 评论 -
bellman_ford+spfa
bellman_ford+spfabellman_fordbellman_ford它的存边方式就比较随意了,可以随便存,只要能遍历到所有的边就行,也就是可以用结构体直接进行存储如果有负权回路的话,最短路不一定存在原创 2022-03-17 20:47:17 · 1131 阅读 · 0 评论 -
Kruskal算法
Kruskal算法Kruskal算法Kruskal算法学到了Kruskal的妙用,而且,能用prim的一定能用Kruskal算法,能用Kruskal算法的prim不一定好搞局域网这个题目中可是没有保证图一定联通,所以选点就比较难写,也就是Prim算法难搞,那就用Kruskal算法呗,大意为给你一个图,让你去掉权值和尽可能大的边,还要保证图联通然后就转化成,每个连通块求一个一个最小生成树,就直接kruskal,仔细一想,确实,毕竟Kruskal算法不受连通图影响haha#include <i原创 2022-03-16 19:35:25 · 224 阅读 · 0 评论 -
topsort
为蓝桥杯默写的topsort,yysy,vector比链式向前星好用#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e5 + 10, M = 1e5 + 10;int n, m, a, b;int ru[N];vector<int> v[N], res;queue<int> q;void topsort(){ for (int i原创 2022-03-15 19:22:16 · 212 阅读 · 0 评论 -
前缀和的题目
yysy,这可真是个好题,下午开始搞,一直到现在(中途出去玩了,但是我不承认 )01序列这是我的AC代码,emmm,一开始就注意到了k=0,但是写着写着忘了,可恶这里先说一下思路,就说,先搞出来一个前缀和,然后搞一个num数组,记录一下前缀和相同的有几个,然后开始从头遍历,对于每个sum[i] - k,它的num就是答案要加上的,你可能会疑惑,明明sum[i] - k的个数中,有一个是1,然后就会导致有k+1个1了,就不对了,实际上,这个1你可以看作,是有k个1长度的子串的开头的那个,然后特判0那个情原创 2022-03-11 20:56:22 · 178 阅读 · 0 评论 -
getline读入
getline读入的时候,会把回车也读入进去所以在正式开始读入之前,要先getline(cin, s)一下,去掉之前的回车然后就开始读入一整行啦,就开始用stringstream ssin(s)//s是自己定义的字符串string,就可以把ssin当成cin用,然后从这个字符串s里面读取东西 string line; getline(cin, line); // 忽略掉第一行的回车 while (cnt -- ) { getline(cin, line);原创 2022-03-09 00:10:38 · 1739 阅读 · 0 评论 -
打表找规律
买不到的数目题意,自己看这种结论题,我没有积累所以,我只能打表找规律一看这个题目就能想起来gcd,然后就是gcd(n, m)==d,然后只要不是d的倍数,他都凑不出来然后发现,题目里面说,肯定有解,尴了个大尬,然后肯定就gcd(n, m) ==1,然后有一个裴蜀定理,都知道吧 ap + bq = 1(a和b一定是整数,但是不一定是正整数),然后就是如果想凑出来m的话,就是amp + bmq ==m, 然后(am-q)p + (bm+p)q ==m,就可以证明出来,对于上式可以递归,每次让大的那原创 2022-03-05 21:43:12 · 170 阅读 · 0 评论 -
递归转化为非递归
来个例题唔,就用这题来讲一下吧计算机实现递归也不是真的递归,是用栈来存储每一个状态,我们这里也是这样,就直接模拟一下这个操作,递归是分叉的,栈是个串的,就是要记录好,遍历到哪个分支的那一部分了就是看一下,这个函数,需要记录哪些状态才能保证我们回溯的时候,能继续进行,这里很简单,就是看一下,从哪里进去的就可以,就是记录当前递归函数执行到哪一步了。每一次执行到递归之前,我们先把当前状态放进去表示我们之后要从这里继续执行,然后递归执行详见代码,代码中有详细的注释#include <iostream原创 2022-02-24 20:15:17 · 434 阅读 · 0 评论 -
高精度压位(压位比较快)
加法可以压九位乘法压四位为什么乘法压四位呢?因为压五位一乘爆int(十万的平方)现在带大家看一下如何压九位例题来咯我们先把A和B的每九位放到一个里面,每一次就mod 1e9 和 除1e9,也就是下面的base输出的时候,第一个直接输出,不需要前补0,后面的如果不满九位要补0#include <iostream>#include <vector>using namespace std;const int base = 1000000000;vector<原创 2022-02-02 18:00:13 · 882 阅读 · 0 评论 -
树的数组存储
之前一直没写,每次又都忘,记录一下吧// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int h[N], e[M], ne[M], idx;//这里的e[]存储所有的边 //这里e[]里面的大小应该是边数 // 添加一条边a->bvoid add(int a, int b){// 比如这里是2->1->-1中间插入3变成2->1->3->-1 ,这里a就是2,b就是3 e[idx] = b, ne[idx] =原创 2022-01-22 01:51:46 · 487 阅读 · 0 评论 -
SDNU1031
传送门一个坑人的拓扑排序,这个你要明白它的三种状态,顺序完全能够排出来,有自环,顺序不完全能排出来,这时候你就要想到一个问题,会不会有一种情况,那就是,自环和不能完全判断顺序并不冲突,在这个时候,你就要先输出自环的情况,因为你排到某个的语句的时候,就可能已经存在自环了,但是你一直要到最后才能知道它到底是不是顺序不能确定。每次输入都要记得判断自环,因为你要记录下第几句开始有自环上代码#include <cstdio>#include <iostream>#include &原创 2021-09-28 00:18:14 · 102 阅读 · 0 评论 -
SDNU1030
传送门这是一个看起来像最小生成树的最短路径首先我们要理解最小生成树和最短路径的区别最小生成树,顾名思义就是要求几个点连通起来的最小代价最短路径:就是要求一个点到其余每个点的最小代价这个手动推一下就能发现,它是等于每个点乘它的最短路径所以用最短路径,spfa#include <cstdio>#include <iostream>#include <algorithm>#include <map>#include <string>原创 2021-09-28 00:02:10 · 105 阅读 · 0 评论 -
如何计算空间复杂度
首先要知道一些基本的,比如一个 int四个字节,C++中,一个char一个字节,JAVA中char两个字节。long long八个字节64位float四个字节, double八个字节(double里面包含了long long的数,上课问老师所得)然后计算就可以,不过要注意不能全部用来开数组,要留出来一部分,用于其他开销2.并不是数组开多大就用多大,操作系统会自己动优化,如果我们开一个很大的数组但是不用的话,也是不占空间的。...原创 2021-09-23 21:17:17 · 121 阅读 · 0 评论 -
hdu3038 并查集加权问题
TT and FF are … friends. Uh… very very good friends -________-bFF is a bad boy, he is always wooing TT to play the following gamewith him. This is a very humdrum game. To begin with, TT should writedown a sequence of integers-_-!!(bored).Then, FF can .原创 2021-01-29 22:27:31 · 112 阅读 · 0 评论 -
二分讲解已更新
二分之各种形式介绍首先诉苦哇,我用了好几天,最后在师哥的帮助下终于找到了合适自己的二分法,好了,开始写正文大家首先要明白什么是二分,还不了解的可以看这篇具体详解你以为这样就结束了?想啥呢,如果这就结束了,我还需要写这篇文章???相信你经过上面已经对二分有了了解,但是不知道你是不是奇怪过,这么多二分究竟用哪个合适?是啊,二分法的样子实在是太多了,我也是陷入其中了,我这几天从网上拼命的找资料,但是最后发现,没有一篇特别介绍的,于是,它来了!!!首先介绍第一种板子!int erfen1(int l,原创 2021-04-16 20:47:35 · 155 阅读 · 0 评论