文章目录

  • 快速排序模版
  • 快速排序习题——求数组中第 k 小 的数
  • 归并排序模板
  • 归并排序习题——求逆序对的个数问题
  • 二分习题——求数的三次方根
  • 一维前缀和习题——求前缀和
  • 二维前缀和习题——求子矩阵的和
  • 一维差分习题——求差分
  • 二维差分习题——求差分矩阵

快速排序模版

//快速排序
void quick_sort(int q[], int l, int r) {if (l >= r) return;int x = q[l];//随机确定一个分界点int i = l - 1;//初始化位置int j = r + 1;//初始化位置while (i < j) {while (q[++i] < x);//i指向的元素小于x,则右移,一直移动到指向的元素大于等于xwhile (q[--j] > x);//j指向的元素大于x,则左移,一直移动到指向的元素小于等于xif (i < j) swap(q[i], q[j]);//在满足以上情况时,交换元素值}//结束循环的条件时i=j,相遇位置quick_sort(q, l, j);//递归处理左段quick_sort(q, j + 1, r);//递归处理右段
}

快速排序习题——求数组中第 k 小 的数


解题思路:

#include<iostream>
using namespace std;const int N = 100010;int n, k;
int q[N];//求第k个数
int quick_sort(int l, int r, int k) {if (l == r) return q[l];int x = q[l], i = l - 1, j = r + 1;while (i < j) {while (q[++i] < x);while (q[--j] > x);if (i < j) swap(q[i], q[j]);}int sl = j - l + 1;if (k <= sl) return quick_sort(l, j, k);return quick_sort(j + 1, r, k - sl);}int main() {cin >> n >> k;for (int i = 0; i < n; i++) cin >> q[i];cout << quick_sort(0, n - 1, k) << endl;return 0;
}

归并排序模板

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;int i = l;int j = mid + 1;while (i <= mid && j <= r) {if (q[i] <= q[j]) temp[k++] = q[i++];else {temp[k++] = q[j++];}}//结束while循环的状态是两个序列有一个已经空了while (i <= mid)  temp[k++] = q[i++] ;while (j <= r) temp[k++] = q[j++];//将temp数组中存的结果重新还给q数组for (int i = l, j = 0; i <= r; i++, j++) q[i] = temp[j];
}

归并排序习题——求逆序对的个数问题


#include<iostream>
using namespace std;typedef long long LL;
const int N = 100010;int n;
int q[N], temp[N];LL merge_sort(int l, int r) {if (l >= r) return 0;int mid = l + r >> 1;LL res = merge_sort(l,mid) + merge_sort(mid + 1, r);//归并的过程int k = 0;int i = l;int j = mid + 1;while (i <= mid && j <= r) {if (q[i] <= q[j]) temp[k++] = q[i++];else{temp[k++] = q[j++];res += mid - i + 1;}}//扫尾while (i <= mid)temp[k++] = q[i++];while (j <= r)temp[k++] = q[j++];//物归原主for (int i = l, j = 0; i <= r; i++, j++)q[i] = temp[j];return res;
}int main() {cin >> n;for (int i = 0; i < n; i++) cin >> q[i];cout<< merge_sort( 0, n - 1)<<endl;return 0;
}

二分习题——求数的三次方根


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

一维前缀和习题——求前缀和


#include<iostream>
using namespace std;const int N = 100010;int n,m;
int a[N], s[N];int main() {cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];//求前缀和数组for (int i = 1; i <= n; i++)  s[i] = s[i - 1] + a[i];while (m--) {int l, r;cin >> l >> r;cout << s[r] - s[l - 1] << endl;}return 0;
}

二维前缀和习题——求子矩阵的和


前缀和:两个核心操作

#include<iostream>const int N = 1010;int m, n, q;
int a[N][N], s[N][N];int main() {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++)s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];//求前缀和//询问while (q--) {int x1, y1, x2, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);//算子矩阵的和}return 0;
}
//输入
//3 4 3
//1 7 2 4
//3 6 2 8
//2 1 2 3
// 输出
//1 1 2 2
//17
//2 1 3 4
//27
//1 3 3 4
//21

一维差分习题——求差分


1、a[1~L-1] 无影响
2、a[L~R] 加上了C
3、a[R+1~N] 无影响

#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;const int N = 100010;int m, n;
int a[N], b[N];void insert(int l, int r, int c) {b[l] += c;b[r + 1] -= c;
}
int main() {cin>>n>>m;for (int i = 1; i <= n; i++) cin >> a[i];//从前往后,插入构造for (int i = 1; i <= n; i++) insert(i, i, a[i]);while (m--){int l, r, c;cin >> 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;
}//输入
//6 3
//1 2 2 1 2 1
//1 3 1
//3 5 1
//1 6 1
//输出
//3 4 5 3 4 2

二维差分习题——求差分矩阵

以下图中,S代表差分数组B




