算法基础学习笔记——④前缀和\差分\双指针\位运算

news2025/1/18 18:49:35

博主:命运之光
专栏:算法基础学习

目录

✨前缀和

✨一维前缀和

🍓一维前缀和模板:

✨二维前缀和

🍓二位前缀和模板:


前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持!


前缀和

一维前缀和

原i:a[1] a[2] a[3] …a[n]

前缀和:s[i]=a[1]+a[2]+…+a[i] s[0]=0(方便处理边界问题)

注:下标一定从1开始

1.如何求s[i]:

for(i=1;i<=n;j++)s[i]=s[i-1]+a[i]

2.作用:(快)O(1)

快速求出原数组里一段数的和

🍓一维前缀和模板:

S[i] = a[1] + a[2] + ... a[i]

a[l] + ... + a[r] = S[r] -S[l -1]

二维前缀和

🍓二位前缀和模板:

S[i, j] = 第i行j列格子左上部分所有元素的和。

以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:

S[x2, y2] -S[x1 -1, y2] -S[x2, y1 -1] + S[x1 -1, y1 -1]

 ✨差分

差分实际是前缀和的逆运算

一维差分

🍓一维差分模板:

给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c

二维差分

🍓二维差分模板:

给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:

S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

 ✨双指针

双指针算法的核心思想:

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

        O(n^2)

将上面的朴素算法优化到O(n)

🍓双指针模板:

for (int i = 0, j = 0; i < n; i ++ )
{
    while (j < i && check(i, j)) j ++ ;
    // 具体问题的逻辑
}

常见问题分类:

(1) 对于一个序列,用两个指针维护一段区间

(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

🍓例题:统计日志

#include <iostream>
#include <algorithm>
using namespace std;
const int N=100000+5;
typedef struct Log{
int ts,id;
}Log; 
Log logs[N];
//(tk-D,tk]
int n,d,k; 
int cnt[N];//cnt[i]始终存储的是连续d分钟内id=i的帖子的点赞量 
bool rt[N]; 
bool cmp(Log qian,Log hou){
    if(qian.ts<hou.ts)
    	return true;
    return false;
}
int main(){
    scanf("%d%d%d",&n,&d,&k);
    int m=0;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&logs[i].ts,&logs[i].id);
        m=max(m,logs[i].id);
    }
    sort(logs+1,logs+n+1,cmp); 
    for(int i=1,j=1;i<=n;i++){//i和j始终维护长度小于d的区间 
        cnt[logs[i].id]++; 
        while(logs[i].ts-logs[j].ts>=d){
            cnt[logs[j].id]--;
            j++;
    	}
        if(cnt[logs[i].id]>=k){
        	rt[logs[i].id]=true;
        }
    }
    for(int i=0;i<=m;i++){
        if(rt[i]==true)
        	printf("%d\n",i);
    }
}

🍓例题:统计子矩阵

#include <iostream>
using namespace std;
const int N=510;
int n,m,k; 
int s[N][N];
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>s[i][j];
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
        }
    }
    long long ans=0;
    for(int l=1;l<=m;l++){
        for(int r=l;r<=m;r++){
            for(int d=1,u=1;d<=n;d++){
                while(u<=d&&(s[d][r]-s[d][l-1]-s[u-1][r]+s[u-1][l-1]>k))
                	u++;
                if(u<=d)
                	ans+=d-u+1;
            }
        }
    }
    cout<<ans<<endl;
}

位运算

操作一

n的二进制中第k位是几

1.先把第k位移到最后一位n>>k

2.看个位是几x&1

🍓十进制转化成二进制、八进制、十六进制(连除法)

🍓二进制、八进制、十六进制转化成十进制

🍓关于原码,反码,补码:

原码、反码补码是计算机中用来表示带符号整数的三种编码方式。

1. 原码(Sign-Magnitude):

原码是最简单的表示方法,将一个整数按照正负号和数值进行编码。具体规则如下:

  • 正数的原码是其二进制表示形式。
  • 负数的原码是将对应的正数的原码最高位改为1。

🍓例如,假设用8位二进制表示整数,数字+3的原码是00000011,数字-3的原码是10000011。

