自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 背包问题及其优化

01背包问题从右向左更新for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++){ for(int j=V;j>=1;j--) { if(j-v[i]>=0) dp[j]=max(dp[j],dp[j-v[i]]+w[i]); }}完全背包问题从左向右更新for(int i=1;i<=n;i++) cin>>v[i]>

2022-02-24 21:08:32 256

原创 扩展欧几里得算法、线性同余方程

扩展欧几里得算法int exgcd(int a,int b,int &x,int &y){ if(!b) { x=1,y=0; return a; } int d = exgcd(b,a%b,x,y); int t = x; x = y; y = t - a/b * y ; return d;}线性同余方程#include<iostream>using namespac

2022-02-24 16:28:46 347

原创 快速幂、快速幂求逆元

快速幂int qmi(int a,int b,int p){ int res = 1; while(b) { if(b&1) res = (long long)res * a % p; b>>=1; a = (long long)a * a % p; } return res;}快速幂求逆元int qmi(int a,int b,int p){ int res = 1;

2022-02-23 09:58:04 312

原创 欧拉函数、线性筛欧拉函数之和

欧拉函数int x;cin>>x;long long res=x;for(int i=2;i<=x/i;i++){ if(x%i==0) { res = res/i*(i-1); while(x%i==0) { x/=i; } }}if(x>1) res = res/x*(x-1);线性筛求欧拉函数之和const int N = 1e6 + 5;int

2022-02-23 09:22:23 230

原创 约数、欧几里得算法

试除法求约数vector<int> get_divisors(int n){ vector<int> res; for(int i=1;i<=n/i;i++) { if(n%i==0) { res.push_back(i); if(i!=n/i) res.push_back(n/i); } } sort(res.begin(),res.en

2022-02-22 20:18:56 47

原创 判断质数、分解质因数、埃氏筛、线性筛

判断质数bool is_prime(int n){ if(n < 2) return false; for(int i = 2; i <= n / i ; i ++ ) if(n % i == 0) return false; return true;}分解质因数void divide(int n){ for(int i = 2; i <= n / i ; i ++ ) if(n % i == 0)

2022-02-22 08:59:40 57

原创 匈牙利算法求二分图最大匹配

#include<cstring>#include<iostream>using namespace std;const int N = 505, M = 1e5 + 5;int h[N],val[M],ne[M],idx,res;bool vis[N];int match[N];void add(int u,int v){ val[idx] = v; ne[idx] = h[u]; h[u] = idx++;}bool find(

2022-02-21 17:47:33 127

原创 染色法判断二分图

#include<iostream>#include<cstring>using namespace std;const int N = 2e5 + 5;int n,m;int h[N],val[N],ne[N],idx;int col[N];void add(int u,int v){ val[idx] = v; ne[idx] = h[u]; h[u] = idx++;}bool dfs(int k,int x){ c

2022-02-21 17:12:35 180

原创 Kruskal求最小生成树

#include<iostream>#include<algorithm>using namespace std;const int N = 2e5 + 5;int n,m;int p[N];struct Edge{ int a,b,w;}edge[N];bool cmp(Edge x,Edge y){ return x.w < y.w;}int find(int x){ if(p[x]!=x) p[x]=find(p

2022-02-21 10:57:42 107

原创 Prim求最小生成树

#include<iostream>#include<cstring>using namespace std;const int N = 510;int dist[N],g[N][N],vis[N];int n,m;int prim(){ memset(dist,0x3f,sizeof dist); int res = 0; for(int i=0;i<n;i++) { int t = -1;

2022-02-21 08:44:18 46

原创 Floyd求多源最短路

#include<iostream>#include<cstring>using namespace std;const int N=205;int d[N][N];int n,m,k;void floyd(){ for(int t=1;t<=n;t++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(

2022-02-17 21:54:02 230

原创 SPFA求最短路与SPFA求负环

SPFA求最短路#include<iostream>#include<cstring>#include<queue>using namespace std;const int N = 1e5 + 5;int n,m;int h[N],ne[N],val[N],w[N],vis[N],dist[N],idx;queue<int> q;void add(int a,int b,int x){ val[idx] = b;

2022-02-17 13:50:29 144

原创 Bellman-Ford求最短路

#include<iostream>#include<cstring>using namespace std;const int N = 1e5 + 5;int dist[N],backup[N];int n,m,k;struct Edge{ int a,b,w;}edge[N];int bellman_ford(){ memset(dist,0x3f,sizeof dist); dist[1] = 0; for(int i

2022-02-16 22:51:03 60

原创 Dijkstra求最短路

朴素Dijkstra#include<iostream>#include<cstring>using namespace std;const int N = 510;int g[N][N],dist[N];int n,m;bool vis[N];int dijkstra(){ memset(dist,0x3f,sizeof dist); dist[1] = 0; for(int i=0;i<n;i++) {

2022-02-16 16:19:37 242

原创 树和图的存储与搜索

邻接表const int N = 1e5 + 5;int h[N],val[N],ne[N],idx;bool vis[N];queue<int> q;void init(){ memset(h,-1,sizeof h);}void add(int a,int b){ val[idx] = b; ne[idx] = h[a]; h[a] = idx++;}void dfs(int k){ vis[k] = true;

2022-02-16 13:40:58 188

原创 BFS 宽度优先搜索

走迷宫#include<iostream>#include<queue>#include<cstring>using namespace std;const int N = 105;int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};int n,m;int map[N][N],d[N][N];queue<pair<int,int>> q;int bfs(){ memset(d,-1,si

2022-02-15 22:42:45 125

原创 DFS 深度优先搜索

全排列#include<iostream>using namespace std;int n;int vis[10],ans[10];void dfs(int k){ if(k==n) { for(int i=0;i<n;i++) cout<<ans[i]<<" "; cout<<endl; } for(int i=1;i<=n;i++) {

2022-02-15 21:28:18 194

原创 字符串哈希

#include<iostream>using namespace std;typedef unsigned long long ULL;const int N = 1e5 + 5, P = 131;int n,m;ULL p[N],h[N];string ch;ULL get(int l,int r){ return h[r]-h[l-1]*p[r-l+1];}int main(){ cin>>n>>m; cin&

2022-02-15 18:15:21 168

原创 模拟散列表

拉链法#include<iostream>#include<cstring>using namespace std;const int N = 1e5+3;int h[N],ne[N],val[N],idx;void insert(int x){ int k=(x%N+N)%N; val[idx]=x; ne[idx]=h[k]; h[k]=idx++;}bool query(int x){ int k=(x%N+N)

2022-02-15 17:23:23 324

原创 数组模拟堆

I x,插入一个数 x;PM,输出当前集合中的最小值;DM,删除当前集合中的最小值(数据保证此时的最小值唯一);D k,删除第 k 个插入的数;C k x,修改第 k 个插入的数,将其变为 x ;#include<iostream>#include<algorithm>using namespace std;const int N=1e5+5;int n,sz,ct;int h[N],cnt[N],tm[N];void heap_swap(int a,int

2022-02-14 22:59:52 122

原创 并查集算法

int find(int x){ if(p[x] != x) p[x] = find(p[x]); return p[x];}食物链#include<iostream>using namespace std;const int N = 50005;int n,K,fake;int p[N],d[N];int find(int x){ if(p[x] != x) { int u = find(p[x]);

2022-02-14 14:19:20 109

原创 Trie树

Trie树可以高效地存储和查找字符串int son[N][26],cnt[N],idx;void insert(string &A){ int p = 0; for(int i = 0;i < A.size();i ++ ) { int k = A[i] - 'a'; if(!son[p][k]) son[p][k] = ++idx; p = son[p][k]; } cnt[p]++;}in

2022-02-14 12:24:31 97

原创 KMP算法

ne[ i ] = j 表示以前 i 个字符中前缀后缀相同的最大长度。#include<iostream>using namespace std;const int X = 1e6 + 10;int N,M;char P[X],S[X];int ne[X];int main(){ cin>>N>>P+1>>M>>S+1; for(int i = 2,j = 0;i <= N;i ++ ) {

2022-02-11 22:03:07 345

原创 数组模拟栈和队列

数组模拟栈stk数组为栈,tt为栈顶下标。//插入元素void push(int x){ stk[++tt]=x;}//栈顶元素弹出void pop(){ tt--;}//判断栈是否为空bool empty(){ if(!tt) return 1; return 0;}//访问栈顶元素int top(){ return stk[tt];}数组模拟队列...

2022-02-11 19:03:43 123

原创 数组模拟链表

数组模拟单链表val [n] 表示第 n 个点的值, ne [n] 表示第 n 个点指向的点的下标。 head 表示头节点下标,idx为当前节点下标,空节点下标设为-1。//初始化void init(){ head=-1; idx=0;}//在链表头部添加元素void add_to_head(int x){ ne[idx]=head; val[idx]=x; head=idx; idx++;}//在下标为k的节点后添加元素void a

2022-02-09 18:13:08 269

原创 高精度计算

高精度加法原理类似于加法器,使用数组储存数字#include<iostream>#include<vector>#include<cstring>using namespace std;vector<int> A,B;string a,b;vector<int> add(vector<int> &A,vector<int> &B){ vector<int> C;

2022-02-08 20:10:52 34

原创 二分查找模板

二分查找模板高效查找有序数组中某数字的位置,时间复杂度为O(logn)。#include<iostream>#include<algorithm>using namespace std;const int N=1e5+5;int n,q;int num[N];//查找左端点int check(int k){ int l=0,r=n-1; while(l<r) { int mid=l+r>>1;

2022-02-08 16:21:05 159

原创 离散化算法

核心思路当所使用的数据范围很大,但实际数据排布较为稀疏,总体数量较少时,可以使用离散化的方法将数据处理为从1至n的连续数字。区间和假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c 。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r ,你需要求出在区间 [l,r] 之间的所有数的和。−109 ≤ x ≤ 109,1 ≤ n , m ≤ 105,−109 ≤ l ≤ r ≤ 109,−10000 ≤ c ≤ 1

2022-02-08 15:40:07 415

原创 双指针算法

核心目的双指针算法的目的是降低时间复杂度,能将O(n2)降低至O(n),只需遍历一边数组即可得出结果。最长连续不重复子序列给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。#include<iostream>using namespace std;const int N=1e5+6;int n,res;int num[N],h[N];int main(){ cin>>n; for(int i=0;i<n;i++

2022-02-08 12:16:53 636

原创 前缀和与差分

核心思路前缀和数组s[i]=a[1]+…+a[i], 差分数组b[i]=a[i]-a[i-1]。差分是前缀和的逆运算,前缀和主要用于计算区间和,差分主要用于对区间进行加减。一维前缀和#include<iostream>using namespace std;const int N=1e5+10;int n,m;int num[N],sum[N];int main(){ cin>>n>>m; for(int i=1;i<=n;i++)

2022-02-08 11:29:36 253

原创 归并排序与逆序对

归并排序核心思路归并排序的思路是将多个已经排好序的序列合并,通过不断递归最终合并成一个序列。快速排序的分界点为数组中的任一个数,而归并排序则为数组中的中间下标。该算法的时间复杂度为O(nlogn)。实现方法实现的思路仍然使用双指针,不过指针分别指向将要合并两序列的最小值,并不断将更小的那个元素添加至新的数组中。#include<iostream...

2022-01-17 11:12:49 323

原创 快速排序与快速选择

快速排序核心思路快速排序的核心思路是分治,不断选择分界点以使分界点左侧的数小于x,分界点右侧的数大于x,并进行不断递归,直至完成排序。实现方法使用双指针方法可以实现快速排序,flagi与flagj从数组两侧开始遍历,发现第一个不满足要求的数字时停止,并将i、j互相交换。#include<iostream>using names...

2022-01-09 21:51:32 123

原创 寒假开始不定时更新算法学习内容

寒假开始不定时更新算法学习内容

2022-01-09 17:47:10 238

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除