分块算法 解决区间问题

区间问题总结 文章目录区间问题1. 算法分析2. 典型例题2.1 选择尽量少的点,使得每个区间内至少包含一个选出的点。2.2 选择若干区间,使得选中的区间之间互不相交(包括端点)。2.3 将区间分成若干组,使得每组内部的区间两两之间没有交集2.4 区间覆盖2.5 合并所有有交集的区间,计算合并完成后的区间个数2.6 计算每个区间与几个区间严格相交 区间问题 1. 算法分析 区间问题很多时候都需要思考是用区间的左端点还是右端点排序,选择合适的排序方法来使用 2. 典型例题 2.1 选择尽量少的点,使得每个区间内至少包含一个 阅读详情

块的操作主要有:

block是块的大小

t是块的数量

st是每个块的开始的下标

ed是每个块的结束的下标

pos是每个元素对应块的下标

sum是对应块的元素的和

add是增量标记 用于区间修改+区间查询

 核心代码如下:

const int MAX=10010;

int n;
int a[MAX];
int st[MAX],ed[MAX];
int pos[MAX];
int sum[MAX];
int add[MAX];
//区间修改
void change(int l,int r,int d){
    int p=pos[l];
    int q=pos[r];
    if(p==q){ //情况1 区间位于一个块里面
        for(int i=l;i<=r;i++){
            a[i]+=d;
        }
        sum[p]+=d*(r-l+1);
    }
    else { //区间跨多个块
        for(int i=p+1;i<=q-1;i++){
            add[i]+=d; //完整的块里面的数据直接加上d
        }
        for(int i=l;i<=ed[p];i++){ //整块前面的散块
            a[i]+=d;
        }
        sum[p]+=d*(ed[p]-l+1);
        for(int i=st[q];i<=r;i++){ //整块后面的散块
            a[i]+=d;
        }
        sum[q]+=d*(r-st[q]+1);
    }
}

ll query(int l,int r){
    int p=pos[l];
    int q=pos[r];
    ll ans=0;
    if(p==q){ //整块
        for(int i=l;i<=r;i++){
            ans+=a[i];
        }
        ans+=add[p]*(r-l+1);
    }
    else { //有散块
        for(int i=p+1;i<=q-1;i++){
            ans+=sum[i]+add[i]*(ed[i]-st[i]+1); //先处理整块
        }
        for(int i=l;i<=ed[p];i++){ //整合散块
            ans+=a[i];
        }
        ans+=add[p]*(ed[p]-l+1);
        for(int i=st[q];i<=r;i++){
            ans+=a[i];
        }
        ans+=add[q]*(r-st[q]+1);
    }
    return ans;
}

int main(){
    
    
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    //start
    int block=sqrt(n);
    int t=n/block;
    if(n%block) t++;
    for(int i=1;i<=t;i++){
        st[i]=(i-1)*block+1;
        ed[i]=i*block;
    }
    ed[t]=n;
    for(int i=1;i<=n;i++){
        pos[i]=(i-1)/block+1; //pos是第i个元素所在的块
    }
    
    
    for(int i=1;i<=t;i++){
        for(int j=st[i];j<=ed[i];j++){
            sum[i]+=a[j];  //sum是第i块的区间和
        }
    }
    //end
    
    int opt,l,r,c;
    for(int i=1;i<=n;i++){
        cin>>opt>>l>>r>>c;
        if(opt==1){
            cout<<query(r,r)<<endl;
        }
        else {
            change(l,r,c);
        }
    }
}

区间第K值带修改 分块 区间第K值带修改 Q:给定一个序列 1、查询一个L到R的区间内的第K大(小)值。2、修改一个值。 这道神题困扰了我很久,直到学了各种各样的算法才会会这道题。 先比较一下流行的算法的效率吧 对于一个长度为N的序列 暴力:对于一段查询区间每次进行快排。 时间复杂度: 单次查询:O(NlogN) 修改:O(1) 空间复杂度:O(N) 线段树套平衡树: 单次查询:O(log^3 N) 阅读详情

相关推荐

分块算法详解

分块算法详解

justin666888的博客 1481

分块算法-区间修改+区间最值

给定一个长度为n数列,现对这个序列有两种操作: U L R X:将区间 [L, R] 每个数加X; Q L R:查询从第L个数到第R个数得最大值和最小值。 所有的数都 <=1000 输入格式: 第一行给定一个整数n, m,表示有n个数。m个操作 以下接着一行,n个数。 再接下来m行每行一个操作。 输出格式: 对于每个查询输出一行最大值和最小值。 in: 5 3 1 2 3 4 5 U 1...

H_ang的博客 1431

[总集] LOJ 分块1 – 9