#include<iostream>
using namespace std;const int N = 1010;
int n2, m2, q1;
int a[N][N];//原矩阵
int 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() {scanf("%d%d%d", &n2, &m2, &q1);for (int i = 1; i <= n2; i++)for (int j = 1; j <= m2; j++)scanf("%d", &a[i][j]);for (int i = 1; i <= n2; i++)for (int j = 1; j <= m2; j++)insert(i, j, i, j, a[i][j]);while (q1--){int x1, x2, y1, y2, c;cin >> x1 >> y1 >> x2 >> y2 >> c;insert(x1, y1, x2, y2, c);}for (int i = 1; i <= n2; i++)for (int j = 1; j <= m2; j++)b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];for (int i = 1; i <= n2; i++) {for (int j = 1; j <= m2; j++) printf("%d ", b[i][j]);puts("");}return 0;
}
//输入
//3 4 3
//1 2 2 1
//3 2 2 1
//1 1 1 1
//1 1 2 2 1
//1 3 2 3 2
//3 1 3 4 1
//
//输出
//2 3 4 1
//4 3 4 1
//2 2 2 2

基础算法-模板习题一相关推荐

  1. 基础算法模板——高精度运算

    基础算法模板--高精度运算 1. 高精度加法 vector<int> add(vector<int> &A, vector<int> &B) {if ...

  2. 数据结构和算法笔记(2)基础算法模板

    有很多的基础算法经常会用到,但是又容易写错.而网上查到的实现又五花八门.良莠不齐,故在此整理记录. 本文的目录如下: 1.二分查找    2.并查集    3.最大公约数    4.Trie树(前缀树 ...

  3. 基础算法__习题——排序、二分、前缀与差分

    前言 重学算法第1天,希望能坚持打卡不间断. 直到学完提高课.(暂定) 预计时长三个月内,明天再来!肝就完了 2月13日,day01 打卡 学完y总的算法基础课1.3-Week1 习题课 共7题,知识 ...

  4. 基础算法学习大纲(附加yxc大佬算法模板)

    基础算法学习大纲总结 学习算法路线 1.基础算法 模板 1.排序 2.二分 3.高精度 4.前缀和与差分 5.双指针算法 6.位运算 7.离散化 8.区间合并 2.数据结构 模板 1.链表与邻接链表( ...

  5. 二叉树的基础算法综述

    二叉树是一种递归定义的数据结构,自然而然地其算法大多也都采用递归的形式.二叉树的基础算法包括且不限于: (1)二叉树的建立 (2)二叉树的三种遍历 (3)二叉树各类结点数计算(度为2,1,0的个数) ...

  6. 网络流入门——算法模板,习题和解析

    最近一段时间再搞网络流,今天终于搞完了!!!!QAQ,好累呀. 首先是关于网络流的基础知识,这部分东西有点多,就不在这里说了,给几个有用的资源. 先推荐一下建图的博客:链式向前星,静态链表和邻接矩阵建 ...

  7. 【算法模板】动态规划(基础DP篇)

    [算法模板]动态规划(基础DP篇)

  8. 一、基础算法9:区间合并 模板题+算法模板(区间合并)

    文章目录 算法模板 离散化题目模板 模板题 区间和 原题链接 题目 题解 思路 算法模板 离散化题目模板 // 将所有存在交集的区间合并 void merge(vector<PII> &a ...

  9. Acwing 第一章模板及详解(基础算法)

    一.排序 二.二分 三.高精度 四.前缀和与差分 五.位运算 六.双指针算法 七.离散化 八.区间合并 一.排序 (一)快速排序算法: 由冒泡排序改进,在冒泡排序过程中,只对相邻的两个记录进行比较,每 ...

最新文章

  1. CentOS详解top命令各个数据的含义
  2. qt连接mysql数据库原理_Qt连接数据库的两种方法
  3. python使用scrapy_Python实现从脚本里运行scrapy的方法
  4. 2.13.JavaScript--条件语句
  5. vue后台管理系统流程(面试必选)
  6. erlang中的ets和dets
  7. ethereum扫描区块,获取区块内的交易记录
  8. Leetcode——226. 翻转二叉树
  9. Ubuntu下开机自启动脚本 init supervisor systemd
  10. 测试员入职新公司如何快速熟悉新业务?
  11. 关于使用媒体查询@meda失效原因的总结或注意事项
  12. 关于产品的一些思考——阿里巴巴之阿里旺旺
  13. 为什么window上没有php-fpm?
  14. 【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT
  15. 物料编码的方法与技术
  16. 物联网卡设置_物联卡中心:物联网卡这样设置一下上网全程4G,建议收藏!
  17. Pandas操作dataframe对所有列/行求和 ,对指定列/行求和,对某一列/行求和,并添加新的列/行
  18. Quorum联盟链开发入门
  19. 60检索式问答系统的语义匹配模型(神经网络篇)
  20. 面试题的基本总结回顾(以以往面试过的问题做基本总结)

热门文章

  1. 剪切波变换matlab,剪切波变换MATLAB实现代码
  2. 第四篇 快速、轻量、可扩展、易于使用的EmEditor
  3. Javaweb学习笔记(JSP标准标签库)
  4. 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)
  5. U3d学习-使用Unity3D开发2D游戏(上)
  6. CoolCool的序列
  7. android 点击屏幕关闭软键盘
  8. StrictMode ——安卓严苛模式
  9. 50年游戏历史,按收入来源划分(1970-2020)
  10. [文摘20180514]父母这些无心的话,会扼杀孩子的乐观性格