数列分块<1>

本期是数列分块入门<1>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。

Blog:http://hzwer.com/8053.html                       sto   hzwer   orz          %%%            [转载]

------------------------------------------------------------------------------------------------------------------------

LOJ-P6277:

我们每m个元素个元素分为一块,共有\frac{n}{m}块,以及区间两侧的两个不完整的块。这两个不完整的块中至多2m个元素。我们给每个块设置一个tag(就是记录这个块中元素一起加了多少),每次操作对每个整块直接\Theta (1)标记,而不完整的块元素较少,暴力修改元素的值。

这样,每次询问时返回元素的值加上其所在块的加法标记即可。

时间复杂度\Theta (\frac{n}{m})+\Theta (m)。根据均值不等式,当m\sqrt{n}时总复杂度最低。

#include <bits/stdc++.h>
using namespace std;
const int maxn=50005;
int a[maxn],idx[maxn],tag[maxn],tot;
void change(int l,int r,int c){for(int i=l;i<=min(idx[l]*tot,r);i++)a[i]+=c;if(idx[l]!=idx[r]){for(int i=(idx[r]-1)*tot+1;i<=r;i++)a[i]+=c;}for(int i=idx[l]+1;i<=idx[r]-1;i++)tag[i]+=c;
}
int main(){int n;cin>>n;tot=sqrt(n);for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)idx[i]=(i-1)/tot+1;for(int i=1;i<=n;i++){int opt,l,r,c;cin>>opt>>l>>r>>c;if(opt==0)change(l,r,c);if(opt==1)cout<<a[r]+tag[idx[r]]<<endl;}return O;
}

LOJ-P6278:

我们先来思考只有询问操作的情况,不完整的块枚举统计即可;而要在每个整块内寻找小于一个值的元素数,于是我们不得不要求块内元素是有序的,这样就能使用二分法对块内查询,需要预处理时每块做一遍排序,复杂度\Theta (n\: log\: n),每次查询在\sqrt{n}个块内二分,以及暴力2 \sqrt{n}个元素,总复杂度\Theta (n\: log\: n+n\sqrt{n}\:\: log\: \sqrt{n})

那么区间加怎么办呢?套用第一题的方法,维护一个加法标记,略有区别的地方在于,不完整的块修改后可能会使得该块内数字乱序,所以头尾两个不完整块需要重新排序。在加法标记下的询问操作,块外还是暴力,查询小于(x-tag)的元素个数,块内用(x-tag)作为二分的值即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn=50005;
int a[maxn],idx[maxn],tag[maxn],tot,n;
vector<int> block[505];
void reset(int x){block[x].clear();for(int i=(x-1)*tot+1;i<=min(x*tot,n);i++)block[x].push_back(a[i]);sort(block[x].begin(),block[x].end());
}
void change(int l,int r,int c){for(int i=l;i<=min(idx[l]*tot,r);i++)a[i]+=c;reset(idx[l]);if(idx[l]!=idx[r]){for(int i=(idx[r]-1)*tot+1;i<=r;i++)a[i]+=c;reset(idx[r]);}for(int i=idx[l]+1;i<=idx[r]-1;i++)tag[i]+=c;
}
int query(int l,int r,int c){int ans=0;for(int i=l;i<=min(idx[l]*tot,r);i++){if(a[i]+tag[idx[l]]<c)ans++;}if(idx[l]!=idx[r]){for(int i=(idx[r]-1)*tot+1;i<=r;i++){if(a[i]+tag[idx[r]]<c)ans++;}}for(int i=idx[l]+1;i<=idx[r]-1;i++)ans+=lower_bound(block[i].begin(),block[i].end(),c-tag[i])-block[i].begin();return ans;
}
int main(){cin>>n;tot=sqrt(n);for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){idx[i]=(i-1)/tot+1;block[idx[i]].push_back(a[i]);}for(int i=1;i<=idx[n];i++)sort(block[i].begin(),block[i].end());for(int i=1;i<=n;i++){int opt,l,r,c;cin>>opt>>l>>r>>c;if(opt==0)change(l,r,c);if(opt==1)cout<<query(l,r,c*c)<<endl;}return O;
}

友情提醒:不要Ctrl C+Ctrl V

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

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

相关文章

软件建模概要

什么是软件建模&#xff1f;软件建模体现了软件设计的思想&#xff0c;在需求和实现之间架起了一座桥梁&#xff0c;通过模型指导软件系统的具体实现。模型不是软件的完备表示&#xff0c;而是所研究系统的一种抽象。 软件建模原则&#xff1a; 选择正确的模型&#xff0c;模…

JAVA设计模式>>结构型>>适配器模式

本文介绍23种设计模式中结构型模式的适配器模式 目录 1. 适配器模式 1.1 基本介绍 1.2 工作原理 1.3 适配器模式的注意事项和细节 1.4 类适配器模式 1.4.1 类适配器模式介绍 1.4.2 应用实例 1.4.3 注意事项和细节 1.5 对象适配器模式 1.5.1 基本介绍 1.5.2 …

