蒟蒻Andysun06的学习笔记
本文章未经博主许可,不能转载!
本文章同步发表于:
一、前言:
本文章是蒟蒻我独立创作的,大部分内容都是基础,还包括一些其他东西的用法(例如随机数),本文章所涉及的知识大部分都是自学的(因为还没找到适合我的老师)。还有一部分,是@FCBM71 和@jijidawang 等大佬教我的,我在此感谢他们对我的教导,希望我可以和他们共同努力,变得更厉害,也谢谢广大谷友对我的帮助和支持,我会继续努力的!——By Andysun06
二、目录:
-
① 栈
- STL——栈的分析及用法
- 手写——栈的分析及用法(速度较快)
-
② 队列
- STL——队列的分析及用法
- 手写——队列的分析及用法(速度较快)
-
③ 快速幂
- 3.1 算法分析
- 3.2 模板
-
④ 线性筛
- 4.1 算法分析
- 4.2 模板
-
⑤ 并查集
- 5.1 算法分析
- 5.2 模板
-
⑥ C++随机数
三、算法笔记
① 栈:
∙ \bullet ∙ STL——栈的分析及用法:
- 包含栈的头文件:
#include<stack>
。 - 栈的特点:先进后出,与队列相反
- 定义一个栈:
stack<Type> s;
其中Type
为数据类型。 - 栈的主要操作:
s.push(a);//将a压入栈顶
s.pop();//删除栈顶的元素,但不会返回
s.top();//返回栈顶的元素,但不会删除
s.size();//返回栈中元素的个数
s.empty();//检查栈是否为空,如果为空返回true,否则返回false
- 栈的模板题练习:CF26B
∙ \bullet ∙ 手写——栈的分析及用法:
- 难度不大,但比STL要更快。
- 手写模板(具体作用见上面解释):
int q[10000005],top=1;
入栈:q[top++]=n;
出栈:n=q[--top];
查栈顶:n=q[top];
- 原理:用数组模拟栈的操作。
② 队列:
∙ \bullet ∙ STL——队列的分析及用法:
-
包含队列的头文件:
#include<queue>
。 -
队列的特点:先进先出,与栈相反
-
定义一个队列:
queue<Type> q;
其中Type
为数据类型。 -
队列的主要操作:
q.push(a)//将a压入队列尾部
q.pop()//删除队首元素,但不返回
q.front()//返回队首元素,但不删除
q.back()//返回队尾元素,但不删除
q.size()//返回队列中元素的个数
q.empty()//检查队列是否为空,如果为空返回true,否则返回false
- 队列的模板题练习:CF637B
∙ \ \ \ \ \ \ \ \ \ \bullet ∙ 手写——队列的分析及用法:
-
难度不大,但比STL要更快。
-
手写模板(具体作用见上面解释):
int q[10000005],l=0,r=1;
入队:q[r++]=n;
出队首:q[++l];
查队首:n=q[l];
原理:用数组模拟队列的操作。
③ 快速幂:
∙ \bullet ∙ 算法分析:
- 快速幂用途:用于直接求一个数的 n n n 次幂会爆数据的题
- 快速幂原理:具体见这里
∙ \bullet ∙ 程序模板:
int pow(int a, int b) {
int ans=1,base=a;
while(b!=0) {
if(b&1)//判断b的奇偶
ans*=base;//当n为奇数时,乘以base(当前权值下的a)
base*=base;
b>>=1;//等价于b/=2
}
return ans;
}
- 队列的模板题练习:P1226
④ 线性筛:
∙ \bullet ∙ 算法分析:
-
线性筛用途:快速的求范围 n n n 内的所有素数,其时间复杂度小于暴力求素数。
-
线性筛原理:具体见这里
∙ \ \ \ \ \ \ \ \ \ \bullet ∙ 程序模板:
bool isPrime[100000010];
int Prime[5000010], cnt=0;
void GetPrime(int n) {
memset(isPrime, 1, sizeof(isPrime));
isPrime[1] = 0;
for(int i = 2; i <= n; i++) {
if(isPrime[i])
Prime[++cnt] = i;
for(int j=1;j<=cnt&&i*Prime[j]<=n; j++) {
isPrime[i*Prime[j]] = 0;
if(i % Prime[j] == 0)
break;
}
}
}
//main函数第一行加上 GetPrime(n) n为范围
- 线性筛的模板题练习:P3383
⑤ 并查集:
∙ \bullet ∙ 算法分析:
1.并查集,顾名思义,就是有合并,查找等操作的集合。
∙ \bullet ∙ 程序模板:
#include<iostream>
#include<cstdio>
using namespace std;
int a[10001],i;
int zhao(int x) { //用来查找x的祖宗
if(a[x]==x) { return x; }
return a[x]=zhao(a[x]);
}
bool cha(int x,int y) { //用来判断x,y的祖宗是不是同一个人
if(zhao(x)==zhao(y)) { return true;
} else { return false; }
}
void bin(int x,int y) { //用来合并x,y
if(cha(x,y)==false) a[zhao(x)]=zhao(y);
}
int main() {
int N,M;
scanf("%d%d",&N,&M);
for(i=1; i<=N; ++i) a[i]=i;
for(i=1; i<=M; ++i) {
int z,x,y;
scanf("%d%d%d",&z,&x,&y);
if(z==1) {
bin(x,y);
} else {
if(cha(x,y))
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
- 本程序为并查集模板P3367的AC程序
⑥ C++随机数:
-
随机数头文件
#include <cstdlib>
-
使用宏定义
#define random(a,b) (rand()%(b-a)+a)
-
在开头加上
srand((int)time(0));
-
最后,在程序中加入
random(l,r);
就可以求 l l l 到 r r r 之间的随机数了。
5.程序示范:
#include <iostream>
#include <cstdlib>
#include <ctime>
#define random(a,b) (rand()%(b-a)+a)
using namespace std;
int main(){
srand((int)time(0)); // 产生随机种子,把0换成NULL也行
for (int i = 0; i < 10; i++){
cout<<random(5, 10)<<" ";
}
return 0;
}
//此程序可以产生 5 到 10 之间的随机数
四、友情链接
- 无(有意向者可私信我)
五、尾声
本文章已经接近尾声了,我很庆幸,你可以坚持看下来,这些东西都是我精心准备的,希望可以对你有帮助。当然,如果你觉得这篇文章写得好,可以在下面评论,或者点赞。如果你觉得有错误,或者有建议,欢迎私信我,或者加我的QQ:944898918 。最后,希望你可以继续努力,学习编程,加油!
——By Andysun06
六、有关本文章
- 作者:@Andysun06
- 写作开始时间:2020/3/26
- 最近一次更新:2020/3/28
- 版本:V1.2
- 目前更新状况:未完待续……
- 字数:4013