首页 > 其他分享 >分块学习笔记

分块学习笔记

时间:2024-03-22 11:35:49浏览次数:238  
标签:ch 分块 int 复杂度 笔记 学习 维护 getchar

引入

分块,顾名思义,把需要的维护的数据分成多个块来维护,思想为大段维护,小段朴素。

区间修改,区间求和是一道线段树的板子,其复杂度为 \(O(n\log n)\),考虑分块如何做。

将序列分块,然后对于操作来说,中间的块直接查询和,然后将两边剩余的加起来即可。复杂度最优为 \(O(n\sqrt n)\),不难证明。

#include<bits/stdc++.h>
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define ll long long
#define int long long
const int N=5e4+10;
int mark[N],id[N],n,a[N],len,s[500];
inline void modify(int l,int r,int c){
	int be=id[l],en=id[r];
	if(be==en){
		for(int i=l;i<=r;++i)a[i]+=c,s[be]+=c;
		return;
	}
	for(int i=l;id[i]==be;++i)a[i]+=c,s[be]+=c;
	for(int i=be+1;i<en;++i)s[i]+=len*c,mark[i]+=c;
	for(int i=r;id[i]==en;--i)a[i]+=c,s[en]+=c;
}
inline ll query(int l,int r,ll p){
	ll ans=0;
	int be=id[l],en=id[r];
	if(be==en){
		for(int i=l;i<=r;++i)ans=(ans+a[i]+mark[be])%p;
		return ans;
	}
	for(int i=l;id[i]==be;++i)ans=(ans+a[i]+mark[be])%p;
	for(int i=be+1;i<en;++i)ans=(ans+s[i])%p;
	for(int i=r;id[i]==en;--i)ans=(ans+a[i]+mark[en])%p;
	return ans;
}
main(){
	// freopen("in.in","r",stdin);freopen("out.out","w",stdout);
	n=read(),len=std::sqrt(n);
	for(int i=1;i<=n;++i){
		a[i]=read();
		id[i]=(i-1)/len+1;
		s[id[i]]+=a[i];
	}
	for(int i=1,opt,l,r,c;i<=n;++i){
		opt=read(),l=read(),r=read(),c=read();
		if(opt)std::cout<<query(l,r,c+1)<<'\n';
		else modify(l,r,c);
	}
}

标签:ch,分块,int,复杂度,笔记,学习,维护,getchar
From: https://www.cnblogs.com/Ishar-zdl/p/18063445

相关文章

  • typescript 学习日志
    1. 属性名前面加上 readonly 关键字,表示这个属性是只读属性,不能修改。typescript里面的readonly是真的在初始化的时候确定其值不可改变,而非C#里面一样的其实是一个计算属性。 注意,如果属性值是一个对象,readonly修饰符并不禁止修改该对象的属性,只是禁止完全替换掉该对象。......
  • MakeFile学习
    Makefile学习Makefile的规则基本规则target...:prerequisites...<tab缩进>command<tab缩进>...<tab缩进>...target是一个目标文件,可以使ObjectFile,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续‘“伪目标”中会有叙述。prerequisites就是要生成t......
  • 3个可以免费学习Python的网站,每一个成功的Python大牛都去过!
    个可以免费学习Python的网站,每一个成功的Python大牛都去过!Python部落这个网站对Pythoner们来说还是很实用的,它有三大主要功能:学习Python、练习知识点。PS:如果你英文水平超好,还可以通过翻译技术文章赚点小钱勒~网站的左侧----我是小白,我想入门。在这里,你可以根据自己......
  • 零基础学习Python,新手都能看懂Python基础教程
    ​完成安装了Python,完成安装了PyCharm,知道Python可以做什么。无论什么都是从基础开始,python也是不例外的。要学会用一门语言,就需要了解它是由什么构成,它里面有什么。其实编程语言理论有很多都是相通,不同都是各自的差异化。Python优点有很多,缺点也是有的。**运行......
  • 【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作
    目录1 MySQL分组查询与子查询1.1数据分组查询1.2过滤分组1.3分组结果排序1.4select语句中子句的执行顺序1.5子查询2 MySQL表的联结操作2.1关系表2.2表联结2.3笛卡尔积2.4内部联结2.5外联结2.6自联结2.7组合查询1 MySQL分组查询与子查询1.1......
  • 【测试开发学习历程】MySQL增删改操作 + 备份与还原 + 索引、视图、存储过程
    前言:SQL内容的连载,到这里就是最后一期啦!如果有小伙伴要其他内容的话,我会追加内容的。(前提是我有学过,或者能学会)接下来,我们就要开始python内容的学习了~~ 目录1 MySQL增删改操作1.1数据添加操作1.1.1插入完整的行1.1.2插入多行1.2数据更新操作1.3数据删除操......
  • 新人学习笔记之(CSS背景和列表)
    一、CSS背景    1.background-color        1)background-color:颜色ltransparent(black)颜色值(颜色名|rgb|十六进制)背景区包括内容内边距,边框,不包括外边距.box1{background-color:red;}    2.background-image     ......
  • AXI Memory Mapped to PCI Express学习笔记(二)——PCIe中断
    AXIMemoryMappedtoPCIExpress IP核的中断包括Local中断,MSI中断和 Legacy中断。1Local中断   在配置AXI桥接器时,中断输出(interrupt_out)引脚可以根据中断掩码寄存器(InterruptMaskregister)的设置来发送中断。这个中断输出引脚会向连接到桥接器内存映射AXI4侧......
  • 前端学习-vue学习012-插槽
    官方教程链接父组件还可以通过插槽(slots)将模板片段传递给子组件:App.vue<scriptsetup>import{ref}from'vue'importChildCompfrom'./ChildComp.vue'constmsg=ref('fromparent')</script><template><ChildComp>{{msg......
  • proteus+keil5仿真学习笔记(第四章 继电器)
    第四章继电器目录前言一、继电器原理二、程序设计与仿真proteus电路程序总结前言这一章节介绍单片机控制继电器的电路应用。继电器在工业控制中应用非常广泛,可以通过继电器对其他大电流的电器进行控制。一、继电器原理继电器具体原理可以参考这篇博文:https://b......