02 2022 档案
摘要:注意三点: 1、朋友圈只有一个人的 不能算进集合里 2、不能重复输出同一个人 3、注意输出前导0 AC代码: #include <iostream> using namespace std; const int N = 1000010; int q[N]; int n; int main() { c
阅读全文
摘要:这里预处理要用到快速幂求逆元的操作。。。忘记了就复习。 #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N = 1000010, mod = 1e9 + 7;
阅读全文
摘要:快速幂求逆元: #include <iostream> #include <algorithm> using namespace std; typedef long long LL; int n; LL qmi(int a, int b, int p) { LL ans = 1; while(b)
阅读全文
摘要:常用组合数的递推式: 解释: 有a个苹果,从中拿b个苹果; 我们先确定一个苹果a。 然后有两种情况: 一是不包括苹果a,从中拿b个苹果。 二是包含苹果a,再从中拿b-1个苹果。 如此递推。 #include <iostream> using namespace std; const int N =
阅读全文
摘要:基本模型: 找到每一个数左边离他最近的且比他小的(当然也可以反着来); 我们利用一个栈,当栈顶的数比当前的数大(或者等于),那么当 当前的数插入到栈中时,如果下一个数比当前的数(假设已经插入到栈里面了)小,那么当前栈顶的元素就永远用不到了,所以我们可以去除当前栈顶的元素。这样的话,我们这个栈就会呈现
阅读全文
摘要:#include <iostream> #include <algorithm> #include <unordered_map> using namespace std; typedef long long LL; const int mod = 1e9 + 7; int n; int main(
阅读全文
摘要:公式: #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; const int mod = 1e9 + 7; int n; int main() { cin >> n; unor
阅读全文
摘要:#include <iostream> #include <vector> #include <unordered_map> using namespace std; class Myclass { public: int first; vector<int> second; // 重载等号,判断两
阅读全文
摘要:#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> get_divisors(int x) { vector<int> ans; for(int i = 1; i <=
阅读全文
摘要:#include <iostream> using namespace std; const int N = 1000010; int primes[N]; bool st[N]; int n, cnt; void get_primes(int x) { for(int i = 2; i <= n;
阅读全文
摘要:我们把从1~n中的数从小到大枚举,在枚举数字i的时候,我们同时要把1~n中所有i的倍数筛掉,这样一直到最后,剩下的数就是1~n中所以的质数。 Code: #include <iostream> using namespace std; const int N = 1000010; int prime
阅读全文
摘要:证明一下循环里面的 i 一定是一个质数:假如 i 是一个合数,那么它一定可以分解成多个质因子相乘的形式,这多个质因子同时也是 a 的质因子且比 i 要小,而比 i 小的数在之前的循环过程中一定是被条件除完了的,所以 i 不可能是合数,只可能是质数 n中最多只含有一个大于sqrt(n)的质因子。证明通
阅读全文
摘要:素数(质数) 是 大于 1 的 数 且 因数只有1 和他本身 #include <iostream> using namespace std; bool is_prime(int x) { if(x < 2) return false; for(int i = 2; i <= x / i; i++)
阅读全文
摘要:我们可以通过枚举第一行的每一种状态,然后后一行的状态只能由前面一行确定,这样就可以找到对应的最小步数。 我的Acwing里的题解: 开始给我看懵了,一直不理解下面这行代码 for(int i = 0; i < 5; i++) if(op >> i & 1) { turn(0, i); cnt++;
阅读全文
摘要:类似与快速幂。 由于数据范围很大,我们不能直接用a*b 否则会爆longlong。 我们同样可以采用将b拆分成其对应的二进制形式,然后再用a去乘。 比如说: 4*5 = 4 * (101) = 4*(2^2+2^0) 同样,不管b的二进制最后一位是否为1,a都要乘2,如果是1,结果就乘上a,如果是0
阅读全文
摘要:由于数据比较大,所以我们不可能直接求。 我们可以考虑把拆分成其对应的二进制形式,然后进行求解。 比如说:a = 4, b = 5 那么b的二进制形式就是: 0101 那么4^5 = 4^(2^2+2^0) = 4^2^2 * 4^2^0 由于二进制中相邻两位存在2倍关系,不管b的最后一位是否为1,a
阅读全文
摘要:结论: 证明: 第一个不用证明,很明显 第二个: 假设wi+si>w(i+1)+s(i+1) 由于wi+si > w(i+1)+s(i+1) wi+si > si 所以交换后 两头牛的风险的最大值一定是小于交换前两头牛的风险的最大值的! 那么总体的风险的最大值就不可能增加,只可能不变或减小。所以得证
阅读全文
摘要:所以如果是奇数个,那么就是中间那个数,如果是偶数个,那么就是中间两个数任意一个 代码: #include <iostream> #include <algorithm> using namespace std; const int N = 1000010; int q[N]; int main()
阅读全文
摘要:代码: #include <iostream> using namespace std; int main() { int n, ans = 0, m; cin >> n; while(n--) { cin >> m; ans = ans^m; } if(ans) puts("Yes"); else
阅读全文
摘要:算法解释:假设有一片地,该地有低坑和小高山(假设山足够高)。每当下雨的时候(假设雨水足够多),那么连通在一起的低坑会逐渐被雨水填满。而被小山围住的那些小坑就不会再往外蔓延了,那么我们可以说这样的一群连通的低坑是一个群,我们可以通过Flood Fill算法求出该地中这样的群有多少个。 由于BFS是基于
阅读全文
摘要:可以用两种方式输出路径,一个正向(需要借助栈),一个是反向; BFS正向打印路径: #include <iostream> #include <cstring> #include <queue> #include <stack> #define x first #define y second us
阅读全文
摘要:其实在此之前我一直觉得宽搜很难很难理解,但是在过完一遍算法基础课后我回头复习最短路之后,我再来看BFS,觉得BFS的模板代码也就那样,长得有点像这些最短路的代码了。其实这些求解最短路的模板中多多少少都用到了队列这个数据结构,怎么说呢,其实也没那么难,之前完全是自己被自己吓到了。 分析: 用BFS求最
阅读全文
摘要:Floyd算法很简单,时间复杂度为0(n^3)。 其思想是动态规划,,,, 贴上代码,牢记即可。。 #include <iostream> using namespace std; const int N = 210, INF = 0x3f3f3f3f; int g[N][N]; int n, m,
阅读全文
摘要:Dijkstra-朴素O(n^2) 初始化距离数组, dist[1] = 0, dist[i] = inf; for n次循环 每次循环确定一个min加入S集合中,n次之后就得出所有的最短距离 不在S中dist_min的点->t t->S加入最短路集合 用t更新到其他点的距离 Dijkstra-堆优
阅读全文
摘要:spfa求负环: 分析:为什么可以通过spfa求负环? dist[x]表示x点距离源点的距离,cnt[x]表示从源点到x点经过的边数 有: if(dist[x] > dist[t] + w[i]) { dist[x] = dist[t] + w[i]; cnt[x] = cnt[t] + 1; }
阅读全文
摘要:spfa求最短路径: spfa算法是对bellmanford算法的一个优化,其本质是:将每次更新过的点再用来去更新与其相邻的临点; Bellman_ford算法会遍历所有的边,但是有很多的边遍历了其实没有什么意义,我们只用遍历那些到源点距离变小的点所连接的边即可,只有当一个点的前驱结点更新了,该节点
阅读全文
摘要:bellman_ford算法用于解决: 有边数限制的最短路问题 可以用来判断是否有负环 什么是bellman - ford算法? Bellman - ford 算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在 n-1 次松弛
阅读全文
摘要:我们每次在找不在s中的距离最近的点都需要循环一次,这样的时间复杂度是0(n)的, 但是如果用小根堆来优化的话,那么时间复杂度会降到O(1),而且每个点的最短距离只会出现一次,会出冗余的情况,所以在出现冗余时,我们可以直接跳过。(觉得可以这么考虑,m条边都会进入队列,但是对于一个源点来讲只有最短的那条
阅读全文
摘要:一般用结构体创建链表运行会比较慢,所以需要一种更快的方法来满足算法竞赛中速度快的要求。 首先,用e[N]数组来存节点的值,ne[N]数组来存当前节点的下一个节点的地址(也可以说是下标)。这两个数组是相互关联的,它们之间通过下标相互关联的。 这里用-1表示空集,head的值表示头节点的下标,这个方法就
阅读全文
摘要:题目: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
阅读全文
摘要:有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入格式: 输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤
阅读全文
摘要:题目:https://www.acwing.com/problem/content/851/ Dijstra朴素版求单源最短路问题: 1、适用情况:适用于稠密图(边数远大于点数) 2、算法分析: Dijstra算法的核心就是先假设所有的点到起点的距离为无穷大,然后通过枚举每一个点到起点的距离,找到其
阅读全文
摘要:题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805080346181632 分析:我们可以通过给定的倒数第几个数来求该数是顺数第几个数(因为这样比较容易思考一点?)然后类似于求一个整数的每一位数字,这里我们所用
阅读全文
摘要:记录这道题的原因很简单,我有时候会忘记矩阵怎么相乘...... 上题:https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 分析:矩阵A * 矩阵B的结果矩阵C, 有 C[i][j] += A[i]
阅读全文
摘要:原题链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805102173339648 这题其实是不难的,但是却拿不到满分,原因想了很久都未果。最后看了题解,发现没有想到精度太低这个问题,但是我真的想不到啊~~~ 特贴下代
阅读全文