分块9题 出题人hzw的解析 (tips.以下代码中IO优化都已省去,想看可以点传送门) 数列分块入门 1 修改:区间加 查询:单点值查询 这是一道经典题目,线段树、树状数组等都可以搞,这里讲讲分块 分块就是将一定长度的一段数打包成块,统一处理的算法 每个块都有自己的信息,自己的标记,统一维护,统一查询 我们可以将每个区间修改或查询拆分成在若干个整块,和头尾两个不完整的块中修改、查询后信息...

think_twcie的博客 1005

区间更新,区间查询【分块】分块2

题目描述 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数。 输入格式 第一行输入一个数字 。 第二行输入 个数字,第 个数字为 ,以空格隔开。 接下来输入 行询问,每行输入四个数字 、、、,以空格隔开。 若 ,表示将位于 的之间的数字都加 。 若 ,表示询问 中,小于 的数字的个数。 输出格式 对于每次询问,输出一行一个数字表示答案。 样例...

谁是凶手1703 271

BZOJ 2724 浅谈分块算法求区间众数

世界真的很大 分块算法大概算是一种在线的数据结构,和线段树作用差不多,但是却能维护一些线段树维护不了的信息。 线段树要求维护的信息必须要具备可合并性,就是说子区间的信息能够合并到大区间里,比如区间和,区间值域等 但是分块却不需要这样的条件 有点暴力的味道但是确确实实是一种有效的数据结构 看题先: description: input 修正一下l = (l_0 + x - 1) m

BerryKanry的博客 4738

分块算法介绍

算法和数据结构

实践求真知 1629

区间dp小结

