基础算法学习以及$STL$的使用
1.优先队列
(1)大根堆(小顶堆)
priority_queue<int,vector<int>,greater<int> >q;
(2)小根堆(大顶堆)
priority_queue<int, vector<int>, less<int> >q;
//或者
priority_queue<int>q;
用法
q.push(x);//入队列
q.pop();//堆顶值
q.back();//队尾值
q.pop();//出队列
q.empty();//返回q是否为空,空则返回1,否则返回0
q.size();//返回q里元素个数
2.排序
(1)快排(STL万岁!\(QwQ\))
sort(a+1,a+n+1);//a数组1~n从小到大排序
(2)结构体排序
//定义
struct node{
int x,y;
};
node a[maxn];
//先从小到大按x值排序,再从大到小按y值排序
bool cmp(node s1,node s2){
if(s1.x!=s2.x)return s1.x<s2.x;
return s1.y>s2.y;
}
//主函数内
sort(a+1,a+n+1,cmp);
(3)结构体内重载运算符
struct node
{
    int x,y;
    bool operator < (const node & a) const
    {
        return x<a.x;
    }
};
(4)归并排序
#include<cstdio>
#include<cmath>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define _for(i,a,b) for(int i=a;i<=b;i++)
#define maxn 500005
using namespace std;
typedef long long ll;
int t[100005],ans=0;
int n,a[100005];
int read(){
    int f=1,ans=0;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        ans=ans*10+c-'0';
        c=getchar();
    }
    return f*ans;
}
void gb(int a[],int l,int r){
    if(l==r)
    return;
    int mid=(l+r)/2;
    gb(a,l,mid);
    gb(a,mid+1,r);
    int i=l,j=mid+1,p=l;
    while(i<=mid&&j<=r){
        if(a[i]>a[j]){
            t[p++]=a[j++];
            ans+=mid-i+1;        }
        else
        t[p++]=a[i++];
    }
    while(i<=mid)
    t[p++]=a[i++];
    while(j<=r)
    t[p++]=a[j++];
    for(i=l;i<=r;i++)
    a[i]=t[i];
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    gb(a,1,n);
    cout<<ans<<endl;
    return 0;
}
(5)手写快排
int a[101];
void hand_write_quick_sort(int l,int r)
{
    if(l>=r) return;
    else
    {
        int i=l;
        int j=r;
        int top=a[i];
        //a[i]即为我们选择的“点”,用于分割
       //(我们用的是这个点的值,而不是位置。)
        while(i<j)
        {
         while(top<=a[j] && (i<j)) j--;
         //a[j]比top大,则换下一个进行比较
         a[i]=a[j];//"点"的位置变为a[j]
         while(a[i]<=top && (i<j)) i++;
         //a[i]比top小,则换下一个进行比较
         a[j]=a[i];//"点"的位置变为a[i]
         }        //小的往前去,大的往后退。
        a[i]=top;
        hand_write_quick_sort(l,i-1);
        hand_write_quick_sort(i+1,r);
    }
}
//l~r中第k大的数(分治)
LL get(int l, int r, int k)
{
    if (l == r) return a[k];
    int u = l + rand() % (r-l+1);
    LL v = a[u];
    swap(a[l], a[u]);
    int i = l, j = r;
    while (i < j)
    {
        while (i < j && a[j] >= v) j--;
        if (i < j) { a[i] = a[j], i++; }
        while (i < j && a[i] < v) i++;
        if (i < j) { a[j] = a[i], j--; }
    }
    a[i] = v;
    while (i < (l+r)/2 && a[i] == a[i+1]) i++;
    if (k < i) return get(l, i-1, k);
    else if (k > i) return get(i+1, r, k);
    else return v;
}
基础算法学习以及$STL$的使用的更多相关文章
- 四旋翼基础算法学习2-IMU输入滤波算法
		前言: 处理器读取陀螺仪加速度计数据后首先需要对数据进行滤波处理,此文分析比较几种常用的滤波算法. 参考学习:四轴加速度计滤波 IMU: IMU使用MPU9250(即MPU6500),设置加速度量程± ... 
- 栈和队列的基础算法学习(EPI)
		今天学习的时间虽然挺多的,但是总觉效率不高.其实今天没有按照计划进行EPI题目的浏览,白天去看了其他的书籍.准备找工作可能需要的状态是一定量经典的书,偶尔温习才可.书是看不完的,知识点也是固定的.所以 ... 
- 基础算法学习2-dp
		一.算法题: 最大子阵 给定一个n×m 的矩阵 A,求A 中的一个非空子矩阵,使这个子矩阵中的元素和最大.其中,A 的子矩阵指在 A 中行和列均连续的一部分.输入格式输入的第一行包含两个整数 n,m( ... 
- C++基础算法学习——逆波兰表达式问题
		例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 ... 
- C++基础算法学习——N皇后问题
		n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 代码如下: #include <iostream> #include<cmath& ... 
- C++基础算法学习——汉洛塔问题
		汉诺塔问题古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中, ... 
- C++基础算法学习——熄灯问题
		有一个由按钮组成的矩阵, 其中每行有6个按钮, 共5行– 每个按钮的位置上有一盏灯– 当按下一个按钮后, 该按钮以及周围位置(上边, 下边,左边, 右边)的灯都会改变状态26熄灯问题 POJ1222– ... 
- C++基础算法学习——猜假币
		有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来).例题 ... 
- C++基础算法学习——完美立方
		形如a 3 = b 3 + c 3 + d 3 的等式被称为完美立方等式.例如12 3 = 6 3 + 8 3 + 10 3 .编写一个程序,对任给的正整数N(N≤100),寻找所有的四元组(a, b ... 
随机推荐
- .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件
			系列目录 [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ... 
- 使用Visual Studio 2022开发前端
			前端开发环境多数基于Node.js,好处不多说了.但与使用Visual Studio开发的后端Asp.Net Core项目一起调试,却不是很方便,所以试着在Visual Studio 2022中开发前 ... 
- XPath语法和lxml模块
			XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ... 
- CMake技术总结
			在做算法部署的过程中,我们一般都是用C++开发,主要原因是C++的高效性,而构建维护一个大型C++工程的过程中,如何管理不同子模块之间的依赖.外部依赖库.头文件和源文件如何隔离.编译的时候又该如何相互 ... 
- pyecharts世界地图用:国家中英文对照表.xlsx
			用pyecharts画Map或者Geo,需要用到的国家中英文对照表: 英文 中文 Zimbabwe 津巴布韦 Zambia 赞比亚 Yugoslavia 南斯拉夫 Yemen 也门 Western S ... 
- [漏洞复现] [Vulhub靶机] Struts2-045 Remote Code Execution Vulnerablity(CVE-2017-5638)
			免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 Apache Struts 2是美国Apache软件基金会的一个开源项目,是一套用于创建企业级Java W ... 
- vuex+Es6语法补充-Promise
			Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,采用 集中式存储管理 单页面的状态管理/多页面状态管理 使用步骤: // 1.导入 import Vuex from 'vuex' // ... 
- 深度学习与CV教程(2) | 图像分类与机器学习基础
			作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ... 
- SpringMVC请求流程源码分析
			一.SpringMVC使用 1.工程创建 创建maven工程. 添加java.resources目录. 引入Spring-webmvc 依赖. <dependency> <group ... 
- 关于mybatis的应用
			导入依赖 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifact ... 