VUE+ELEMENTUI表格的表尾合计

<el-table :data"XXXX" :summary-method"getSummaries" show-summary "true" > getSummaries(param) { const { columns, data } param; const sums []; columns.forEach((column, index) > { if (index 0) { sums[index] 合计; }…

关于RiboSeq分析流程的总结

最近关注了一下RiboSeq的分析方法&#xff0c;方法挺多的&#xff0c;但是无论哪种软件&#xff0c;都会存在或多或少的问题&#xff0c;一点问题不存在的软件不存在&#xff0c;问题的原因出在&#xff0c;1.有的脚本是用python2编写的&#xff0c;目前python2已经不能用了 2.…

FFM(Field-aware Factorization Machine -领域感知的因子分解机)解析及举例

FFM&#xff08;Field-aware Factorization Machines&#xff09;模型是一种广泛应用于推荐系统、广告点击率预测等领域的机器学习模型。与传统的因子分解机&#xff08;FM&#xff09;相比&#xff0c;FFM模型考虑了不同特征字段之间的交互关系&#xff0c;从而能够更好地捕捉…

jdk17的一些特性和升级遇到的问题

特性 JEP 403: Strongly Encapsulate JDK Internals&#xff0c;增强jdk内部元素的保护 大多数开发用不到。升级jdk时&#xff0c;可能因为之前代码用了某些类&#xff0c;导致无法升级。 JEP 394: Pattern Matching for instanceof&#xff0c;instanceof模式匹配&#xff08;…

未履行出资义务,名义股东担何责任?

名义股东是否要对未履行出资义务承担责任&#xff1f;如果要担责&#xff0c;应该承担何种责任&#xff1f;近日&#xff0c;河南省西平县人民法院审结了一起股东损害公司债权人利益责任纠纷案。   2021年&#xff0c;经生效法律文书确认&#xff0c;B实业公司应支付A科技公司…

树莓派pico入坑笔记,dht11使用及温湿度表制作

目录 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 用到的库adafruit_dht&#xff0c;需要导入pico才能使用&#xff0c;在这里下载 样例程序 进阶玩法&#xff0c;显示信息的温湿度计 屏幕使用见树莓派pico专栏的ssd1306oled屏幕使用 代码 效…

代码随想录算法训练营第34天

LeetCode 416. 分割等和子集 链接 class Solution { public:bool canPartition(vector<int>& nums) {vector<int> dp(10001, 0);int sum accumulate(nums.begin(), nums.end(), 0);if(sum % 2 1) {return false;}int target sum / 2;for(int i 0; i <…

Go 初始化一个字典

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

4K60无缝一体矩阵 HDMI2.0功能介绍

关于GF-HDMI0808S 4K60无缝一体矩阵的功能介绍&#xff0c;由于直接针对GF-HDMI0808S型号的具体信息较少&#xff0c;我将结合类似4K60无缝HDMI矩阵的一般功能特性和可能的GF-HDMI0808系列产品的特点来进行说明。请注意&#xff0c;以下信息可能不完全针对GF-HDMI0808S型号&…

HOW - 结合 Form 和 Schema 的数据验证方案(Shema Validation)

目录 示例安装示例代码解释 Schema Validation 产生背景和机制产生背景机制ZodYup 机制和工作原理结论 在 React 应用中&#xff0c;使用表单和 Schema Validation 可以有效地管理表单状态和验证输入数据。 示例 常见的库包括 Formik 和 Yup。Formik 用于管理表单状态&#x…

springboot+vue系统开发

链接: https://pan.baidu.com/s/1P1YpHAx9QOBPxjFZ9SAbig 提取码: u6f1

如何设计一个C语言面向结构体的内存数据库

内存数据库 一般所谓内存数据库&#xff0c;是指能够与应用运行在同一个进程内的数据库&#xff0c;也就是说能够被嵌入到进程内运行的数据库。 比较著名的内存数据库软件&#xff0c;例如&#xff0c;Sqlite&#xff1b;以及新生代的NOSql key-value数据库bdb(Berkeley DB)、…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【Linux】任务管理

这个任务管理&#xff08;job control&#xff09;是用在bash环境下的&#xff0c;也就是说&#xff1a;【当我们登录系统获取bashshell之后&#xff0c;在单一终端下同时执行多个任务的操作管理】。 举例来说&#xff0c;我们在登录bash后&#xff0c;可以一边复制文件、一边查…

adb 常用的命令总结

1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时&#xff0c;抓取错误报告 adb logcat -b crash 抓取筛选后的日志&#xff1a; adb logcat -s AndroidRuntime > d:\log…

解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

CSS 单位中 px、em 和 rem 的区别?

在CSS中&#xff0c;px、em和rem是常用的长度单位&#xff0c;它们之间有一些区别&#xff1a; px&#xff08;像素&#xff09;&#xff1a; px是相对长度单位&#xff0c;它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的&#xff0c;不会随着父元…