序:这次的专题刷得很蛋疼有趣 各种大神代码和题解 区间dp,异于普通的线性dp,它的转移往往是建立于不同的规则上且诡异复杂的 区间dp的解题要点是找到一种转移使得我们能够得到最优解HDU4283 因为要保持栈的合法,所以不能排序乱排瞎搞 取一段区间,可以保证区间的做端点能在该区间的任意点后出去 那么利用这一点,就可以来更新区间for(int i=1;i<=n;i++){ sca

风雨兼程 515

MPU6050 vs BMX055 vs ICM20602:如何为你的项目选择最佳陀螺仪(附实测数据对比)

本文深度对比了MPU6050、BMX055和ICM20602三款主流六轴IMU传感器的核心性能。通过实测数据,分析了它们在精度、噪声、温漂、接口速度及资源占用上的差异,并提供了从项目需求出发的选型指南,帮助开发者根据预算、精度要求和处理器性能选择最合适的陀螺仪与加速度计组合。

h0i1j2k3l的博客 969

【基础莫队算法C++】解决多个区间和问题(使用分块结构)

***莫队算法 = 离线 + 暴力解法 + 分块算法***

qq_73928885的博客 337

Android开发必备:TBS腾讯浏览服务静态集成完整指南(附Demo下载)

本文详细解析了Android开发中TBS腾讯浏览服务的静态集成方案,通过对比动态集成,深入剖析了其核心原理与适用场景。文章提供了从环境准备、资源获取、项目配置到代码初始化的完整指南,并重点介绍了WebView与文件预览等高级特性的实战应用。针对集成过程中的常见问题,提供了详尽的排查清单与性能调优建议,旨在帮助开发者构建极致稳定、不依赖网络的WebView与文件预览功能。文末附有经过验证的Demo项目可供下载参考。

earth的博客 366

手把手教你用GPIO模拟MDIO时序,搞定Linux下那些‘不听话’的PHY芯片

本文详细介绍了如何利用Linux内核的`virtual,mdio-gpio`驱动,通过GPIO模拟MDIO时序来解决特殊PHY芯片的驱动调试问题。从硬件准备、设备树配置到驱动实现,提供了完整的解决方案和实战案例,帮助开发者应对非标准时序的PHY芯片挑战。

weixin_29188043的博客 269

分块算法思想及应用

所谓分块算法,就是将一个完整的区间,分成几块不同的区间,然后对这些区间进行处理。

Psychosocial的博客 1331

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 369

分块入门 LibreOJ分块九题

推荐hzwer大佬的博客:http://hzwer.com/8053.html 初步学习体验就是,分块作为一种复杂度看上去并不优秀实际效率却很优秀的数据结构,在解决某些用其他如线段树等log数据结构非常麻烦的问题时非常好写好用,以后搭配莫队简直是解决大部分区间问题的强力算法 分块本身其实还是挺简单的,这套题总结了一些分块/数据结构的经典问题,很全面,能由浅入深地学习分块的基本使用,分块的特点。...

weixin_30765505的博客 100

钉钉宜搭低代码开发师高级认证考试题库113题

钉钉宜搭低代码开发师(高级)考试试题题库,多次考试收集整理,判断题,单选题,多选题,排版清晰,查找方便。希望能帮助到大家!!!

qq_40811920的博客 6396

0.嵌入式控制器EC实战 Embedded Controller开发概述

文章目录前言1.嵌入式控制器EC概述2.EC芯片框图(IT8502为例)3.General Purpose I/O Port (GPIO)4.SMBus(System Management Bus,系统管理总线)5.PWM、TACH6.KBC(KeyBoard Controller)7.PS/28.ADC(模数转换)总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 1.嵌入式控制器EC概述 嵌入式控制器EC是挂在CPU的L

qq_30135687的博客 1万+

POJ 3264:区间最值差 ← 分块

【问题描述】 题目来源:http://poj.org/problem?id=3264 在每天挤奶的时候,农民约翰的N头牛(1≤n≤50000)总是排成一列。有一天,约翰决定与他的牛们一起玩一个极限飞盘游戏。为了简单起见,他将从奶牛队列里面选一定范围内的奶牛来玩这个游戏。然而所有的牛对这个游戏都很感兴趣。农民约翰列出了Q份名单(1≤Q≤200000)和每个奶牛的高度(1≤高度≤1000000)。对于每一份名单,他想你帮助他确定在每份名单中高度最高的奶牛与高度最低的奶牛的高度差是多少。【输入格式】 第一行为N

hnjzsyjyj的专栏 243

【2026年得物春招算法岗- 4月18日 -第二题- 老张爬山】(题目+思路+Java&C++&Python解析+在线测试)

这篇文章介绍了一个动态规划问题,解决老张在n天内安排爬山计划以最大化愉悦值的问题。题目允许最多k次打破"不能连续两天爬山"的规则限制。 摘要要点: 使用三维动态规划数组dp[i][j][s],表示第i天结束时已用j次机会、当天状态为s(0不爬/1爬)时的最大愉悦值 状态转移考虑两种情况:当天不爬山时取前一天两种状态的最大值;当天爬山时分别处理前一天不爬山和爬山(需消耗机会)的情况 最终结果为考虑所有可能用掉的k次机会后,最后一天两种状态的最大值 提供了Python、Java和C++三种实

m0_73659489的博客 1357

【bzoj3585/bzoj3339】mex/Rmq Problem 莫队算法+分块

原文地址:http://www.cnblogs.com/GXZlegend/p/6805283.html 题目描述 有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 输入 第一行n,m。第二行为n个数。从第三行开始,每行一个询问l,r。 输出 一行一个数,表示每个询问的答案。 样例输入 5 5 2 1 0 2 1...

weixin_30325793的博客 162

Allan方差这个工具,怎么把它用的更顺手?(附Allan方差、动态Allan方差代码)

本文详细说明了Allan方差和动态Allan方差的计算过程,并通过递归运算和时间序列选择两种算法提高动态Allan方差的计算效率。文末提供了快速动态Allan方差计算代码。

victoryqian528的博客 372

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Codeforces 474F Ant Colony(分块)

发现全网竟没有一篇分块题解。。。

Hacheylight 312

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

分块——最为优雅的暴力

在信息学竞赛中,常常会遇到一些区间修改或区间查询的题目,如果直接敲暴力的话,时间复杂度是Onm可能会超时,如果写树状数组或线段树的话,又有一点复杂,不易理解,那么这时候就要请出我们今天的主角——

CylMK的博客 2028

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

分块

Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。 学生ID编号分别从1编到N。 第二行包含N个整数,代

Modestr的博客 371

数据结构——分块算法

可能涉及的名词解释 ①区间:数列中连续的一段元素 ②区间操作:将某个区间[a,b]的所有元素进行某种改动的操作 ③块:我们将数列划分成若干个不想交的区间,每个区间成为一个块 ④整块:一个区间操作时,完整包含于区间的块 ⑤:不完整的块 什么是分块? 分块其实就是将一个连续的序列分成若干段长度相等的片段,这些片段我们称之为块.。 一般用于解决区间修改与询问,它可以解决以下一些问题: 1.给出一个长为n...

weixin_43115940的博客 805

【算法·分块】分块入门①-⑥

关于分块 关于分块,其主要思想是大局维护,局部朴素;即吧一个序列分成若干个小块,对任意区间进行操作的时候:如果区间内包含完整块,就进行快速的整体修改;若所修改区间内的一部分是某个个块中的一部分,则直接进行暴力修改就行。 具体内容,我们可以通过六道分块习题进行理解。 分块入门1 ...

Ronaldo7_ZYB的博客 380
上一篇: 字符统计(模拟)
下一篇: 分块数组 入门例题
郭晋龙
博客等级 码龄6年 940粉丝 449原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值