acwing-y总基础课算法笔记整理

技巧

vector, 变长数组,倍增的思想size()  返回元素个数 capacity() 容量empty()  返回是否为空clear()  清空front()/back()push_back()/pop_back()begin()/end()[]支持比较运算,按字典序pair<int, int>first, 第一个元素second, 第二个元素支持比较运算,以first为第一关键字,以second为第二关键字(字典序)string,字符串size()/length()  返回字符串长度empty()clear()substr(起始下标,(子串长度))  返回子串c_str()  返回字符串所在字符数组的起始地址queue, 队列size()empty()push()  向队尾插入一个元素front()  返回队头元素back()  返回队尾元素pop()  弹出队头元素priority_queue, 优先队列,默认是大根堆size()empty()push()  插入一个元素top()  返回堆顶元素pop()  弹出堆顶元素定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;stack,size()empty()push()  向栈顶插入一个元素top()  返回栈顶元素pop()  弹出栈顶元素deque, 双端队列size()empty()clear()front()/back()push_back()/pop_back()push_front()/pop_front()begin()/end()[]set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列size()empty()clear()begin()/end()++, -- 返回前驱和后继,时间复杂度 O(logn)set/multisetinsert()  插入一个数find()  查找一个数count()  返回某一个数的个数erase()(1) 输入是一个数x,删除所有x   O(k + logn)(2) 输入一个迭代器,删除这个迭代器lower_bound()/upper_bound()lower_bound(x)  返回大于等于x的最小的数的迭代器upper_bound(x)  返回大于x的最小的数的迭代器map/multimapinsert()  插入的数是一个pairerase()  输入的参数是pair或者迭代器find()[]  注意multimap不支持此操作。 时间复杂度是 O(logn)lower_bound()/upper_bound()unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表和上面类似,增删改查的时间复杂度是 O(1)不支持 lower_bound()/upper_bound(), 迭代器的++--bitset, 圧位bitset<10000> s;~, &, |, ^>>, <<==, !=[]count()  返回有多少个1any()  判断是否至少有一个1none()  判断是否全为0set()  把所有位置成1set(k, v)  将第k位变成vreset()  把所有位变成0flip()  等价于~flip(k) 把第k位取反
  • 排序

    在这里插入图片描述

  • 基础算法

    • 排序

      • 快速排序

        void quick_sort(int q[], int l, int r)
        {if (l >= r) return;
        # 取最左、最右、基准点int i = l - 1, j = r + 1, x = q[l + r >> 1];
        # 循环,使基准左边都比基准小,右边都比基准大while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}
        # 递归排序quick_sort(q, l, j), quick_sort(q, j + 1, r);
        }
        
      • 归并排序

        void merge_sort(int q[], int l, int r)
        {if (l >= r) return;# 取中值int mid = l + r >> 1;# 递归排序左右部分merge_sort(q, l, mid);merge_sort(q, mid + 1, r);# 从左右部分中取小值放入新数组int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];else tmp[k ++ ] = q[j ++ ];while (i <= mid) tmp[k ++ ] = q[i ++ ];while (j <= r) tmp[k ++ ] = q[j ++ ];# 放回原数组for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
        }
        
    • 二分

      • 模板

        bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
        // 结果是找到序列中满足要求最左边的数
        int bsearch_1(int l, int r)
        {while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;    // check()判断mid是否满足性质else l = mid + 1;}return l;
        }
        // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用
        //结果是找到序列中最右边的数
        int bsearch_2(int l, int r)
        {while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
        }
        
      • 数的范围

        #include<iostream>
        using namespace std;const int N=100010;
        int n,m,q[N];
        int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&q[i]);while(m--){int x; scanf("%d",&x);int l=0,r=n-1,mid;while(l<r){mid = l+r>>1;if(q[mid]>=x) r=mid;else l = mid+1;}if(q[l]!=x) cout<<"-1 -1"<<endl;else{cout<<l<<' ';l=0,r=n-1;while(l<r){mid = l+r+1>>1;if(q[mid]<=x) l=mid;else r=mid-1;}cout<<l<<endl;}}return 0;
        }
        
      • 数的三次方根

        #include<iostream>
        using namespace std;
        int main(){double x,mid;cin>>x;double l=-10000,r=10000; while(r-l>1e-8){mid=(l+r)/2;if(mid*mid*mid>=x) r=mid;else l=mid;}printf("%lf",l);return 0;
        }
        
    • 高精度

      • 高精度加法

        #include<iostream>
        #include<vector>using namespace std;
        const int N=1e6+10;vector<int> add(vector<int> &A,vector<int> &B){int t=0;vector<int> C;for(int i=0;i<A.size()||i<B.size();i++){if(i<A.size()) t+=A[i];if(i<B.size()) t+=B[i];C.push_back(t%10);t/=10;}if(t) C.push_back(1);return C;
        }
        int main(){string a,b;vector<int> A,B;cin>>a>>b;for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');vector<int> C = add(A,B);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;
        }
        
      • 高精度减法

        #include<iostream>
        #include<vector>using namespace std;bool cmp(vector<int> &A,vector<int> &B){if(A.size()!=B.size()) return A.size()>B.size();else{for(int i=A.size()-1;i>=0;i--)if(A[i]!=B[i]) return A[i]>B[i];}return true;
        }vector<int> sub(vector<int> &A,vector<int> &B){int t=0;vector<int> C;for(int i=0;i<A.size();i++){t=A[i]-t;if(i<B.size()) t-=B[i];C.push_back((t+10)%10);if(t<0) t=1;else t=0;}while(C.size()>1&&C.back()==0) C.pop_back();return C;
        }
        int main(){string a,b;vector<int> A,B;cin>>a>>b;for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');if(cmp(A,B)){vector<int> C = sub(A,B);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);}else{printf("-");vector<int> C = sub(B,A);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);}return 0;
        }
        
      • 乘法

        #include<iostream>
        #include<vector>using namespace std;
        const int N=1e6+10;vector<int> mul(vector<int> &A,int b){int t=0;vector<int>C;for(int i=0;i<A.size()||t;i++){if(A.size()) t+=A[i]*b;C.push_back(t%10);t/=10;}while(C.size()>1&&C.back()==0) C.pop_back();return C;
        }
        int main(){string a;int b;vector<int> A;cin>>a>>b;for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');vector<int> C = mul(A,b);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;
        }
        
      • 除法

        #include<iostream>
        #include<vector>
        #include<algorithm>
        using namespace std;
        const int N=1e6+10;vector<int> exc(vector<int> &A,int b,int &r){vector<int> C;for(int i=A.size()-1;i>=0;i--){r=r*10+A[i];C.push_back(r/b);r%=b;}reverse(C.begin(),C.end());while(C.size()>1&&C.back()==0) C.pop_back();return C;
        }
        int main(){string a;int b,r=0;vector<int> A;cin>>a>>b;for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');vector<int> C = exc(A,b,r);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);cout<<endl<<r<<endl;return 0;
        }
        
    • 前缀和与差分

      一维前缀和

      	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];while(m--){scanf("%d%d",&l,&r);printf("%d\n",s[r]-s[l-1]);}
      

      二维前缀和

      for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
      for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
      

      一维差分

      #include<iostream>
      using namespace std;
      const int N=1e5+10;
      int a[N],b[N];void insert(int l,int r,int c){b[l]+=c;b[r+1]-=c;
      }
      int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) insert(i,i,a[i]);while(m--){int l,r,c; scanf("%d%d%d",&l,&r,&c);insert(l,r,c);	}for(int i=1;i<=n;i++) b[i]+=b[i-1];for(int i=1;i<=n;i++) printf("%d ",b[i]);return 0;
      }
      

      二维差分

      #include<iostream>
      using namespace std;
      const int N=1010;
      int a[N][N],b[N][N];
      void insert(int x1,int y1,int x2,int y2,int c){b[x1][y1]+=c;b[x1][y2+1]-=c;b[x2+1][y1]-=c;b[x2+1][y2+1]+=c;
      }int main(){int n,m,q;scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)insert(i,j,i,j,a[i][j]);while(q--){int x1,y1,x2,y2,c;scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);insert(x1,y1,x2,y2,c);}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d ",b[i][j]);puts(""); 	}return 0;
      }
      
    • 双指针算法

      最长连续不重复子序列

      #include<iostream>
      using namespace std;
      const int N=100010;
      int a[N],s[N];//用于存储当前在看的区间 
      int main(){int n,res=0; cin>>n;for(int i=0;i<n;i++) cin>>a[i];for(int i=0,j=0;i<n;i++){s[a[i]]++;
      //		意义:停下来时j~i为连续序列,保证i扫过的数都只出现过一次while(s[a[i]]>1){//正在看的数出现过多次s[a[j]]--;//已经看过的数指针j往后移,使记录数组减小 j++;}res=max(res,i-j+1);} cout<<res; return 0;
      }
      

      数组元素的目标和

      #include<iostream>
      using namespace std;
      const int N=100000;
      int a[N],b[N];
      int main(){int n,m,x;cin>>n>>m>>x;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<m;i++) cin>>b[i];for(int i=0,j=m-1;i<n;i++){while(a[i]+b[j]>x) j--;if(a[i]+b[j]==x) cout<<i<<" "<<j;}return 0;
      }
      
    • 位运算-二进制表示中1的个数

      #include<iostream>
      using namespace std;
      int lowbit(int x){return x&-x;//返回最后一个1的位置 
      }
      int main(){int n;cin>>n;while(n--){int x;cin>>x;int res=0;while(lowbit(x)) {res++;x-=lowbit(x);}cout<<res<<" ";}return 0;
      }
      

