前言

重学算法第1天,希望能坚持打卡不间断.
直到学完提高课。(暂定)
预计时长三个月内,明天再来!肝就完了

2月13日,day01 打卡

学完y总的算法基础课1.3-Week1 习题课

共7题,知识点如下

快排:第k个数
归并排序:逆序对的数量
二分:数的三次方根
前缀和(一维)
子矩阵的和(二维)
差分(一维)
差分矩阵(二维)

快速排序

AcWing 786. 第k个数

思路:

时间复杂度O(n)

#include <iostream>using namespace std;const int N = 100010;
// 局部变量和全部变量重名时,会优先使用局部变量,因此可以重名
int n, k;
int q[N];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;
}

归并排序

AcWing 788. 逆序对的数量

思路:

逆序对的最大数量会爆int

#include <iostream>using namespace std;typedef long long LL;//const int N = 10010;
const int N = 1e5 + 10;int n;
int q[N], tmp[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, i = l, j = mid + 1;while (i <= mid && j <= r) {if (q[i] <= q[j]) {tmp[k ++] = q[i ++];} else {tmp[k ++] = q[j ++];res += mid - i + 1;}}// 扫尾while (i <= mid) tmp[k ++] = q[i ++];while (j <= r) tmp[k ++] = q[j ++];// 物归原主for (int i = l, j = 0; i <= r; i ++, j ++) q[i] = tmp[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;
}

报了Segmentation Fault
只需要将const int N = 10010;(漏写了0,数组过小)
改为const int N = 1e5 + 10;

二分

AcWing 790. 数的三次方根

0-1有bug
例如:0到0.01不能在中间二分,开根号是0.1,

思路:

在左边就把右边界 r 更新为mid
在右边就把左边界 l 更新为mid

保留6位小数
写while时要比有效数后面的位置多2比较保险,即1e-8

#include <iostream>;using namespace std;int main () {double x;cin >> x;double l = -10000, r = 10000;while (r - l > 1e-8) {double mid = (l+r)/2;if (mid * mid * mid >= x) r = mid;else l = mid;}// 打印l或者r都能acprintf("%lf\n", l); // %lf默认6位return 0;
}

前缀和与差分

AcWing 795. 前缀和

一维的都很简单

思路:

下标有i-1的都从i=1开始
所以为了防止越界,数组都多定义了10个


#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;
}

AcWing 796. 子矩阵的和

首先要搞懂Sij的含义,左上点是(0,0),往右边和下边开始数,图中绿色就是S34

子矩阵的计算公式
s[x2][y2] = s[x2][y2] - s[x2][y1-1] -s[x1-1][y2] + s[x1-1][y1-1]
公式含义:总的 减去上面部分和左边部分,黑色区域减了2次,需要加回来

s[i,j]计算公式
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
公式含义:上侧加左侧,深蓝区域加了两次要减掉,最后加上a[i,j] (自己那个点)

#include <iostream>using namespace std;const int N = 1010;int n, m, q;
int a[N][N], s[N][N];int main() {scanf("%d%d%d", &n, &m, &q); // 读入规模较大,建议使用scanf来读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);// 多打了s[x2][y2] =// printf("%d\n", s[x2][y2] = s[x2][y2] - s[x2][y1-1] -s[x1-1][y2] + s[x1-1][y1-1]);printf("%d\n", s[x2][y2] - s[x2][y1-1] -s[x1-1][y2] + s[x1-1][y1-1]);}return 0;
}

AcWing 797. 差分

一维差分


将O(n)操作降到了O(1)

前缀和有两个核心操作
差分只有一个

#include <iostream>using namespace std;const int N = 100010;int n, m; // n:数组长度 m:操作个数
int a[N], b[N]; // a:原数组 b差分数组 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++) a[i] = a[i - 1] + b[i];for (int i = 1; i <= n; i++) printf("%d ", a[i]);return 0;
}

AcWing 798. 差分矩阵

二维差分
只考虑核心操作即可

式子含义:
将b[x1,y1]右下侧整个区域前缀和都加c
再把右侧和下侧的减去C
黑色区域减了2次,加回来
最后黄色区域就是前缀和差分完的区域

#include <iostream>using namespace std;const int N = 1010;int n, m, q; // n m:边长, q:操作个数
int a[N][N], b[N][N]; //a原数组 b差分数组,二维数组,不能写掉了void insert (int x1, int y1, int x2, int y2, int c) {b[x1][y1] += c;b[x1][y2+1] -= c;b[x2+1][y1] -= c;b[x2+1][y2+1] += c;
}int main() {// 输入输出较多,用scanf读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++) {insert(i, j, i, j, a[i][j]);}} while (q--) {int x1, y1, x2, y2, c;scanf("%d%d%d%d%d", &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++) {a[i][j] = a[i-1][j] + a[i][j-1] - a[i-1][j-1] + b[i][j];}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {printf("%d ", a[i][j]);}//puts(""); 与下面换行等同cout << endl;} return 0;
}

