
算法
limboWang
这个作者很懒,什么都没留下…
展开
-
【算法】并查集
int findFa(int x){ if(fa[x] == x) return x; return findFa(fa[x]);}void uni(int a,int b){ fa[findFa(a)] = findFa(b);}路径压缩:只要我们在查询(findFa函数中)的过程中,把沿途的每个节点的父节点都设为根节点即可:int findFa(int x){ if(fa[x] == x) return x; fa[x] = findFa(f原创 2021-02-18 14:14:34 · 333 阅读 · 0 评论 -
【算法】质因子
设置factor结构体由于2*3*5*7*11*13*17*19*23*29超过int范围,因此数组大小开到10即可:struct factor{ int x,cnt;//x为质因子,cnt为其个数}fac[10];int num;关键来了:如果一个数存在1和本身之外的因子,那么一定是在sqrt(n)的左右成对出现的。因此得出一个强化的结论:对一个正整数n,如果存在有[2,n]之间的质因子:1、要么这些质因子全部小于等于sqrt(n)2、要么只存在一个大于sqrt(n)的质因子,而原创 2021-01-26 13:15:08 · 842 阅读 · 0 评论 -
【算法】素数
1.素数的判断int isPrime(int n){ if(n <= 1) return 0; int sqr = (int)sqrt(1.0 * n); for(int i = 2;i <= sqr; i++) if(n % i == 0) return 0; return 1;}若n比较小时可以写成:int isPrime(int n){ if(n <= 1) return 0; fo原创 2021-01-26 12:25:13 · 170 阅读 · 0 评论 -
【算法】树状数组
算法适用于求前k个整数的和,一般的做法是设置一个sum数组来表示1、问题升级一下:在查询的过程中随时给第x个整数加上一个整数v,同样要求查询第K个整数的和。此时若还是原来的sum数组,则要遍历来更新,复杂度为O(N),而用树状数组则时间要更快。2、再来一题(很简单的,别怕昂):计算序列中在元素左边比该元素小的元素个数。可以用hash(即map)来做,也可用树状数组:update(x,1);cout<<getSum(x-1);方便吧~~~~下面上树状数组的代码:int lowbit原创 2021-01-25 19:03:42 · 274 阅读 · 0 评论 -
【算法】分块思想
分块思想用于快速查询一个序列中第K大的数字,例如2,7,5,1,6第3大为5,若暴力解决,当个数过大时,时间耗费大,因此有了分块思想,之后也可用树状数组,这里介绍分块思想//若数为不超过10^5的非负整数//从逻辑上将0~10^5划分成sqrt(10^+1) = 317块,每块元素个数为316个int table[100001];//table[x]表示整数x的个数int block[317;]//block[x]表示第x块中的元素个数元素x所在块号为x/316,因此插入一个元素时只要:blo原创 2021-01-25 18:07:22 · 176 阅读 · 0 评论 -
【算法】大整数加法
大整数乘法输入: 112233445566778899 998877665544332211输出: 1111111111111111110#include <iostream>#include<cstring>#include<vector>#include<stdio.h>#include原创 2021-01-19 18:37:28 · 171 阅读 · 0 评论