模板二(基础算法)

news2025/1/20 11:54:42

目录

快速排序

 归并排序

二分

整数二分

 浮点数二分

前缀和

一维前缀和

二维前缀和

差分

一维差分

二维差分

双指针

位运算

离散化

区间合并


快速排序

方法一:定义两个新数组,a[ ],b[ ],每次将大于x的放到a中,小于x的放到b中,再将其复制到q中

方法二:双指针,i=l-1,j=r+1,移动i、j,当q[i]小于x时,i++;当q[j]>x时,j--;直到都找到不满足的数字时,交换位置

#include <iostream>

using namespace std;

const int N=1e5+10;

int q[N];
int n;

void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    int x=q[(l+r)/2];
    int i=l-1,j=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);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)   scanf("%d",&q[i]);
    
    quick_sort(q,1,n);
    
    for(int i=1;i<=n;i++)   printf("%d ",q[i]);
    return 0;
}

 归并排序

1、选取中间位置,将整个数组一分为二

2、递归处理,直到保证[l,mid],[mid+1,r]都为有序的数组

3、合并数组,二合一

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e6+10;

int n;
int q[N],tmp[N];

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 i=l,j=mid+1;
    int k=0;
    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,k=1;i<=r;i++,k++)   q[i]=tmp[k];
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)   scanf("%d",&q[i]);
    
    merge_sort(q,1,n);
    
    for(int i=1;i<=n;i++)   printf("%d ",q[i]);
    return 0;
}

二分

整数二分

模板:
[l,r]划分为[l,mid],[mid+1,r]
while(l<r)
{
    int mid=l+r>>1;
    if(check()) l=mid+1;
    else r=mid;
}

[l,r]划分为[l,mid-1],[mid,r]
while(l<r)
{
    int mid=l+r+1>>1;
    if(check()) l=mid;
    else r=mid-1;
}
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int n,k,x;
int a[N];

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)   scanf("%d",&a[i]);
    while(k--)
    {
        cin>>x;
        int l=1,r=n;
        while(l<r)
        {
            int mid=l+r>>1;
            if(a[mid]>=x)   r=mid;
            else l=mid+1;
        }
        if(a[l]!=x) cout<<"-1 -1"<<endl;
        else
        {
            cout<<l-1<<" ";
            r=n;
            while(l<r)
            {
                int mid=l+r+1>>1;
                if(a[mid]>x)    r=mid-1;
                else l=mid;
            }
            cout<<r-1<<endl;
        }
    }
    return 0;
}

 浮点数二分

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
double x;
int main()
{
    cin>>x;
    double l=-10000.0,r=10000.0;
    while(r-l>=1e-8)
    {
        double mid=(l+r)/2;
        if(mid*mid*mid>x)   r=mid;
        else l=mid;
    }
    
    printf("%lf",l);
    return 0;
}

前缀和

一维前缀和

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e6+10;

int n,m;
int s[N];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)   
    {
        int x;
        scanf("%d",&x);
        s[i]=s[i-1]+x;
    }
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        
        cout<<s[r]-s[l-1]<<endl;
    }
    return 0;
}

二维前缀和

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1010;

int n,m,q;
int s[N][N];

int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int x;
            scanf("%d",&x);
            s[i][j]=s[i][j-1]+s[i-1][j]+x-s[i-1][j-1];
        }
    }
    
    while(q--)
    {
        int x1,x2,y1,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        cout<<s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]<<endl;
    }
    return 0;
}

差分

实现对区间[l,r]内的所有值+c;

a[ ],b[ ]

将a[ ]当做b[ ]的前缀和数组,b[i]=a[i-]-a[i-1]

=>a[i]=b[1]+b[2]+......+b[i]

对a[l].......a[r]均+c:b[l]+=c,b[r+1]-=c;

在对b[ ]求一遍前缀和

一维差分

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int a[N],s[N];
int n,m;

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

二维差分

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1010;

int n,m,q;
int a[N][N],b[N][N];