核心公式: a[i][j] = a[i-1][j] + a[i][j-1] - a[i-1][j-1] + b[i][j];

跟前缀和公式一样的
其实for循环有好多步可以合在一起写
但刚学的时候,分开写看的更清楚一些,以后熟练了再合起来

基础算法__习题——排序、二分、前缀与差分相关推荐

  1. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  2. C++ 算法基础课 01 —— 基础算法_快速排序/归并排序/二分查找/高精度

    文章目录 1 排序 1.1 快速排序(难在划分) 1.1.1 模板 1.1.2 习题1 -- 785.快速排序 1.1.3 习题2 -- 786.第k个数(快速选择算法) 1.2 归并排序(难在合并) ...

  3. 【基础算法】二分法(二分答案,二分查找),三分法,Dinkelbach算法,算法详解+例题剖析

    目录 一 . 二分法 二分搜索得要求: 二分查找步骤: 二分答案: 玄学的二分(二分答案) 二 . 三分法 例题 三.01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法) 一 . 二 ...

  4. 【数据结构与算法】task3 排序二分查找

    排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...

  5. 基础算法-模板习题一

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

  6. 【重温基础算法】内部排序之快速排序法

    内部排序之快速排序法 文章目录 内部排序之快速排序法 主要思想 过程演示 JAVA代码 算法分析 时间复杂度分析 最好时间复杂度 最坏时间复杂度 平均时间复杂度 空间复杂度 对冒泡排序的一种优化 主要 ...

  7. arraylist从大到小排序_java基础算法之二叉树排序(递归)

    一.二叉树介绍 在计算机科学中,二叉树是每个结点最多有两个子树的树结构.二叉树由各种节点组成,如下图所示: 每个节点都可以有左子节点,右子节点 每一个节点都有一个值 二叉树遍历: 二叉树的遍历分左序, ...

  8. yxc_第一章 基础算法(二)_前缀和与差分

    目录 一.一维前缀和 1.零散知识点 2.AcWing 795 二.二维前缀和 1.AcWing 796 三.一维差分 1.AcWing 797 四.二维差分 1.puts函数 2.AcWing 79 ...

  9. AcWing 算法基础课第一节基础算法1排序、二分

    1.该系列为ACWing中算法基础课,已购买正版,课程作者为yxc 2.y总培训真的是业界良心,大家有时间可以报一下 3.为啥写在这儿,问就是oneNote的内存不够了QAQ ACwing C++ 算 ...

最新文章

  1. 第三周项目四-穷举法解决组合问题(1)
  2. python自动点赞_用Python模拟技巧带你实现自动抽屉登录自动点赞
  3. 如何实现运行时刻的多态?(c++)
  4. ConcurrentHashMap的源码分析-transfer
  5. Electron开发入门
  6. ES6模块的import和export用法总结
  7. 为什么自己编写的页面总是在那里抖动_SEO排名,为什么旧页面比新内容排名高?...
  8. qt撤销与回退_Git撤销某次分支的合并Merge
  9. mysql做一个邮箱_php+mysql 做一个注册页面 注册成功后给用户邮箱发一份确认邮件,发送邮件的代码怎么加到下面的代码里了...
  10. UE4官方文档踩坑:FPS示例2.7 UCameraComponent
  11. 蓝桥杯13-20届真题答案解析(Java 大学 B 组)2013年省赛真题5_有理数类
  12. AUTOCAD参数约束功能
  13. OpenPose安装(gtx1650+cuda10.1+cudnn7.6.0+anaconda3)
  14. mysql批量插入跟更新_mysql批量插入以及批量更新
  15. MP3音频文件转换成caf格式
  16. 无人机倾斜摄影三维建模技术在智慧城市中的应用
  17. 【老九学堂】【初识C语言】编码规范
  18. 大鱼吃小鱼c语言编程,scratch大鱼吃小鱼设计思路
  19. 手工修改BIOS,让板载显卡与独立显卡共存
  20. HDOJ3018欧拉路,几笔画判断

热门文章

  1. 华宝小t股票机器人_华宝小T股票机器人
  2. Shell正则表达式(grep)
  3. 听说这份试卷只有程序员能打满分...
  4. 电脑调分辨率黑屏了怎么办_Win7系统屏幕分辨率调高了就出现黑屏如何解决
  5. C# Qrcode生成二维码支持中文,带图片,带文字
  6. 水果超市c语言程序设计,C语言程序设计课程设计报告-超市水果信息管理系统_精品.doc...
  7. [劳动光荣,拒绝偷菜]魔法少女武斗祭 1.62 汉化更名版
  8. 基于逐步法思想的多元线性回归(雏形)
  9. 高压功率放大器原理和应用场合介绍
  10. 基于企业微信的客户运营:9问9答,轻松get客户运营神器