![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
代码练起来。
JHL123123
写写生活感悟
展开
-
约数-求一个数的约数、约数个数、约数之和
1、求一个数的约数vector<int> get_divisors(int x){ vector<int> ve; for(int i = 1; i * i <= x; ++i){ if(x % i == 0){ x /= i; ve.push_back(i); if(i != x / i) ve.push_back(x / i); } } return ve;}2、约数个数我们知道一个数X = (p1^a1) * (p2^原创 2021-06-23 01:16:50 · 556 阅读 · 0 评论 -
质数-判断、分解质因子、筛质数
1、质数(1)>=2的正整数;(2)只被1和本身整除。2、判断是否为素数bool is_prime(int x){ if(x <= 2) return false; for(int i = 2; i * i <= x; ++i){ if(x % i == 0) return false; } return true;}3、分解质因子void divide(int x){ for(int i = 2; i * i <= x; ++i){ if(x %原创 2021-06-22 23:29:13 · 222 阅读 · 0 评论 -
字符串哈希
1、字符串哈希首先明白字符串哈希可以做什么,它可以用来快速判断两个字符串是否相等。2、实现简单将就是将字符串转换为对应的数字,然后比较数字大小。举个例子:ABCDEFG转换为数字for(int i = 0; i < 7; ++i){h[i] = h[i -1] * P + str[i];}P通常是131,或者是13331。假设我们知道ABCD对应的值P1,ABCDEFG对应的值P2那么EFG的值就可以求出来P2 - P1 * (P ^ (7 - 4)),也就是相当于将ABCD左移原创 2021-06-21 17:02:12 · 188 阅读 · 0 评论 -
离散化-简单介绍
1、离散化对于很大范围的元素,只有个别的元素对我们有用,我们将这些元素提取出来,映射到1~N(0 ~ N-1)范围,然后对于映射后的进行处理。2、实现例如解决如下问题:无限长的数组,其中每个位置上的元素都是0。输入n个位置,并且给每个位置上元素加上C。m个操作,给一个[l,r],求处于该范围的元素和。思路:考虑到范围很大,但是只有个别的位置有用,我们将这些位置进行提取,映射到1~N上,然后求一个前缀和(为了保证前缀和好实现,没有映射到0 ~ N-1了),[l,r]也需要将其映射到1 ~ N上原创 2021-06-21 16:22:59 · 159 阅读 · 0 评论 -
Hash-开放定址法、拉链法
hash是将范围大的离散的数据映射到小的范围中,当遇到冲突时通常有两种解决方法,第一种开放定址法解决,当冲突时,查找下一个位置继续判断是否冲突(线性探测法),直到无冲突为止;另一种是拉链法,首先计算应该映射的位置,然后在该位置上再建立一条链,存储相应映射到该位置的数据,查找时,也是对于链上元素进行遍历,删除时只需要打上标记,通常不实际进行删除。1、开放定址法例如解决如题:有n个操作,i 56,表示插入56f 56,表示查找56。通常开放定址法的hash存储空间为插入元素个数的2~3倍,这样可以大原创 2021-06-21 15:21:44 · 566 阅读 · 0 评论 -
单调栈-简单描述
1、单调栈含义维护一个单调递增或递减的栈,通常当访问到当前元素,和栈顶元素进行比较,如果栈顶元素不满足,则弹出,满足则输出栈顶元素。2、实现例如解决如下问题:针对数组中每个元素,找到离它左边最近的小于它的元素。#include<iostream>using namespace std;const int N = 100010;int stk[N]; // 栈// 维护一个单调递增的栈,遍历到当前元素,和栈顶元素进行比较,如果栈顶元素>=当前元素,// 将栈顶元素进行弹原创 2021-06-21 00:27:14 · 62 阅读 · 0 评论 -
单调队列-简单描述
1、单调队列含义维护一个队列,递增或递减,通常用来求一段区间的最大值或最小值。2、实现例如求一个数组中各个位置窗口为k(从右到左)的最大元素和最小元素。const int N = 100050;int a[N], q[N]; // a表示原数组,q表示队列int n, k; // n表示数组元素个数,k表示窗口大小int hh = 0, tt = -1; // hh表示队头,tt表示队尾// 首先输出窗口的最小值for(int i = 0; i < n; ++i){原创 2021-06-20 23:43:23 · 68 阅读 · 0 评论 -
STL-vector
vector1、概念vector是变长数组,动态增加存储空间,采用倍增思想,减少开辟空间次数,提高效率。2、使用初始化:vector a(10,5); // 创建10个5求长度:size()判空:empty()清空:clear()获取首元素:front()获取末尾元素:back()压入:push_back()弹出:pop_back()迭代器遍历:begin(),end()遍历有三种方式:1、for(int i = 0; i < a.size(); ++i) cout <原创 2021-06-12 23:17:12 · 64 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。思路:首先从题目中可以得出,数组中肯定有重复的数字,我们可以通过交换的方式来判断是否存在重复数字,例如对于nums[0]我们将它交换到nums[nums[0]],这样nums[0]就对应于数组的下标,然后重复进行交换,直到交换双方是相同数字时退出循环。代码:class Solution {public:原创 2021-05-30 17:55:33 · 55 阅读 · 0 评论 -
Codeforces Global Round 8 - 坑较多
C. Even Picture题目链接:https://codeforces.ml/contest/1368/problem/C题目描述:构造一个连通图,图中有k个灰格4个面都是灰格,剩下(k-n)个灰格周围2个面是灰格。记住不需要找最小k,题目中最后来一句there exists an answer satisfying all requirements with a small enough k。你就不能说能找到k不就行了,还足够小!!太惨了!!!找最小k搞得很难受,直接构造就轻松多了。。。。。参原创 2020-06-20 10:51:02 · 362 阅读 · 0 评论 -
第三篇博客 codeforces round #644 (div 4变成div 3)
F. Spy-string题目链接:点击就送题目描述:对于n个字符串然后找到一个字符串使得这个字符串和前面n个字符串对应位置最多只有一个字符不同。解题思路:暴力就完事了!!!可以直接对第一个字符串,然后将其每个位置都换成’a’-‘z’(每次只能一个位置字符变),然后再对剩余n-1字符串判断是否相等或者只差一个字符不同。代码:#include<bits/stdc++.h>using namespace std;char ch[15][15];char ans[15];int原创 2020-05-26 16:41:35 · 234 阅读 · 0 评论 -
第二篇博客 codeforces round #642 div3
D. Constructing the Array题目链接:点击查看题目描述:给一个n个0的数组,每次都去寻找最左边的最长连续0子段的中间位置进行赋值。题目分析:可以使用优先队列进行解决,每次都是将node(l,r)添加进去,每次取出来的都是连续0长度最长或者是最左边的段。代码:#include<bits/stdc++.h>using namespace std;int n;int a[200005];struct node{ int l; int r; node(i原创 2020-05-16 08:10:46 · 186 阅读 · 0 评论 -
记录第一篇博客codeforces round #641 div2
题目链接:点击查看做了不少div2了,没想到b就是dp了,可能div4出来了,div2,div3都要增加点难度。(我只是个小caiji)题目描述:就是从数组中找最长上升子序列,只不过加了限制,找出来的元素下标要成比例。题目分析:显然dp就可以解决,LIS平时dp做法就是O(N*N),而这题刚好给你成比例,复杂度降为O(nlogn),和埃式筛法复杂度一样吧!转移方程:dp[j]=max(dp[j],dp[i]+1)。代码:#include<bits/stdc++.h>using原创 2020-05-14 18:06:12 · 886 阅读 · 1 评论