void insert(int x1,int y1,int x2,int y2,int c)
{
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][y2+1]-=c;
    b[x2+1][y2+1]+=c;
}
int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            insert(i,j,i,j,a[i][j]);
        }
    }
    while(q--)
    {
        int x1,x2,y1,y2,c;
        cin>>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++)
        {
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

双指针

1、指向两个序列(eg归并排序)

2、指向一个序列(eg.快排)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int a[N],n,s[N];
int res;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)   scanf("%d",&a[i]);
    
    for(int i=1,j=1;i<=n;i++)
    {
        s[a[i]]++;
        while(j<=i&&s[a[i]]>1) s[a[j++]]--;
        
        res=max(res,i-j+1);
    }
    
    cout<<res;
    return 0;
}

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int n,m,x;
int a[N],b[N];

int main()
{
    cin>>n>>m>>x;
    for(int i=1;i<=n;i++)   scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)   scanf("%d",&b[i]);
    
    // for(int i=1;i<=n;i++)
    // {
    //     for(int j=1;j<=m;j++)
    //     {
    //         if(a[i]+b[j]==x)
    //         {
    //             cout<<i-1<<" "<<j-1;
    //             break;
    //         }
    //     }
    // }
    for(int i=1,j=m;i<=n;i++)
    {
        while(j>=1&&a[i]+b[j]>x)  j--;
        if(j>=1&&a[i]+b[j]==x)
        {
            cout<<i-1<<" "<<j-1;
            break;
        }
    }
    return 0;
}

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int n,m;
int a[N],b[N];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)   scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)   scanf("%d",&b[i]);
    
    int i=1,j=1;
    while(i<=n&&j<=m)
    {
        if(a[i]==b[j])  i++;
        j++;
    }
    
    if(i==n+1)  cout<<"Yes";
    else cout<<"No";
    return 0;
}

位运算

//返回x的最后一位1
int lowbit(int x)
{
    return x&-x;
}

//判断x的第k位是否为1
if(x>>k&1)    

离散化

 离散化的步骤
        1、排序
        2、去重
        3、找到x离散化后的位置(二分)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int, int> PII;
const int N=3e5+10;

int n,m;
int a[N],s[N];//s是a的前缀和

vector<int> alls;//待离散化的数组
vector<PII> add,query;

int find(int x)//找到x离散化后的坐标
{
    int l=0,r=alls.size()-1;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(alls[mid]>x)  r=mid-1;
        else l=mid;
    }
    return l+1;
}

int main()
{
    cin>>n>>m;
    
    for(int i=1;i<=n;i++)
    {
        int x,c;
        cin>>x>>c;
        add.push_back({x,c});
        
        alls.push_back(x);
    }
    for(int i=1;i<=m;i++)
    {
        int l,r;
        cin>>l>>r;
        query.push_back({l,r});
        
        alls.push_back(l);
        alls.push_back(r);
    }
    //排序
    sort(alls.begin(),alls.end());
    //去重
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    
    //处理操作
    for(auto item:add)
    {
        int x=find(item.first);
        a[x]+=item.second;
    }

    //处理前缀和
    for(int i=1;i<=alls.size();i++)
    {
        s[i]=s[i-1]+a[i];
    }
    
    //处理查询
    for(auto item:query)
    {
        int l=find(item.first),r=find(item.second);
        cout<<s[r]-s[l-1]<<endl;
    }
    
    return 0;
}

区间合并

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int, int> PII;

int n;
vector<PII> segs;

void merge(vector<PII> &segs)
{
    vector<PII> res;
    int l=-2e9,r=-2e9;
    
    sort(segs.begin(),segs.end());
    
    for(auto item:segs)
    {
        if(item.first>r)
        {
            if(l!=-2e9) res.push_back({l,r});
            l=item.first,r=item.second;
        }
        else
        {
            r=max(r,item.second);
        }
    }
    
    if(r!=-2e9) res.push_back({l,r});
    
    segs=res;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        segs.push_back({l,r});
    }
    
    merge(segs);
    
    cout<<segs.size()<<endl;
    return 0;
}

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

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

相关文章

