算法与数据结构
.0-0.
stay hungry,stay foolish
展开
-
牛客题霸NC99题解(树的直径)re
目录:前提:证明:前提:树的直径:树上所有点的远端点都在直径上证明:用反证法,凡是比直径长的点统统都归为直径树上任意一个点x,距离x最远的点=直径的一个端点点击: 证明详细链接.dfs: dfs求树的直径.bfs比较好想,先一遍bfs找到直径的一个端点,再在此基础上找到第二个端点树的直径: poj2831....原创 2021-09-29 09:13:38 · 305 阅读 · 0 评论 -
yp数论re
contents:写在前面整除素数素数判定单个素数判断素数筛法写在前面我觉得数论这个东西真的很难学习我打算做题来带动学习但是需要学习基础知识整除定义:整数n除以d,所得余数为0,则d能整除n,则称d是n的约数,n是d的倍数,记作d|n性质01:传递性,a|b,b|c,⇒a|c性质02:加倍性,a|b⇒a|bc,c为任意的整数性质03:量子性,a|b,a|c⇒a|kb±lc性质04:对称性,a|b,b|a,⇒a=±b性质05:GCD(k1,k2)=1⇒GCD(k1+k2,k1k2)=1,原创 2021-09-29 09:09:11 · 113 阅读 · 0 评论 -
yp线段树
contents:长这样长这样原创 2021-09-24 12:17:11 · 80 阅读 · 0 评论 -
yp0x00基本算法
contents:位运算赋大值移位运算a^b mod pa*b mod p二进制状态压缩acwing91acwing 998成对变换lowbit位运算赋大值memset(arr,0x3f,sizeof(arr));移位运算1<<n = 2^n^n<<1 = 2*nn>.1 = fool(n/2.0)a^b mod pacwing89#include <bits/stdc++.h>using namespace std;#define l原创 2021-09-20 21:55:18 · 151 阅读 · 0 评论 -
yp多冲集合组合数
这里写目录标题定义思路代码定义n = 3m = 3a={1,2,3}M = 10000不同的物品可以相互区分,同种物品区分不了问从n中选择m个方案数6{0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0}思路为了不重复记数,同一种类的物品最好一次性处理好。于是我们按照如下方式进行定义dp[i+1][j] 从前i中物品中取出j个的组合总数代码...原创 2021-09-19 20:54:53 · 107 阅读 · 0 评论 -
yp化分数
contents:定义思路代码定义n,mm是n的划分n==m化分数dp[i][j] == j的i划分的总数思路实部+虚部如果每个i都有ai>0 那么 那么ai-1就对应了n-m的m划分另外如果存在ai=0 那么 这就对应了 n 的 m-1划分dp[i][j] == dp[i][j-i] + dp[i-1][j]; //铺张浪费代码int n, m;int dp[N][N];void solve(){ dp[0][0] = 1; for (i原创 2021-09-17 21:04:48 · 108 阅读 · 0 评论 -
另一种离散化
啥也不说了,看代码#include <bits/stdc++.h>using namespace std;#define ll long longconst int N = 1E5 + 7;struct node{ ll data, id; bool operator<(const node &t) const { return data < t.data; }} arr[N];int brr[N];ll n;int now;int m原创 2021-09-05 20:24:13 · 64 阅读 · 0 评论 -
0x70 stl (进阶指南)
contents:sortdeque可sort去重部分排序利用迭代器找到第一个和最后一个min(a,min(b,c)最值位置next_premutation__int128to_string(push_back) emplace_back__gcd(0,!0)==!0__lgrotatereverse__builtin_popcountshufflememsetfilliotaisalpha isalnum isdightrandom库bit,bitset,pb_dssortdeque可sort去重原创 2021-09-04 19:35:01 · 113 阅读 · 0 评论 -
算法模板ACW(更新中)
总目录:基础算法数据结构搜索与图论数学知识动态规划贪心时空复杂度分析基础算法点我: link.数据结构点我: link.搜索与图论点我: link.数学知识点我: link.动态规划点我: link.贪心点我: link.时空复杂度分析点我: link....原创 2021-06-25 20:46:02 · 156 阅读 · 0 评论 -
数学知识ACW
这里写目录标题试除法判定质数 —— 模板题 AcWing 866. 试除法判定质数试除法分解质因数 —— 模板题 AcWing 867. 分解质因数朴素筛法求素数 —— 模板题 AcWing 868. 筛质数线性筛法求素数 —— 模板题 AcWing 868. 筛质数试除法求所有约数 —— 模板题 AcWing 869. 试除法求约数约数个数和约数之和 —— 模板题 AcWing 870. 约数个数, AcWing 871. 约数之和欧几里得算法 —— 模板题 AcWing 872. 最大公约数求欧拉函数原创 2021-06-25 20:43:38 · 233 阅读 · 2 评论 -
搜索与图论ACW
目录:树与图的存储邻接矩阵邻接表(1) 深度优先遍历 —— 模板题 AcWing 846. 树的重心拓扑排序 —— 模板题 AcWing 848. 有向图的拓扑序列朴素dijkstra算法 —— 模板题 AcWing 849. Dijkstra求最短路 I堆优化版dijkstra —— 模板题 AcWing 850. Dijkstra求最短路 IIBellman-Ford算法 —— 模板题 AcWing 853. 有边数限制的最短路spfa 算法(队列优化的Bellman-Ford算法) —— 模板题 Ac原创 2021-06-25 20:32:00 · 177 阅读 · 0 评论 -
yp极简 二叉搜索树 C++(更新中)
目录:插入:搜索删除插入:#include<bits/stdc++.h>using namespace std;struct Node{ int key; Node *right,*left,*parent;};Node *root,*NIL;void insert(int k){ Node *y =NIL;//野爹 Node *x = root; Node *z; z = (Node *)malloc(sizeof(Node原创 2021-05-25 23:35:19 · 167 阅读 · 0 评论 -
yp树状数组(更新中)
目录:适用范围适用范围给出一个长度为n的数组,完成以下两种操作1、将第x个数加上k2、输出区间[x,y]内每个数的和来源luogu:P3374树状数组1朴素算法:对于单点修改,O(1)区间查询:O(n)多次修改查询的总复杂度最坏为O(n2)若考虑前缀和,则单点修改为O(n)区间查询为O(1)总复杂度还是O(N2)所以我们引入一个数据结构,树状数组我们先来看看这种数据结构针对上述结构的结果,单点修改O(logn)区间查询O(logn)所以总的复杂度是O(nlogn)前置知识原创 2021-05-25 21:38:16 · 84 阅读 · 0 评论 -
十二届蓝桥杯 砝码称重 C++ bitset
这里写目录标题题目:bitset:题目:bitset:==用bitset模拟每一位是否被称到,由于会出现在天平左右边,所以bitset会出现负数,模拟一个对称位置,将负数合并到正数部分,例如:bitset长度为9,则最中间下标4为0这个重量的位置,0~3为负数部分,5,8是正数部分bitset这种容器是从右到左边的,起始位置为0,灵感来自于:链接: 瞎搞题.#include <bits/stdc++.h>using namespace std;bitset<200021原创 2021-05-08 21:46:02 · 352 阅读 · 0 评论 -
yp极简 尺取法 Subsequence
POJ No.3061给定长度为n的数列整数,a0,a1,…,an-1以及整数S.求出总和不小于S的连续子序列的长度的最小值。如果解不存在输出0;10<n<10e50<ai<10e4S<10e8input1:n=10S=15a={5,1,3,5,10,7,4,9,2,8}output1:2(5+10)input2:n=5S=11a={1,2,3,4,5}output2:3(3+4+5};证明:As+…At-1为最初大于时的序列;则As+1+原创 2021-04-22 15:50:51 · 81 阅读 · 0 评论 -
yp极简~Kruscal(邻接矩阵)(C++代码)
Kruscal:#include<bits/stdc++.h>using namespace std;#define MAXVEX 9 /* 最大顶点数,应由用户定义 */#define INFINITY 65535 /* 表示权值的无穷*/typedef int EdgeType; /* 边上的权值类型应由用户定义 */typedef char VertexType; /* 顶点类型应由用户定义 */typedef str原创 2021-01-28 16:36:37 · 444 阅读 · 0 评论 -
yp极简~Prim(邻接矩阵)(C++代码)
Prim:邻接矩阵代码邻接矩阵代码#include<iostream>using namespace std;#define MAXVEX 100 /* 最大顶点数,应由用户定义 */#define INFINITY 65535 /* 表示权值的无穷*/typedef int EdgeType; /* 边上的权值类型应由用户定义 */typedef char VertexType; /* 顶点类型应由用户定义 */type原创 2021-01-28 00:23:02 · 520 阅读 · 0 评论 -
yp 连通分量 判断两个点是否连通 C++
目录:直接代码直接代码#include<bits/stdc++.h>using namespace std;static const int MAX = 100000;static const int NIL = -1;int n;vector<int> G[MAX];int color[MAX];void dfs(int r,int c){ stack<int> s; s.push(r); color[r] = c; whi原创 2021-02-22 22:05:00 · 382 阅读 · 0 评论 -
yp 极简 递归实现的深度优先搜索 C++
这里写目录标题用递归实现的深度优先搜索广度优先搜索用递归实现的深度优先搜索#include<stdio.h>#include<bits/stdc++.h>#define N 100#define WHITE 0#define GRAY 1#define BLACK 2int n,M[N][N];int color[N],d[N],f[N],tt;//用递归函数实现的深度优先搜索void dfs_visit(int u){ int v; col原创 2021-02-22 20:50:46 · 243 阅读 · 0 评论 -
yp极简 矩阵链乘法 C++
#include<bits/stdc++.h>using namespace std;static const int N = 100;int main(){ int n,p[N+1],m[N+1][N+1]; cin>>n; for(int i=1;i<=n;i++){ cin>>p[i-1]>>p[i]; } for(int i = 1;i<=n;i++) m[i][i] = 0; for(int l = 2;l<原创 2021-02-20 23:19:40 · 97 阅读 · 0 评论 -
yp极简 极大堆 C++
目录:自己敲一遍就好了自己敲一遍就好了#include<bits/stdc++.h>using namespace std;#define MAX 20000int H,A[MAX+1];void maxHeapify(int i){ int l,r,largest; l = 2*i; r = 2*i+1; if(l<=H&&A[l]>A[i]) largest = l; else largest = i;原创 2021-02-20 11:56:28 · 122 阅读 · 0 评论 -
yp极简 最小成本排序 ( Minimum Cost Sort )~C++
目录:概述:直接代码:概述:有重量为wi(i = 0, 1, …, n - 1)的n个货物排成一列。现在要用机械臂将这些货物排序。机械臂每次操作可以提起货物i和货物j并交换二者位置,同时产生wi + wj的成本。机械臂的操作次数没有限制。请求出将给定货物列按重量升序排列时所需总成本的最小值。输入: 第1行输入整数n。第2行输入n个整数wi(i = 0, 1, 2, …, n - 1),用空格隔开。输出: 在1行内输出最小值。限制:1 ≤ n ≤ 10000 ≤ wi ≤ 10000wi的值原创 2021-02-18 23:38:31 · 337 阅读 · 0 评论 -
yp极简 选择排序(C++)
目录:思路:伪代码:代码:思路:选择排序法是一种非常直观的算法,它会在每个计算步骤中选出一个最小值,进而完成排序。伪代码:selectionSort(A,N) for i从0到N-1 minj = i for j从i到N-1 if A[j]<A[minj] minj = j A[i]与A[minj]交换代码:void selectionSort(int A[],int N){ int i,j,minj; for(i = 0;i<N;i原创 2021-02-12 14:08:20 · 115 阅读 · 0 评论 -
yp极简 冒泡排序(C++)
目录:思路:伪代码:代码:思路:顾名思义,冒泡排序法就是让数组元素像水中的气泡一样逐渐上浮,进而达到排序的目的。伪代码:bubbleSort(A,N) flag = 1 while flag flag = 0 for j从N-1到1 if A[j] < A[j-1] A[j]与A[j-1]交换 flag= 1改进:bubbleSort(A,N) flag = 1 i = 0//未排序部分的起始下标 while原创 2021-02-12 13:55:27 · 105 阅读 · 0 评论 -
yp极简 希尔排序(C++)
目录:思路:伪代码:代码:思路:插入排序法是一种很容易想到的算法,它的思路与打扑克时排列手牌的方法很相似。比如我们现在单手拿牌,然后将牌从左至右,由小到大排序。此时我们需要将牌一张张抽出来,分别插入到前面已排好序的手牌中的适当位置。重复这一操作直到插入最后一张牌,整个排序就完成了。伪代码:insertionSort(A,N) //包含N个元素的0起点数组Afor i从1到N-1v = A[i]j = i - 1while j >= 0 且 A[j] > vA[j+1]原创 2021-02-12 13:40:09 · 83 阅读 · 0 评论