待更新…完整版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pt格式文件转engine小记【yolov5-6.0版本】

背景 项目是使用yolov5-6.0的版本&#xff0c;需要加一个新模型进去&#xff0c;yolov5提供的类别有很多&#xff0c;我这里使用chair椅子。第一步就是先把提供的pt文件转化为tensorrt所需要的engine格式的文件&#xff0c;在官网上有提供转换方法。&#xff08;似乎高版本的y…

查看apk是64位32位(三种方法)

通过检查APK文件&#xff0c;你可以确定该APK支持的架构类型&#xff0c;包括它是为64位&#xff08;例如arm64-v8a、x86_64&#xff09;还是32位&#xff08;例如armeabi-v7a、x86&#xff09;架构准备的。Android应用程序可以包含多个不同的二进制文件&#xff0c;每个文件针…

1097 矩阵行平移(语文题,选做)

输入样例&#xff1a; 7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22 输出样例&#xff1a; 529 481 479 263 417 342 343 样例解读 需要平移的是第 1、…

【Java】常见锁策略 CAS机制 锁优化策略

前言 在本文会详细介绍各种锁策略、CAS机制以及锁优化策略 不仅仅局限于Java&#xff0c;任何和锁相关的话题&#xff0c;都可能会涉及到下面的内容。 这些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的 文章目录 前言✍一、…

