
算法
菜狗原来是我自己
菜狗是我了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
筛,都可以筛.jpg
筛质数 给定一个正整数 nnn,请你求出 1∼n1∼n1∼n 中质数的个数。 一,质朴筛 thinking 如果一个数,他是遍历之前的一个数的倍数,那么它肯定不是一个质数 这就是关于质朴筛的思想 code void get_primes2(){ for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i;//把素数存起来 for(int j=i;j<=n;j+=i){//不管是合数还是质数,都用来筛掉后面它的倍数原创 2021-10-02 11:05:07 · 110 阅读 · 1 评论 -
最优美的算法之一 —— 单调队列
最优美的算法之一 —— 单调队列 应用 在了解单调队列之前,我们可以看一看有关单调队列的应用 给定一个长度为n的数组,给定一个k,使得在[i, i + k]这样的区间内的,分别输出的这个区间内的最大值和最小值。 如果是暴力思维的话,那么就可以直接遍历这里面所有的n,找到里面的最小的数和最大的数。 代码的话就是这样 n, m = map(int,input().split())#python version maxn = [] minn = [] num = list(map(int,input().spli原创 2021-09-07 15:24:58 · 279 阅读 · 0 评论 -
质数——因式分解
因式分解 文章目录因式分解一、因式分解是什么二、如何实现1.题面2.代码实现与思路总结 一、因式分解是什么 不断地分解因式, 例如 二、如何实现 1.题面 2.代码实现与思路 代码如下(示例): #include<bits/stdc++.h> using namespace std; void dive(int n) { for(int i = 2; i <= n/i; i++) { if(n % i == 0) { int s = 0; while(原创 2021-08-28 16:35:24 · 473 阅读 · 0 评论 -
快速幂的实现
as we all know, 快速幂是一种实现a ^ k % p的算法 如果直接暴力搜的话,我们知道那是一中O(n)的实现 the core code is it ll sum = 1; for(int = 0; i < k; i++) { sum = sum * a % q; } cout << sum << endl; 但是的这种算法对于1e9的计算量实在实在是有些相形见绌了 所以就有了快速幂这样的一个算法 而这个算法的核心在于 如图 将问题转化为预处理这个区间内原创 2021-08-19 20:06:58 · 94 阅读 · 0 评论 -
整数分块(Integer block)
整数分块这样的方法使用与计算n以内的n/i的和; for example 以n = 10为例子 我们发现 这样我们就把10的计算转化为只需要5次的计算 在我们的计算下面,在理论上是可以logn的计算的 ll res = 0; for(int l = 1, r; l <= n; l = r + 1) { r = n / (n / l);//定义右边界 res += (r - l + 1) * (n / l); } ...原创 2021-08-19 16:53:31 · 1065 阅读 · 1 评论 -
树的深度优先搜索
first, it, is a tree; so,let’s see what can you do to dfs it; firstly, we see the root like one; than, we diffusion the root to other node which is linked with it at first; do the samething again untill you can not; then, you comeback and do the thing .原创 2021-08-19 11:36:45 · 159 阅读 · 1 评论 -
关于bfs的原理和应用
1,bfs 是个什么玩意??? 这是百度对于bfs的描述,太复杂了?没关系,我用一个走迷宫的题目来带大家了解bfs; 题目 对应代码 memset(d, -1, sizeof d); d[0][0] = 0; 相关代码 可以使用方向向量的方式 int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; const int N = 110; int n, m; int g[N][N]; int d[N][N]; PII q[N * N]; i原创 2021-08-18 15:34:35 · 271 阅读 · 1 评论 -
二分查找的几种情况
int search(int a[], int n, int target)//迅速找到一个值 { int l = 0, int r = n - 1; int mid = l + r >> 1; while(a[mid] != target){ if(a[mid] > target) mid = r; else mid = l; mid = l + r >> 1; } return mid; } int search(int a[], int n,.原创 2021-08-17 17:39:37 · 82 阅读 · 0 评论 -
并查集的原理和应用
并查集,简单的来说可以进行两种操作, 那么这两种操作是如何实现的呢? 我们以5个点的情况作为样例来作为情况来考虑 我们先将所有的集合都视为一个数,然后定义每个树的父节点p[x] 然后我们来进行两个操作 第一个操作 合并 这里表示的就是将1集合和5集合进行合并 即将5的父节点指向1; 查询 那就更容易了,我们只需要判断a,b两个数的根节点是否相同即可 原题链接 代码 #include<iostream> using namespace std; const int N = 1000原创 2021-08-15 19:07:39 · 89 阅读 · 3 评论