基础算法学习以及$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 ...
随机推荐
- [题解] [LOJ2743]「JOI Open 2016」摩天大楼
题目大意 将 \(N\) 个互不相同的整数 \(A_1 , A_2 , ⋯ , A_N\) 任意排列成 \(B_1 , B_2 , ⋯ , B_N\) . 要求 \(∑^{N−1}_{i=1} |B_ ...
- 三月总结&四月计划
三月总结 1. 主要任务 <C++设计模式>网课 ① 进展: 看完,对设计模式的整体设计思路和几个重要的设计模式重点学习了一下,目前对设计模式的认识还比较浅 ② 总结: 做完总结 ③ 反思 ...
- 手动验证 TLS 证书
证书结构 我们现在使用的 TLS 证书的标准是 X.509,版本号为 V3.版本号可从证书的 Version 字段看到. 根据 RFC 3280 定义的证书结构,证书由三个部分组成: 证书主体(TBS ...
- 论文解读(SimGRACE)《SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation》
论文信息 论文标题:SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation论文作者: ...
- 使用argparse进行调参
argparse是深度学习项目调参时常用的python标准库,使用argparse后,我们在命令行输入的参数就可以以这种形式python filename.py --lr 1e-4 --batch_s ...
- Linux下删除Mysql
1.检查mysql服务并关闭相应的进程 [root@bp18425116f0cojd1vnz ~]# ps -ef |grep mysql root 1492 1 0 10:23 ? 00:00:00 ...
- CabloyJS v4.0.0支持工作流引擎及更多 🎉
截至2020年12月21日冬至,花了近5年时间作出最小可用NodeJS开源全栈框架,这就是CabloyJS V4.0.0 5年,90个模块,30万行代码,5400次提交(Commits),开启Node ...
- CabloyJS微信模块、企业微信模块已出齐
前言 当Cabloy-企业微信模块完成时,加上之前已完成的Cabloy-微信模块,关于在CabloyJS中与微信/企业微信对接的任务已经完成了.这些模块的目标就是,只需填入各类服务的参数,就可以直接进 ...
- PyTorch的Variable已经不需要用了!!!
转载自:https://blog.csdn.net/rambo_csdn_123/article/details/119056123 Pytorch的torch.autograd.Variable今天 ...
- Docker容器编译安装Nginx
Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...