Spring Boot 2.x 将 logback 1.2.x 升级至 1.3.x

场景 安全部门针对代码进行漏洞扫描时&#xff0c;发现 logback-core 和 logback-classic 都属于 1.2.x 版本&#xff0c;这个版本存在 CVE 漏洞&#xff0c;并且建议升级到 1.3.x 版本。 问题 将两个包直接升级到 1.3.x 版本时&#xff0c;Spring Boot Web 服务启动直接出现…

CNN卷积神经网络之LeNet-5原理与实战

文章目录 CNN卷积神经网络之LeNet-5原理与实战1、LeNet-5网络结构&#xff1a;1.1、LeNet-5由两个部分组成&#xff1a;1.2、模型单元结构&#xff1a;1.3、数据的传输&#xff1a; 2、LeNet-5网络参数详解&#xff1a; CNN卷积神经网络之LeNet-5原理与实战 1、LeNet-5网络结构…

MySql8快速迁移版的制作过程

首先说明&#xff0c;mysql 8的安装不同与mysql5.x。 做程序的朋友都知道&#xff0c;程序好做&#xff0c;客户难伺候&#xff0c;因为限于用户的情况&#xff0c;如何能让用户把程序运行起来很关键&#xff0c;比如日前我在做 山东高中信息技术 学考 考前练习 系统时&#x…

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift&#xff08;按住不放&#xff09; 2. 直到出现下面的界面&#xff0c;释放Shift&#xff0c;并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘&#xff1f; 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

