• 一.基础算法


    快速排序

    1. void quicksort(int a[],int l,int r){
    2. if(l>=r) return ;
    3. int x=a[l+r>>1],i=l-1,j=r+1;
    4. while(i
    5. do i++;while(a[i]
    6. do j--;while(a[j]>x);
    7. if(iswap(a[i],a[j]);
    8. }
    9. quicksort(a,l,j);
    10. quicksort(a,j+1,r);
    11. }

    归并排序

    1. void mergesort(int left,int right){
    2. if(left>=right) return ;
    3. int mid=(left+right)/2;
    4. mergesort(left,mid);
    5. mergesort(mid+1,right);
    6. int i=left,j=mid+1,k=0;
    7. while(i<=mid&&j<=right){
    8. if(a[i]<=a[j]) b[k++]=a[i++];
    9. else b[k++]=a[j++];
    10. }
    11. while(i<=mid) b[k++]=a[i++];
    12. while(j<=right) b[k++]=a[j++];
    13. for(int i=left,j=0;i<=right;i++,j++) a[i]=b[j];
    14. return ;
    15. }

    二分

    1. //整数二分
    2. int left=l,right=r;
    3. while(left
    4. int mid=left+right>>1;
    5. if(check(mid)) right=mid;
    6. else left=mid+1;
    7. }
    8. int left=l,right=r;
    9. while(left
    10. int mid=left+right+1>>1;
    11. if(check(mid)) right=mid-1;
    12. else left=mid;
    13. }
    14. //浮点数二分
    15. double l,r;
    16. while(r-l>1e-8){
    17. double mid=(l+r)/2;
    18. if(check(mid)) l=mid;
    19. else r=mid;
    20. }

    高精度

    1. A+B
    2. vector<int> add(vector<int>&A,vector<int>&B){
    3. vector<int>C;
    4. int t=0;
    5. for(int i=0;isize()||isize();i++){
    6. if(isize()) t+=A[i];
    7. if(isize()) t+=B[i];
    8. C.push_back(t%10);
    9. t/=10;
    10. }
    11. if(t) C.push_back(1);
    12. return C;
    13. }
    14. A-B
    15. vector<int> sub(vector<int> &A,vector<int> &B){
    16. vector<int>C;
    17. int t=0;
    18. for(int i=0;isize();i++){
    19. t=A[i]-t;
    20. if(isize()) t-=B[i];
    21. C.push_back((t+10)%10);
    22. if(t<0) t=1;
    23. else t=0;
    24. }
    25. while(C.size()>1&&C.back()==0) C.pop_back();
    26. return C;
    27. }
    28. A*b
    29. vector<int> mul(vector<int> &A,int b){
    30. vector<int>C;
    31. int t=0;
    32. for(int i=0;isize()||t;i++){
    33. if(isize()) t+=A[i]*b;
    34. C.push_back(t%10);
    35. t/=10;
    36. }
    37. return C;
    38. }
    39. A/b
    40. vector<int> mul(vector<int> &A,int b,int &r){
    41. vector<int>C;
    42. r=0;
    43. for(int i=A.size();i>=0;i--){
    44. r=r*10+A[i];
    45. C.push_back(r/b);
    46. r%=b;
    47. }
    48. reverse(C.begin(),C.end());//#include
    49. while(C.size()>1&&C.back()==0) C.pop_back();
    50. return C;
    51. }

    前缀和与差分

    1. 一维前缀和
    2. a[i]+=a[i-1];
    3. 表示l到r区间的元素和:
    4. a[r]-a[l-1];
    5. 二维前缀和
    6. a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
    7. 表示(x1,y1)到(x2,y2)区间的元素和:
    8. a[x2][y2]+a[x1-1][y1-1]-a[x1-1][y2]-a[x2][y1-1];
    9. 一维差分
    10. a[i]=b[i]-b[i-1];
    11. 表示将序列中[l,r]之间的每个数加上c:
    12. a[l]+=c,a[r+1]-=c;
    13. 二维差分
    14. b[i][j]+=a[i][j];
    15. b[i+1][j+1]+=a[i][j];
    16. b[i][j+1]-=a[i][j];
    17. b[i+1][j]-=a[i][j];
    18. 表示将(x1,y1)到(x2,y2)之间每个数加上c:
    19. b[x1][y1]+=c;
    20. b[x2+1][y2+1]+=c;
    21. b[x1][y2+1]-=c;
    22. b[x2+1][y1]-=c;

    双指针

    1. for(i=0,j=0;i
    2. while(jcheck(i,j)) j++;
    3. //......
    4. }

    位运算

    1. 把n的二进制数的第k位移动到最后一位:
    2. n>>k;
    3. 求n的二进制数的最后一位
    4. n&1;
    5. 求n的二进制数的第k位
    6. n>>k&1;
    7. lowbit(x);
    8. 表示返回x表示的二进制中最低位1对应的值
    9. 如:
    10. x为10D,则其二进制表示为1010B
    11. lowbit(x)=10B=2D
    12. 实现:
    13. int lowbit(int x){
    14. return x&-x;
    15. }

    离散化

    1. 离散化本质上就是化大为小,把稀疏离散化简为稠密连续的一段
    2. 特点:值域大,个数少
    3. //离散化模板:
    4. vector<int>a;//存储所有待离散化的值
    5. sort(a.begin(),a.end());//排序
    6. a.erase(unique(a.begin(),a.end()),a.end());//去重
    7. //二分出x对应的离散化的值
    8. int find(int x){//找到第一个大于等于x的位置
    9. int l=0,r=a.size()-1;
    10. while(l
    11. int mid=l+r>>1;
    12. if(a[mid]>=x) r=mid;
    13. else l=mid+1;
    14. }
    15. return r+1;//映射到1,2,3,4,5,6......
    16. }
    17. //另一种离散化模板:
    18. void work(int a[]){
    19. for(int i=1;i<=n;i++) p[i]=i;
    20. sort(p+1,p+1+n,[&](int x,int y){return a[x]
    21. for(int i=1;i<=n;i++) a[p[i]]=i;
    22. }
    23. //另一种离散化模板:
    24. 补:lower_bound(first,last,value):
    25. 可以查找区间中第一个>=value的值,返回指向这个数的下标的迭代器
    26. lower_bound的头文件为#include
    27. int main(){
    28. cin>>n;
    29. for(int i=1;i<=n;i++){
    30. cin>>a[i];//输入要离散化的a数组
    31. b[i]=a[i];//b数组临时记录a的值
    32. }
    33. sort(a+1,a+n+1);//给a排序
    34. int cnt=unique(a+1,a+n+1)-(a+1);//计算a中不重复的所有元素个数
    35. for(int i=1;i<=n;i++){
    36. b[i]=lower_bound(a+1,a+cnt+1,b[i])-(a+1)+1;//将b数组更新为离散化后的下标
    37. }
    38. for(int i=1;i<=n;i++) cout<" ";//输出b数组
    39. return 0;
    40. }

    区间合并

    1. #include
    2. #define x first
    3. #define y second
    4. const int N=1e5+5;
    5. typedef pair<int,int>pii;
    6. pii seg[N];
    7. sort(seg,seg+n);
    8. int l=seg[0].x,r=seg[0].y;
    9. for(int i=0;i
    10. if(seg[i].x<=r) r=max(r,seg[i].y);
    11. else l=seg[i].x,r=seg[i].y;
    12. }
  • 相关阅读:
    在SpringBoot下,tomcat的运行模式:BIO、NIO、APR
    13.Blender 界面介绍(下) 雕刻、纹理绘制及属性
    零基础上手unity VR开发【配置PC端项目的实时调试】
    《opencv学习笔记》-- 线性滤波:方框滤波、均值滤波、高斯滤波
    手写简单版SpringMVC
    SpringBoot携带Jre绿色部署项目_免安装Jdk[Linux服务器]
    详解Python中的json库
    提示工程101|与 AI 交谈的技巧和艺术
    CRM系统开发
    Vc - Qt - “扩张“的窗口
  • 原文地址:https://blog.csdn.net/2301_76144982/article/details/137876891