算法
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 · 207 阅读 · 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 · 791 阅读 · 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 · 131 阅读 · 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 · 215 阅读 · 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 · 145 阅读 · 0 评论 -
【算法】大整数加法
大整数乘法 输入: 112233445566778899 998877665544332211 输出: 1111111111111111110 #include <iostream> #include<cstring> #include<vector> #include<stdio.h> #include原创 2021-01-19 18:37:28 · 135 阅读 · 0 评论