![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
算法
Axing0022
这个作者很懒,什么都没留下…
展开
-
P2440 木材加工
二分查找这道题就是在二分模板上加了一个check()函数,由于查找特定的答案#include<bits/stdc++.h>using namespace std;const int N=1e5+7;int a[N];int n,k;int check(int x){ long long t=0; for(int i=1;i<=n;i++) { t+=a[i]/x; if(t>=k) return 1; } return 0;}int m原创 2022-04-02 11:16:59 · 183 阅读 · 0 评论 -
Trie 最大异或对
#include<bits/stdc++.h>// 异或 又称为 不进位加法 1^1=0 1^0=1 using namespace std;const int N=100010,M=31*N;int n;int a[N];int son[M][2],idx;void insert(int x){ int p=0; for(int i=30;i>=0;i--) { int u=x>>i&1;//取出来x的原创 2022-03-13 20:17:25 · 90 阅读 · 0 评论 -
最短路的应用
//P3371 【模板】单源最短路径(弱化版)#include<bits/stdc++.h>using namespace std;const int N=1000010;int dist[N],h[N],e[N],ne[N],w[N],idx;bool st[N];int n,m,s;void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}void dijkstra(){ m原创 2021-11-28 13:13:29 · 537 阅读 · 0 评论 -
字符串哈希
字符串哈希实质上就是把每个不同的字符串转成不同的整数。通过比较它们映射出的数字来代替比较字符串字符串哈希_求子串#include<iostream>// 字符串求子串的哈希值 using namespace std;typedef unsigned long long ull;//自然溢出const int N=100010,P=131;//或者13331int n,m;char str[N];ull h[N],p[N];// 字符串 str [l,r] 哈希值 ,我原创 2021-11-21 09:00:52 · 352 阅读 · 0 评论 -
最短路问题 - Dijkstra,Bellman_ford,SPFA与SPFA判断负环,Floyd
Dijkstra//朴素Dijkstra#include<bits/stdc++.h>//朴素版Dijkstra适合稀疏图//稠密图:邻接矩阵using namespace std;const int N=510;int n,m;int g[N][N];int dist[N];bool st[N];//初始为 false int dijkstra(){ memset(dist,0x3f3f3f3f,sizeof dist); dist[1]=0; for(原创 2021-11-14 12:50:35 · 675 阅读 · 0 评论 -
约数相关知识
算术基本定理:任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积.则:,其中 p 为素数(质数)。约数的个数:约数的和 :欧几里得算法(辗转相除法)//最大公约数int gcd(int a, int b){ return b ? gcd(b,a%b):a; }//约数个数#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mo原创 2021-09-26 20:19:48 · 61 阅读 · 0 评论 -
模拟栈与队列
栈与队列均没有 begin,end等操作栈与模拟栈栈(先进后出)//栈#include<iostream>#include<stack>using namespace std;int main(){ stack<int> stk; stk.push(9); stk.push(6); stk.push(3);//向栈中插入元素 stk.pop(); //弹出栈顶元素,类似于删除 cout<<stk.top()<&l.原创 2021-04-24 16:45:23 · 87 阅读 · 0 评论 -
bfs.1
宽度优先搜索(bfs)我们在使用宽度优先搜索的时候,主要有以下几点1.确定队列的类型struct node{ int x,y,step;}aa; queue<node> q;/*typedef pair<int,int> PII; queue<PII> q;...*/2.初始化队列 queue<node> q; aa.x=1,aa.y=1,aa.step=0; q.push(aa);3.while循环, 判断队列是否为空原创 2021-04-23 20:55:50 · 59 阅读 · 0 评论 -
最大子序列的和与最大子矩阵的和
最大子序列的和样例:1 -3 5 -3 8 9 4 6 -4 9 9 -9 -7 9 6#include<iostream>using namespace std;int main(){ int n=15,sum=0,tmp=0; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { tmp+=a[i]; if(tmp<0) tmp=0; su原创 2021-04-22 09:15:03 · 84 阅读 · 0 评论 -
并查集.1
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。并查集:1.将两个集合合并2.询问两个元素是否在一个集合中基本原理:每个集合用一棵树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。主要用途有以下两点:1、维护无向图的连通性(判断两个点是否在同一连通块内,或增加一条边后是否会产生环)2、用在求解最小生成树的Kruskal算法里。并查集的讲解推荐看这个:https://b原创 2021-04-20 16:47:51 · 71 阅读 · 0 评论 -
vector.1
vector(动态数组)所有的容器都可以视作一个“前闭后开”的结构vector是动态数组,元素的增删一般应该在末尾进行。 声明 #include <vector> 头文件 vector<int> a; 相当于一个长度动态变化的int数组 vector<int> b[233]; 相当于第一维长233,第二位长度动态变化的int数组 struct rec{…}; vector<rec> c; 自定义的结构体类型也可以保存在vector中 v原创 2021-04-15 16:37:11 · 143 阅读 · 0 评论 -
String.1
一,string中的的字符串输入#include<iostream>#include<cstring>using namespace std;int main(){ string ss; getline(cin,ss);//空格也读入,遇到换行符结束 for(int i=0;i<ss.length();i++) cout<<ss[i]; for(int i=0;i<ss.size();i++) cout<<ss[i]; //s原创 2021-04-12 22:15:09 · 155 阅读 · 0 评论 -
dfs.1
在我刚开始学习dfs(深度优先搜索) 的时候,我遇到的第一个问题是排列数字,而第二个问题就是n-皇后问题。n-皇后问题第一种解法第一种解法是dfs中最朴素的做法#include<iostream>using namespace std;const int N=100;int n;char g[N][N]; bool col[N],row[N],dg[N],udg[N];//dg[]与udg[]/* 对角线与反对角线 对于任何一个对角线都有一个截距b 对于在同一条线原创 2021-04-01 16:43:37 · 144 阅读 · 1 评论 -
dfs.2
蓝桥杯-剪邮票(连通块问题)题在这里http://oj.ecustacm.cn/problem.php?id=1286#include<iostream>#include<cmath>#include<cstring>using namespace std;const int N=6;int a[N][N];int b[N][N];int sum;int ss[10000];void dfs(int x,int y,int s){ if(x原创 2021-04-10 20:30:40 · 106 阅读 · 1 评论 -
map.1
Max and Mextime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a multiset S initially consisting of n distinct non-negative integers. A multiset is a set, that can contain some elements mu原创 2021-03-22 18:10:08 · 230 阅读 · 3 评论 -
kmp
给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。这里的意思是说,我们要找到 主串S 中是否存在 子串P,并输出主串的第一个下标所以我们要找到 子串P 的next的数组输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串 P。第三行输入整数 M,表示字符串 S 的长度。第四行输入字符串 S。输出格式共一行,输出所有出现位置的起始原创 2021-03-21 09:19:59 · 77 阅读 · 0 评论 -
二 分 查 找
二分二分分为整数二分和浮点数二分1.整数二分涉及到向下取整的问题,所以有两种模板对于L~R区间的值,我们询问最前面的值时第一种L+R可以理解为向下取整我们询问最后面的值时第二种L+R+1理解为向上取整例题:蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x 是否在数组 A 中。输入格式第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。接下来一行有 n 个整数 ai。接下来 m 行,每行有原创 2021-01-27 11:11:43 · 87 阅读 · 0 评论 -
位运算
1.二进制最高位称为“符号位”。1表示该数为负值,0表示为正值2.正数的原码,反码和补码是一样的3.负数的反码为符号位不变其他位取相反负数的补码为 反码+1运算符& 按位与 | 按位或^ 按位异或~ 取反<< 左移 >> 右移int lowbit(int x){return x&(-x);}//lowbit(x)是x的二进制表达式中最低位的1所对应的值。比如,6的二进制是110,—1 1 0(取原创 2021-01-21 21:25:36 · 248 阅读 · 0 评论 -
离散化
离散化离散化是一个非常常用的技巧,它可以有效的降低时间复杂度。其本质就是在我们所枚举的所有情况中找出我们所要操作的值在我们遇到一个需要开辟很大空间的问题时,如果我们真的这样去做,我们就会发现这会造成时间超限等问题,但是实际上操作的个数却是比较少的,我们将这些分散的数字映射到一个较小的空间内,这个过程就叫做离散化。对于可离散化数据我们通常只考虑数据中的大小关系。进行离散化之前有两大问题1.原数组中的重复元素(去重)2.离散过后的数组下标(二分查找)进行去重我们可以选择C++中的uniqueu原创 2021-01-29 21:05:30 · 104 阅读 · 0 评论 -
双指针思想
双指针思想双指针并不是真正意义上的指针它是指:第一种类型的双指针:两个序列,两个指针(归并排序)第二种类型的双指针:一个序列,两个指针(维护区间)/*输入一串被星号隔开的字符串输出每个被隔开的单词样例输入abc*def*ghi----------------样例输出abcdefghi*/#include<bits/stdc++.h>using namespace std ;int main(){ char str[1000]; // st原创 2021-01-25 22:58:31 · 199 阅读 · 0 评论 -
一维差分 与 二维差分
一维差分数组int a[5]={1,3,7,5,2}前缀和数组a[i]+=a[i-1]; 差分数组 d[i]=a[i]-a[i-1]; 差分数组前缀和d[i]+=d[i-1];差分数组和原数组的关系:对 差分数组 进行 求 前缀和 得到 原数组1 3 7 5 2 a[i]1 2 4 -2 -3 d[i]1 3 7 5 2 d[i] (sum)对区间[0,2]+1[1,3]-3[2,4]+5一般的方法我们是进行for循环,找到特定的位置然后进行运算,但是这样会浪费太多的时间原创 2021-01-20 13:57:14 · 86 阅读 · 0 评论 -
一维前缀和 与 二维前缀和
一维前缀和有一串长度为n的数列an,如果要求我们访问**[j,k]**里的数的和。我们一般的方法是分别求出Sj和Sk的值然后让他们相减。如果我们了解到前缀和,我们就可以使用下面这种方法for(int i=1;i<=n;i++) a[i]+=a[i-1]; //a[i]相当于Si(前i项和)前缀和就是前面i个数的总和接下来,我们只需要分别找到a[j-1] 和 a[k],sum=a[k]-a[j-1] (包括a[k]和a[j])二维前缀和规定:i为行数,j为列数如果我们想要去求得原创 2021-01-18 15:45:15 · 99 阅读 · 0 评论