【矩阵论】6.范数理论——范数估计——许尔估计谱估计

6.3 许尔估计 任意方阵 A(aij)nnA(a_{ij})_{n\times n}A(aij​)nn​ &#xff0c;全体根 λ(A){λ1,⋯,λn}\lambda(A)\{\lambda_1,\cdots,\lambda_n\}λ(A){λ1​,⋯,λn​} &#xff0c;满足 ∣λ1∣2⋯∣λn∣2≤∑∣aij∣2\vert \lambda_1\vert^2\cdots\vert \lambda_n\ve…

数据存储格式

文章目录数据存储格式1 行列存储比较2 ORC文件格式2.1 文件级2.1.1 Post scripts2.1.2 File Footer2.1.3 File MetaData2.2 Stripe级2.2.1 Stripe Footer2.2.2 Row Data2.2.3 Index Data3 Parquet文件格式3.1 Header3.2 Data3.2.1 Row Group3.2.2 Column Chunk3.2.3 Page3.3 Fo…

正则表达式判断数字

判断 正负整数,正负小数 表达式: ^[-]?([0]{1,1}|[1-9]{1,1}[0-9]*?)[.]?[\\d]{1,}$ import java.util.Scanner; import java.util.regex.Pattern; public static void main(String[] args) { Pattern pattern Pattern.compile("^[-]?([0]{1,1}|[1-9]{1,1}…

3dtiles数据解析

1.解析json文件 2.解析b3dm模型 (1)b3dm模型文件时二进制文件&#xff0c;其中包含glTF文件&#xff1a; 当使用tiny_gltf库解析glTF时&#xff0c;需要减去(28byte featuretable的byte batchTable的byte ): bool TinyGLTF::ExtractGltfFromMemory(Model *model,std::string…

JVM - 内存区域划分 类加载机制 垃圾回收机制

目录 1. 内存区域划分 2. 类加载 2.1 双亲委派模型 3. 垃圾回收机制 (GC) 3.1 如何判断一个对象是否为 "垃圾" 3.1 可达性分析 3.2 垃圾回收算法 1. 内存区域划分 JVM 作本质上是一个 Java 进程, 它启动的时候, 就会从操作系统申请一大块内存, 并且把这一大块…

CSS学习(七):盒子模型,圆角边框,盒子阴影和文字阴影

原文链接&#xff1a;CSS学习&#xff08;七&#xff09;&#xff1a;盒子模型&#xff0c;圆角边框&#xff0c;盒子阴影和文字阴影 1. 盒子模型 页面布局要学习三大核心&#xff1a;盒子模型&#xff0c;浮动和定位。学习好盒子模型能非常好的帮助我们页面布局。 1.1 看透…

肽基脯氨酰异构酶底物:1926163-51-0,WFY-pSer-PR-AMC

WFYpSPR-AMC, Pin1底物类似显色底物H- trp - phi - tir - ser (PO₃H₂)-Pro-Arg-pNA。 磷酸肽在生命过程中发挥重要作用&#xff0c;磷酸化的位置在多肽上的Tyr、Ser&#xff0c;Thr&#xff0c;。目前磷酸肽合成一般都采用磷酸化氨基酸&#xff0c;目前使用的都是单苄基磷酸化…

Kafka Producer - 分区机制实战

Kafka Producer - 分区机制实战 上一篇介绍了kafka Producer 生产者发送数据的程序代码&#xff0c;以及对生产者分区机制的相关介绍&#xff0c;今天继续深入的了解下分区机制的原理、测试验证、自定义分区。 在学习之前先在本地机器搭建一个单机版的双节点集群环境&#xf…

80.【Spring5】

Spring《解耦》(一)、Spring 简介1.历史:2.Spring 目的3.Spring 引入4.优点5.Spring 七大模块组成:6.扩展&#xff08;约定大于配置&#xff09;(二)、IOC理论推导(Inversion of Contro)1.以前的三层分级2.现在对三层架构的更新3.什么是IOC(三)、HelloSpring1.怎么使用Spring?…

技术分享 | 缓存穿透 - Redis Module 之布隆过滤器

作者&#xff1a;贲绍华 爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一、场景案例 假…

设计模式-抽象工厂模式

1、什么是抽象工厂模式 抽象工厂&#xff08;AbstractFactory&#xff09;模式的定义&#xff1a;是一种为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的…

Tiny ImageNet 数据集分享

ImageNet官网上的数据集&#xff0c;动辄就100G&#xff0c;真的是太大了。 有需要Tiny Image Net 数据集的小伙伴可以点击这个下载链接&#xff1a; http://cs231n.stanford.edu/tiny-imagenet-200.zip数据集简介&#xff1a; Tiny ImageNet Challenge 来源于斯坦福 CS231N …

uwb无线定位系统的原理和介绍

uwb无线定位系统是在 uwb平台上部署的定位基站&#xff0c;通过发射无线信号&#xff0c;将 uwb定位系统部署在需要安装的位置&#xff0c;同时结合定位基站所支持工作环境条件&#xff08;如&#xff1a;温度、湿度、光照等&#xff09;和定位算法&#xff0c;实现在不同的地理…

使用elesticsearch-7.10.0版本连接elasticsearch-head

背景&#xff1a; 由于esasticsearch-5.5.1中没有登录&#xff0c;登出的安全校验&#xff0c;在安全测评时&#xff0c;经常被检查到高危漏洞&#xff0c;因此项目经常要升级到es7版本。 问题一&#xff1a;jdk版本不满足要求&#xff0c;提示如下 future versions of Elasti…

Js实现轮盘抽奖功能,一招帮你解决选择困难症

不知道今天自己该吃什么&#xff0c;一招帮你解决选择困难症。 通过htmlcssjs实现一个轮盘抽奖功能。我们可以将平时吃的饭菜输入到代码中&#xff0c;每到纠结的时候只需点开抽一次就可以了。 实现步骤 html代码&#xff1a; 整体实现的结构是一个大的圆形&#xff0c;分成…

热门项目披露:成都双流板桥轨道城市发展有限公司100%股权转让

热门项目披露&#xff1a;成都双流板桥轨道城市发展有限公司100%股权转让&#xff1b;该项目由 西南联合产权交易所 发布&#xff0c;于2022年12月9日被塔米狗平台收录。 项目方 成都双流板桥轨道城市发展有限公司&#xff0c; 成立于 2021年9月7日 &#xff0c; 注册资金 100…

域控制器交付量「翻番」,汽车中间件赛道竞争升级

作为软件定义汽车的关键环节&#xff0c;智能汽车中间件赛道&#xff0c;正在成为兵家必争之地。 从传统IT架构的角度看&#xff0c;中间件位于上层应用和底层操作系统之间&#xff1b;除了基础的通信交互外&#xff0c;中间件还承载着屏蔽底层复杂性的功能&#xff0c;向下适配…

005:UITableView

介绍&#xff1a; 提示&#xff1a;数据量大、样式较为统一、分组的需要以及滚动的需求。 图示&#xff1a; UITableViewDataSource&#xff1a; 提示UITableView作为视图&#xff0c;只负责展示&#xff0c;协助管理&#xff0c;不管数据需要开发者为UITableView提供展示需…

Framework底层原理——Binder调用流程分析

binder是一个非常好的跨进程通信工具&#xff0c;Android对其进行了各种封装&#xff0c;虽然我们用起来简单&#xff0c;但是理解起来却比较困难。 1.自己设计一个跨进程通信机制 在理解binder之前呢&#xff0c;首先我们想一下&#xff0c;如果我们自己设计一个跨进程通信的…

简单Thinkphp5.1如何使用Topsdk\Topapi

一淘模板&#xff08;56admin.cn&#xff09;给大家介绍tp5.1相关知识&#xff0c;其中主要记录tp5.1是怎么使用Topsdk\Topapi&#xff08;对接淘宝客开放平台&#xff09;&#xff0c;希望对需要的朋友有所帮助&#xff01; 1、公司有一项目需要对接淘宝开放平台 先去申请帐号…