2. 反码(One's Complement):

反码是在原码的基础上,将负数的表示方式进行改进。具体规则如下:

  • 正数的反码与其原码相同。
  • 负数的反码是将对应的正数的原码按位取反,即将0变为1,将1变为0。

🍓例如,数字+3的反码是00000011,数字-3的反码是11111100。

3. 补码(Two's Complement):

补码是在反码的基础上进行改进,是计算机中最常用的表示方式。具体规则如下:

  • 正数的补码与其原码相同。
  • 负数的补码是将对应的正数的原码按位取反,然后再加1。

🍓例如,数字+3的补码是00000011,数字-3的补码是11111101。

补码的使用在计算机中具有以下好处:

  • 可以统一处理正数和负数的加减运算,无需单独处理符号位。
  • 补码只有一个表示零的编码,避免了正零和负零的问题。
  • 补码的表示范围比原码和反码更广,能够表示的最大正整数比较大。

🍓🍓需要注意的是,在使用补码表示的计算机系统中,最高位通常被用作符号位,即0表示正数,1表示负数。这种表示方式使得补码能够直接进行加减运算,并且可以方便地检测结果的正负。

 

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

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

相关文章

Python二级编程:分词去重

一、原题 参考编程模板&#xff0c;完善代码&#xff0c;实现以下功能。‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‫ 利用 jieba 库实现中文分词。对分词后的列表进行去重处理&#xff0c;然后将分词结果中字符数大于等于 3 的词语&…

大话手游原始服务端搭建教程Centos

大话手游原始服务端搭建教程Centos 大家好&#xff0c;我是艾西&#xff0c;今天给大家分享一款回合制的ARPG大话手游搭建教程。游戏场景、精美的画面以及多元的人物做的非常棒。在游戏中可以穿越神话世界&#xff0c;同时也可以结交好友&#xff0c;加入团队&#xff0c;共同…

按键的单击、双击、连续按、短按和长按实现思路

概念区分 看到好多教程说了这些概念&#xff0c;有的说单击就是短按&#xff0c;连续按就是长按等等。 其实&#xff0c;仔细想想&#xff0c;这几个概念是有一些区别的。 假如一个按键&#xff0c;没按下时是高电平&#xff0c;按下时是低电平&#xff0c;以此来理解这些概念。…

JVM—Class类文件结构详解

Class类文件的结构 要了解Class文件的结构首先得了解Class文件所采用的数据类型&#xff1a; Class文件格式采用一种类似C语言结构体的伪结构来存储数据&#xff0c;这种伪结构只有两种数据结构&#xff0c;即无符号数和表&#xff0c;解析Class文件全是以这两个数据结构为基础…

【数据结构】什么是堆,如何使用无序数组生成一个堆?

文章目录 一、堆的概念及其介绍二、如何使用无序序列构建一个堆&#xff1f;三、C语言实现堆的基本操作结构体创建与销毁获取堆顶数据与个数及堆的判空堆的插入与删除 源代码分享 一、堆的概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常是一…

LEETCODE 每日一题 1093.大样本统计

题目描述 前往leetcode1093题 我们对 0 到 255 之间的整数进行采样&#xff0c;并将结果存储在数组 count 中&#xff1a;count[k] 就是整数 k 在样本中出现的次数。 计算以下统计数据: minimum &#xff1a;样本中的最小元素。 maximum &#xff1a;样品中的最大元素。 mean &…

【Log】About these two years

文章目录 第一篇博客&#xff1f;成长收获的季节Future 第一篇博客&#xff1f; 第一次在CSDN发布博客&#xff0c;是当初我学习嵌入式的时候&#xff0c;那个时候我们做了一个大创&#xff0c;其中使用到了激光雷达&#xff0c;然后我就负责激光雷达部分代码的编写和设计&…

AI-新手玩转RKNN

关于RKNN RKNN 是Rockchip npu 平台使用的模型类型&#xff0c;以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换 Python 工具&#xff0c;方便用户将自主研发的算法模型转换成 RKNN 模型&#xff0c;同时 Rockchip 也提供了C/C和Python API 接口。 #mermaid-svg-M7l…

电子器件系列37:SD卡座(Push-Push和Push-Pull)

SD卡座是目前最通用的数据存储卡座、记忆卡座。在各种通讯数码产品、安防产品、带储存类产品等设备上都有所应用。有着性价比高、存储容量大、使用便捷、通用性以及安全性强等特点。自弹式SD卡座的卡槽底部会设有一个小直径、小线径的弹簧或一种切口式弹片。当装入SD卡时&#…

Kafka如何保证数据高可靠

这节课给大家分享一下Kafka的数据高可靠。为什么要讲这个&#xff1f;因为Kafka它本身不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition&#xff0c;这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本…

117.【微信小程序】

微信小程序 (一)、微信小程序概括1.微信小程序简介(1).小程序与普通网页开发的区别 2.注册微信小程序账号(1).注册小程序账号(2).获取小程序的AppID 3.安装微信开发者工具(1).微信开发者工具的简介:(2).微信开发者工具的下载 4.创建第一个小程序(1).创建小程序步骤(2).开发者工…

域横向移动-传递攻击atschtasks

横向移动就是拿下对方一台主机后&#xff0c;以拿下的那台主机作为跳板&#xff0c;对内网的其他主机再进行后渗透&#xff0c;拿到其他内网主机的权限的过程。叫做横向移动。横向移动的主要目的就是扩大战果。 传递攻击主要建立在明文和hash值获取基础上进行攻击。 at和scht…

Typora改变字体颜色

方法一&#xff1a;下载AutoHotkey并创建快捷键的方法&#xff08;推荐&#xff09; 第一步&#xff1a;在官网&#xff08;https://www.autohotkey.com/&#xff09;下载 AutoHotkey并傻瓜式安装&#xff0c;安装在任意盘符下均可&#xff1b; 第二步&#xff1a;在安装目录…

STM32F4_I2C(从机EEPROM/MPU-6050)协议详解

目录 1. I2C是什么 2. I2C物理层介绍 3. I2C协议层介绍 3.1 I2C基本读写过程 3.1.1 通讯复合格式 3.2 通讯的起始和停止信号 3.3 数据有效性 3.4 地址及数据方向 3.5 响应 4. STM32的I2C特性及架构 4.1 I2C架构剖析 5. I2C通讯过程 5.1 主发送器 5.2 主接收器 6…

Windows文件自动备份——“使用文件历史记录进行备份”

一、背景 因为有一些重要的文件需要经常改动&#xff0c;同时也有“找到某文件某历史版本”的需求&#xff0c;但考虑到时常手动备份比较麻烦&#xff0c;就想到了使用Windows自带的文件备份功能——“使用文件历史记录进行备份”来帮助进行文件的备份和版本管理。 二、环境 1…

一个测试开发人员在字节的7年,太真实了...

测试这条路是坎坷的&#xff0c;我自己深有体会。 我们的起点低&#xff0c;基础差。 测试这个职位也很尴尬&#xff0c;很少有公司会有针对性的对测试人员做成长规划&#xff0c;也很少有公司会那么重视测试人员&#xff0c; 也许进了像 BATJ 这样的大厂会好一点。 但是大多数…

nacos2.2.1搭建

springboot 3.0集成nacos2.2.1内容可评论区Q我 搭建环境&#xff1a; Java版本&#xff1a;11.0.18 系统&#xff1a;window7 数据库&#xff1a;mysql8.0.29 第一步&#xff0c;下载nacos&#xff0c;下载地址&#xff1a; https://github.com/alibaba/nacos/releases/d…

HACKABLE: III实战演练

文章目录 HACKABLE: III实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、查看网站源码4、扫描目录5、访问网址6、查看并下载7、访问网站8、查看文件9、解密10、访问网站11、访问网站12、查看文件13、解密14、访问网站15、访问网站16、下载图片17、隐写1…

CrossOver软件好用吗?最新版22.1.1有哪些优势功能

CrossOver2023是一款系统兼容软件 让您可以在Mac和Linux系统上运行Win应用&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过CrossOver&#xff0c; 您可以从dock直接启动Wind应用&#xff0c;与您的Mac和Linux系统功能无缝集成。crossover兼容软件是可以在苹果电脑中…

oracle的基本使用(建表,操作表等)

一、表空间&#xff0c;用户 1、创建表空间 使用system登录 创建表空间 waterboss 为表空间名称datafile 用于设置物理文件名称size 用于设置表空间的初始大小autoextend on 用于设置自动增长&#xff0c;如果存储量超过初始大小&#xff0c;则开始自动扩容next 用于设置每次…