- 博客(16)
- 收藏
- 关注
原创 生成树he二分图
1.prime算法 就是迪杰斯特拉的一种类似算法,迪杰斯特拉是求该点到起点的最小值,但是这里是指求到集合的最小值,也就是说,集合中有1,2这两个点,然后e[1,3]=3, e[2,3]=2; 那么就是dist[3]=2; #include <iostream> #include <algorithm> #include<cstring> using namespace std; const int N=503; int g[N][N]; int n,m; int
2022-03-24 16:52:02
223
原创 最短路问题
单源最短路 1.所有边的权重都是正数 1.朴素迪杰斯特拉 O(n^2)//这里如果是稠密图则用邻接矩阵,稀疏图是邻接表 2.堆优化版迪杰斯特拉O(mlogn) 2.存在负数边 1.贝尔曼佛雷算法 O(nm) 如果有负权回路的话可能是找不到最短路的!!!!有边数限制的最短路径问题就只能用这个算法,其他时候SPFA算法优于它 2.SPFA O(m),最坏O(nm) 多元汇最短路 1.Floyd算法O(n^3) ...
2022-03-23 23:17:59
264
原创 前缀和和差分
a是一个数组,s记录前多少个a的和,在做题时这一思想经常被使用。 #include <iostream> using namespace std; const int N=1e6+10; int n,m; int a[N],s[N]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; }
2022-02-08 15:01:35
489
原创 高精度计算
长整数相加 #include <iostream> #include <vector> using namespace std; vector<int> b,a; vector<int> add(vector<int>a,vector<int>b){ vector<int>c; int t=0; for(int i=0;i<a.size()||i<b.size();i++){
2022-02-08 00:18:07
212
原创 排序和搜索
快排模板 #include <iostream> using namespace std; const int N=1e6+10; int n; int q[N]; void qp(int q[],int l,int r){ if(l>=r) return; int x=q[l+r>>1],i=l-1,j=r+1; while(i<j){ while(q[++i]<x); while(q[--j]>x)
2022-02-07 19:26:48
469
原创 C++stl
STL vector(变长数组),倍增的思想,支持比较运算(按字典序) 定义:: vector a; 定义:一个vector数组a vector a(10); 定义:一个长度为10的vector数组a vector a(10,3); 定义:一个长度为10的vector数组a,并且所有元素都为3 常用函数:: size(); 返回元素个数 empty(); 返回是否是空 clear(); 清空 front(); 返回vector的第一个数 back(); 返回vector的最后一个数 push_back
2021-11-02 19:57:06
118
原创 tire数据结构和堆
手写堆 1.插入一个数 heap[++size]=x;up(size); 2.求集合当中的最小值 heap[1]; 3.删除最小值 heap[1]=heap[size];size–;down(1) STL的堆以下两个无法直接实现 4.删除任意元素 heap[k]=heap[size];size–;down(k);up(k); 5.修改任意元素 heap[k]=x;down,up 堆是一个完全二叉树 小根堆:根是最小值,每个点都满足<=下面两边的点 存储:用一维数组 根是1;x的左儿子的2x
2021-10-28 01:00:22
197
原创 2021-10-27
tire数和并查集 高效存储和查找字符串集合的数据结构。 abcdef abdef aced bcdf bcff cdaa bcbc 并查集: 1.将两个集合合并 2.询问两个元素是否在一个集合内 每个集合用一棵树表述,树根的编号就是集合编号,每个节点存储它的父节点,p[x]=x的父节点。 问题一:如何判断树根:if(p[x]==x) 问题二:如何求x的集合编号:while(p[x=!=x)x=p[x] 问题三:px是x的集合,py是y的集合,p[x]=y; 优化(路径压缩): 一旦往上找到了根节点,就
2021-10-27 21:16:26
148
原创 2021-10-27
KMP算法 匹配子字符串 1.暴力算法 S[N],P[N]; for(int i=1;i<n;i++){ for(int j=1;j<=m;j++){ if(s[i]!=p[j]){ break; } } } kmp算法中的next数组: Next[i] =j 说明p[1]~p[j]=p[i-j+1] ~p[i] 比如:abcdeabc p[8]=p[3] #include <iostream> #include<vector> #include<
2021-10-27 20:04:13
124
原创 2021-10-26
数组实现栈 #include<iostream> using namespace std; const int N=100010; int stk[N],tt; //插入 stk[++tt]=x; //弹出 tt--; if(tt>0)not empty else empty //栈顶 stk[tt] //在队尾插入,队头弹出 int q[N],tt,hh; //弹出 tt++; //插入 q[++hh]=x; if(hh<tt)not empty else em
2021-10-26 22:33:06
103
原创 2021-10-26
数组模拟链表与邻接表 在算法题里数组会比链表更快 1.数组模拟单链表 1.1邻接表,是n个链表,存储图和树 head->0 e[N],表示该节点的值 ne[N]表示下一个节点坐标 用下标关联 空节点用-1的下标表示 #include<iostream> using namespace std const int N=100010; int idx,head,e[N],ne[N]; //idx指向当前可以使用的节点下标(最小的空数组下标) void init(){ head=-1; id
2021-10-26 21:50:14
100
原创 离散化操作
离散化 a[] = { 1,3,8,10000 } 映射 b[] = { 0,1,2,3 }; 1.a中可能有重复元素,需要去重, 用库函数,现sort再 a.erase(unique(a.begin(), a.end(), a.end())); 2.可以快速映射到b,利用二分查找。 例题:区间和 #include <iostream> #include <vector> #include <algorithm> using namespace std; typede
2021-10-26 17:23:54
256
1
原创 二进制的操作
关于进制 所有的数在电脑里的存储是二进制 位运算,n的二进制表示中的第k位是几 先把第k位移到最后一位来n >> k/1; 十进制的数>>1就等于是/2; lowbit(x) -x=取反x+1; x=10100100 -x=01011011+1=01011100 所以这里就用到了lowbit(x); int lowbit(int x){ return x & ~x ; } #include <iostream> using namespace std; int
2021-10-26 16:57:02
195
原创 双指针算法
双指针 双指针算法时间复杂度是O(n) for(i=0,j=0;i<n;i++){ while (j < i && check(i, j))j++; } 例题:字符串输出比如: abc bcd edf 跳过空格输出 #include <iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main() {
2021-10-26 16:48:57
95
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