27个必备的Python技巧,你一定要知道!

目 录 01. 为什么使用缩进来分组语句&#xff1f; Guido van Rossum 认为使用缩进进行分组非常优雅&#xff0c;并且大大提高了普通 Python 程序的清晰度。大多数人在一段时间后就学会并喜欢上这个功能。 由于没有开始/结束括号&#xff0c;因此解析器感知的分组与人…

C++能不能调用C语言的动态库?

能。C当然可以调用C语言编写的动态库。 在C和C开发中&#xff0c;有许多知名的C库被广泛使用&#xff0c;比如C标准库、zlib、libcurl、sqlite、cairo等等等等。这些库在C项目中经常会被用到。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

维护SQLite的私有分支(二十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite、MySQL 和 PostgreSQL 数据库速度比较&#xff08;本文阐述时间很早比较&#xff0c;不具有最新参考性&#xff09;&#xff08;二十五&#xff09; 下一篇&#xff1a;SQLite数据库中JSON 函数和运算符 1…

汇编语言 实验10.1

汇编语言 实验10.1 assume cs:code,ds:datasgdatasg segmentdb welcome to masm!,0 datasg endsstack segmentdw 0,0,0,0,0,0,0,0 stack endscode segment ;代码段start: mov dh,8mov dl,3mov cl,2mov ax,datasgmov ds,axmov si,0call show_strmov ax,4c00h ;程序返回int 21hs…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

Java八股文4

Linux篇 1.free命令-查看内存状态 free命令用于显示内存状态&#xff0c;它可以提供关于系统内存使用情况的详细信息。这个命令会显示出内存的使用情况&#xff0c;包括实体内存、虚拟的交换文件内存、共享内存区段&#xff0c;以及系统核心使用的缓冲区等。 其中&#xff0c;参…

每三人拥有一辆车!车载工业平板电脑五大硬性要求

在今年7月初&#xff0c;公安部发布2022年上半年全国机动车和驾驶人统计数据&#xff0c;数据显示&#xff0c;截至2022年6月底&#xff0c;全国机动车保有量达4.06亿辆&#xff0c;其中汽车3.10亿辆。此外&#xff0c;目前全国拥有驾驶证的人数高达4.92亿人&#xff0c;其中汽…

一文读懂电阻并联电路和串联电路的特性

电阻并联电路是最基本的并联电路&#xff0c;所有的电路都可以转化为电阻串联电路和电阻并联电路来了解其工作原理。并联电路和串联电路具有完全不同的特性。它们是完全不同的电路&#xff0c;不能相互等效&#xff08;电阻并联电路图&#xff09;。 串联电路 特点与特性&…

探索半导体测试领域:哲讯TCC智能化管理系统的应用与优势

在半导体行业中&#xff0c;封装和测试环节是至关重要的一环。半导体封装测试是指将通过测试的晶圆按照产品型号及功能需求加工得到独立芯片的过程。半导体封测包括封装和测试两个环节&#xff0c;封装是保护芯片免受物理、化学等环境因素造成的损伤&#xff0c;增强芯片的散热…

es安装中文分词器

下载地址&#xff0c;尽量选择和自己本地es差不多的版本 https://github.com/infinilabs/analysis-ik/releases 下载好&#xff0c;解压&#xff0c;把里面的文件放到es的plugins/ik目录下 把plugin-descriptor.properties文件里的es版本改成自己对应的 再启动es&#xff0c;能…

Mamba 学习

Vision Mamba U-Mamba 以后的趋势&#xff1a; 1.Mamba模型机机制上和transform一样&#xff0c;但是参数量上做了改进&#xff0c;可以直接替代 2.vision上可以实时处理