[关闭]
@Andysun06 2020-04-04T04:49:35.000000Z 字数 3718 阅读 646

蒟蒻Andysun06的学习笔记

本文章未经博主许可,不能转载!

本文章同步发表于:


一、前言:

本文章是蒟蒻我独立创作的,大部分内容都是基础,还包括一些其他东西的用法(例如随机数),本文章所涉及的知识大部分都是自学的(因为还没找到适合我的老师)。还有一部分,是@FCBM71 和@jijidawang 等大佬教我的,我在此感谢他们对我的教导,希望我可以和他们共同努力,变得更厉害,也谢谢广大谷友对我的帮助和支持,我会继续努力的!
——By Andysun06


二、目录:



三、算法笔记

① 栈:

STL——栈的分析及用法:

1. 包含栈的头文件:#include<stack>
2. 栈的特点:先进后出,与队列相反
3. 定义一个栈:stack<Type> s; 其中Type为数据类型。
4. 栈的主要操作:

  1. s.push(a);//将a压入栈顶
  2. s.pop();//删除栈顶的元素,但不会返回
  3. s.top();//返回栈顶的元素,但不会删除
  4. s.size();//返回栈中元素的个数
  5. s.empty();//检查栈是否为空,如果为空返回true,否则返回false

5. 栈的模板题练习:CF26B

手写——栈的分析及用法:

1. 难度不大,但比STL要更快。
2. 手写模板(具体作用见上面解释):

  1. int q[10000005],top=1;
  2. 入栈:q[top++]=n;
  3. 出栈:n=q[--top];
  4. 查栈顶:n=q[top];

3. 原理:用数组模拟栈的操作。


② 队列:

STL——队列的分析及用法:

1. 包含队列的头文件:#include<queue>

2. 队列的特点:先进先出,与栈相反

3. 定义一个队列:queue<Type> q; 其中Type为数据类型。

4. 队列的主要操作:

  1. q.push(a)//将a压入队列尾部
  2. q.pop()//删除队首元素,但不返回
  3. q.front()//返回队首元素,但不删除
  4. q.back()//返回队尾元素,但不删除
  5. q.size()//返回队列中元素的个数
  6. q.empty()//检查队列是否为空,如果为空返回true,否则返回false

5. 队列的模板题练习:CF637B

手写——队列的分析及用法:

1. 难度不大,但比STL要更快。

2. 手写模板(具体作用见上面解释):

  1. int q[10000005],l=0,r=1;
  2. 入队:q[r++]=n;
  3. 出队首:q[++l];
  4. 查队首:n=q[l];

原理:用数组模拟队列的操作。


③ 快速幂:

算法分析:

1. 快速幂用途:用于直接求一个数的 次幂会爆数据的题
2. 快速幂原理:具体见这里

程序模板:

  1. int pow(int a, int b) {
  2. int ans=1,base=a;
  3. while(b!=0) {
  4. if(b&1)//判断b的奇偶
  5. ans*=base;//当n为奇数时,乘以base(当前权值下的a)
  6. base*=base;
  7. b>>=1;//等价于b/=2
  8. }
  9. return ans;
  10. }

1. 快速幂的模板题练习:P1226


④ 线性筛:

算法分析:

1. 线性筛用途:快速的求范围 内的所有素数,其时间复杂度小于暴力求素数。

2. 线性筛原理:具体见这里

程序模板:

  1. bool isPrime[100000010];
  2. int Prime[5000010], cnt=0;
  3. void GetPrime(int n) {
  4. memset(isPrime, 1, sizeof(isPrime));
  5. isPrime[1] = 0;
  6. for(int i = 2; i <= n; i++) {
  7. if(isPrime[i])
  8. Prime[++cnt] = i;
  9. for(int j=1;j<=cnt&&i*Prime[j]<=n; j++) {
  10. isPrime[i*Prime[j]] = 0;
  11. if(i % Prime[j] == 0)
  12. break;
  13. }
  14. }
  15. }
  16. //main函数第一行加上 GetPrime(n) n为范围

1. 线性筛的模板题练习:P3383


⑤ 并查集:

算法分析:

1.并查集,顾名思义,就是有合并,查找等操作的集合。

2. 文档教程这里

3. 视频教程这里

程序模板:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int a[10001],i;
  5. int zhao(int x) { //用来查找x的祖宗
  6. if(a[x]==x) { return x; }
  7. return a[x]=zhao(a[x]);
  8. }
  9. bool cha(int x,int y) { //用来判断x,y的祖宗是不是同一个人
  10. if(zhao(x)==zhao(y)) { return true;
  11. } else { return false; }
  12. }
  13. void bin(int x,int y) { //用来合并x,y
  14. if(cha(x,y)==false) a[zhao(x)]=zhao(y);
  15. }
  16. int main() {
  17. int N,M;
  18. scanf("%d%d",&N,&M);
  19. for(i=1; i<=N; ++i) a[i]=i;
  20. for(i=1; i<=M; ++i) {
  21. int z,x,y;
  22. scanf("%d%d%d",&z,&x,&y);
  23. if(z==1) {
  24. bin(x,y);
  25. } else {
  26. if(cha(x,y))
  27. printf("Y\n");
  28. else
  29. printf("N\n");
  30. }
  31. }
  32. return 0;
  33. }

1. 本程序为并查集模板P3367的AC程序


⑥ C++随机数:

1. 随机数头文件 #include <cstdlib>

2. 使用宏定义 #define random(a,b) (rand()%(b-a)+a)

3. 在开头加上 srand((int)time(0));

4. 最后,在程序中加入 random(l,r); 就可以求 之间的随机数了。

5.程序示范:

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #define random(a,b) (rand()%(b-a)+a)
  5. using namespace std;
  6. int main(){
  7. srand((int)time(0)); // 产生随机种子,把0换成NULL也行
  8. for (int i = 0; i < 10; i++){
  9. cout<<random(5, 10)<<" ";
  10. }
  11. return 0;
  12. }
  13. //此程序可以产生 5 到 10 之间的随机数

四、友情链接

五、尾声

本文章已经接近尾声了,我很庆幸,你可以坚持看下来,这些东西都是我精心准备的,希望可以对你有帮助。当然,如果你觉得这篇文章写得好,可以在下面评论,或者点赞。如果你觉得有错误,或者有建议,欢迎私信我,或者加我的QQ:944898918 。最后,希望你可以继续努力,学习编程,加油!
——By Andysun06

六、有关本文章


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注