分块入门

【c++】 分块入门知识 分块的入门做法 阅读详情

分块入门 1

给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值。

没啥说的直接上程序

#include <bits/stdc++.h>
#define rep(x, y, z) for(register int x = y; x <= z; x ++) 
inline int read(){
    char ch = getchar(); int u = 0, f = 1;
    while (!isdigit(ch)){ if (ch == '-') f = -1; ch = getchar();}
    while (isdigit(ch)) {u = (u << 3) + (u << 1) + ch - 48; ch = getchar();}
    return u * f;
}
const int maxn = 500500;
int n, m, blo;
int v[maxn], tag[maxn], bl[maxn];
namespace Blo{//分块
    inline void Add(int l, int r, int c){
        rep (i, l, std::min(bl[l] * blo, r))
            v[i] += c;
        if (bl[l] != bl[r])
        rep (i, (bl[r] - 1) * blo + 1, r)
            v[i] += c;
        rep (i, bl[l] + 1, bl[r] - 1)
            tag[i] += c;
    }
    inline int query(int pos){//查询的时候就返回单点+块的标记
        return v[pos] + tag[bl[pos]];
    }
}
int main(){
    n = read(), m = read(); blo = sqrt(n);//块的大小
    for (int i = 1; i <= n; i++) bl[i] = (i - 1)/blo + 1;
    for (int i = 1; i <= n; i++) v[i] = read();
    while (m--){
        int opt = read();
        if (opt == 1) {int l = read(), r = read(), c = read(); Blo::Add(l, r, c);} 
        else {
            int x = read();
            printf("%d\n",Blo::query(x));
        }
    }
    return 0;
}

分块入门 2

给出一个长为n的数列,以及n个操作,操作涉及区间加法,询问区间内小于某个值x的元素个数。

每个块内用vector维护排序,注意细节的处理

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#define int long long 
using namespace std;
int n,t,a,b,c,opt;
int L[501],R[501],post[50010],val[50010],mark[501];
vector<int>linker[510];
void add(int a,int b,int c)
{
	int p=post[a],q=post[b];
	if(p==q)
	{
		linker[p].clear();
		for(int i=a;i<=b;i++)
			val[i]+=c;
		for(int i=L[p];i<=R[p];i++)
			linker[p].push_back(val[i]);
		sort(linker[p].begin(),linker[p].end());
		return;
	}
	else
	{
		for(int i=p+1;i<=q-1;i++)
			mark[i]+=c;
		linker[p].clear();
		linker[q].clear();
		for(int i=a;i<=R[p];i++)
			val[i]+=c;
		for(int i=L[q];i<=b;i++)
			val[i]+=c;
		for(int i=L[p];i<=R[p];i++)
			linker[p].push_back(val[i]);
		for(int i=L[q];i<=R[q];i++)
			linker[q].push_back(val[i]);
		sort(linker[p].begin(),linker[p].end());
		sort(linker[q].begin(),linker[q].end());
		return;
	}
}
int query(int a,int b,int c)
{
	int ans=0;
	int p=post[a],q=post[b];
	if(p==q)
	{
		for(int i=a;i<=b;i++)
			if(val[i]+mark[p]<c)
				ans++;
	}
	else
	{
		for(int i=a;i<=R[p];i++)	
			if(val[i]+mark[p]<c)
				ans++;
		for(int i=L[q];i<=b;i++)	
			if(val[i]+mark[q]<c)
				ans++;
		for(int i=p+1;i<=q-1;i++)
		{
			int x=c-mark[i];
			ans+=lower_bound(linker[i].begin(),linker[i].end(),x)-linker[i].begin();
		}
	}
	return ans;
}
main()
{
	scanf("%lld",&n);
	int t=sqrt(n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&val[i]);
	for(int i=1;i<=t;i++)
	{
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	if(R[t]<n)
	{
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++)
	{
		for(int j=L[i];j<=R[i];j++)
		{
			post[j]=i;
			linker[i].push_back(val[j]);
		}
		sort(linker[i].begin(),linker[i].end());
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld%lld",&opt,&a,&b,&c);
		if(opt==0)
			add(a,b,c);
		else
			printf("%lld\n",query(a,b,c*c));
	}
	return 0;
}

程序



突破编程_C++_查找算法(分块查找) C++ 查找算法:分块查找 阅读详情

相关推荐

数据结构——分块入门—>扩展

数据结构——分块入门前言分块详解Loj 6277. 数列分块入门 1传送门题目分析CodeLoj 6278. 数列分块入门 2传送门题目分析Code练习预留扩展 前言 \quad首先,我们来考虑这样一个模型:有一段连续的序列a[1]∼a[n]a[1]\sim a[n]a[1]∼a[n],现在我们需要执行几类操作: 求出其中一段区间的和  \,这时我们可以使用前缀和,记录a[1]∼a[i]的和为sum[i]a[1]\sim a[i]的和为sum[i]a[1]∼a[i]的和为sum[i],显然sum[i]=s

沫惘的博客 1063

litble的留言板

这是一块可爱的留言板,欢迎给可爱的litble留言。

litble的成(tui)长(fei)史 2757

为什么RingMo能成为遥感领域的首个生成式自监督基础模型?

RingMo作为遥感领域首个生成式自监督基础模型,通过创新的图像掩码建模技术解决了传统方法在遥感图像处理中的挑战。该模型利用两百万张多元数据集进行预训练,在小目标检测、场景分类等任务上表现卓越,显著提升了性能指标。RingMo的技术突破为遥感图像解译提供了高效解决方案,降低了标注成本并增强了模型泛化能力。

ll5678的博客 691

C++算法 - 分块思想初步

分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。分块的时间复杂度主要取决于分块的块长,一般可以通过均值不等式求出某个问题下的最优块长,以及相应的时间复杂度。分块是一种很灵活的思想,相较于树状数组和线段树,分块的优点是通用性更好,可以维护很多树状数组和线段树无法维护的信息。当然,分块的缺点是渐进意义的复杂度,相较于线段树和树状数组不够好。不过在大多数问题上,分块仍然是解决这些问题的一个不错选择。

LNY2022的博客 706

通达信股本变迁文件(gbbq)解密方法

近年来A股市场跌宕起伏真特么精彩,本人愚钝,被整爆仓,损失惨重 痛定思痛,认为交易这种对纪律要求极高,且必须完全排除情绪影响的勾当,还是应该交给程序来干 数据哪里来呢?当然是拿来主义。。。问券商的交易软件要呗 到处查资料,得知通达信的权息文件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据 ——这对于某些对成交量变化敏感的交易模型是非常重要的

不甘碌碌老,结庐铸宝刀 2万+

深入IR2104数据手册:被忽略的SD引脚用法和死区时间调节实战

本文深入解析IR2104半桥驱动芯片的SD引脚用法和死区时间调节技巧,帮助硬件工程师优化电机控制和电源转换系统。通过详细的电路设计、实测数据和调试方法,揭示SD引脚的多重保护机制和死区时间的精密调节策略,提升系统安全性和效率。

weixin_30342363的博客 389

LOJ6285.数列分块入门 9(分块在线求区间众数)

link #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll>PLL; typedef pair<int, int>PII; typedef pair<double, double>PDD; #define I_int ll in

我们都有光明的未来 438

Palantir的本体论建模跟数仓建模的异同

Palantir的Foundry Ontology通过构建组织的数字孪生体,将数据集和模型映射为对象类型、属性、链接和操作类型,形成完整的语义知识网络。与传统数仓建模相比,本体建模以业务问题为驱动,强调细粒度语义和实时决策能力,采用图语义技术实现灵活的映射关系。

轩哥的个人研究和成长记录 1588

数列分块入门

数列分块入门

seanli1008的博客 870

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 904

数据结构——分块:数列分块入门

数据结构——分块:数列分块入门数列分块入门1题目算法分析Code数列分块入门4题目算法分析Code反思与总结 最近在学习分块,在这里分享一下联系的几道习题。 关于何为分块,请阅读 这篇文章 以下是分块的经典联系题。 LOJ:数列分块入门1-9 下面来分享最近完成的数列分块入门1和数列分块入门4。 数列分块入门1 题目 算法分析 详细见 数据结构——分块入门 Code #include<iostream> #include<cstdio> #include<algorithm&

Lunar Arc的博客 454

一根网线,让整个公司断网,二层环路真实事故复盘

那天晚上 23:47,监控告警突然爆了。核心交换机 CPU 100%。ARP 表暴涨。广播流量飙升。业务系统集体超时。5 分钟后,全公司断网。运维群里一句话:“是不是黑客攻击?但老网工都知道,这种现象只有一种可能:二层环路。

网络技术联盟站 346

分块入门 LOJ

LOJ  分块入门: 1. 分块入门 1 #include<bits/stdc++.h> using namespace std; const int N = 5e4 + 100; int n, blo, a[N], b[N], tag[N]; void modify(int l, int r, int c) { for (int i = l; i <= mi...

Top_xiao的博客 292

STM32实现简单的智能电梯控制

上述代码实现了一个简单的智能电梯控制器。电梯的状态包括IDLE(停止)、UP(向上移动)和DOWN(向下移动)三种状态。通过向上和向下按钮的按下,可以控制电梯移动到指定的楼层。在主循环中,不断读取当前楼层的按钮状态,并根据电梯状态决定执行的动作。具体的楼层数量和按钮的GPIO引脚可以根据实际情况进行调整。要实现简单的智能电梯控制,我们可以使用STM32微控制器来实现。

2401_85258012的博客 336

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

1 数列分块入门_数列分块入门 1

分块入门分好块就能写。。#include #define INF 0x3f3f3f3f#define full(a, b) memset(a, b, sizeof a)using namespace std;typedef long long ll;inline int lowbit(int x){ return x & (-x); }inline int read(){int X = 0...

weixin_39979332的博客 121

efm32 入门.pdf

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

1 数列分块入门_loj数列分块入门 1~9

前言:先说句闲话,分块这个东西其实在第二次集训刚刚开始的时候就拉着lc学过一阵,原因是在luogu上见到了某著名毒瘤出的末日时系列的一套题目,貌似大部分都是分块,于是我想尝试着去做几道(毕竟是个珂学家),但是看完题目就自闭了(noip毒瘤果不虚传),这两天学长又给我们讲了一些分块的知识,就把loj上的几道入门题再捡起来说一下吧。入门基础知识就不说什么了,学长讲过了,蓝皮书上面也有。这里前面和后面的...

weixin_28864057的博客 261

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

1 数列分块入门_LOJ 6277:数列分块入门 1(分块入门)

#6277. 数列分块入门 1内存限制:256 MiB时间限制:100 ms标准输入输出题目类型:传统评测方式:文本比较题目描述给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值。输入格式第一行输入一个数字n。第二行输入n个数字,第i个数字为ai,以空格隔开。接下来输入n行询问,每行输入四个数字opt、l、r、c,以空格隔开。若opt=0,表示将位于[l,...

weixin_28811757的博客 365

『分块』分块入门1-9题解

关于分块 关于分块,其主要思想是大局维护,局部朴素;即吧一个序列分成若干个小块,对任意区间进行操作的时候:如果区间内包含完整块,就进行快速的整体修改;若所修改区间内的一部分是某个个块中的一部分,则直接进行暴力修改就行。根据有关数学知识,可以证明分成n\sqrt nn​的时间效率最高,一般的时间复杂度则是O(nn)O(n\sqrt n)O(nn​) 分块入门1 给出一个长为n的数列,以及n个操作,操...

Ronaldo7_ZYB的博客 423

数列分块入门题解

数列分块入门1~3 数列分块入门4~6 数列分块入门7~9

qq_51682374的博客 167

[分块]数列分块入门1-9

一、前言   对线段树还挺熟悉的我之前却从没写过分块的题(?)。然后兴致一来就决定搜点练习,找到了来自hzwer的《数列分块入门1-9》,觉得挺不错的,于是决定做做。 二、概念 / 作用   概念:将数列等分为若干个不相交的区间,每一个区间称为一个块。   作用:优化算法,降低复杂度。具体如何降低,在下面的题目中会逐步提及。题目呈难度递增趋势。 三、题目 / 代码 1、分块...

weixin_33675507的博客 281

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

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

Ronaldo7_ZYB的博客 380

数列分块入门1

数列分块入门1 给出一个长为 $n$ 的数列,以及 $n$ 个操作,操作涉及区间加法,单点查值。 # 输入格式 第一行输入一个数字 $n$。 第二行输入 $n$ 个数字,第 i 个数字为 $a_i$,以空格隔开。 接下来输入 $n$ 行询问,每行输入四个数字 $opt,l,r,c$,以空格隔开。 若 $opt = 0$,表示将位于 $[l, r]$ 的之间的数字都加 $c$。 若 $opt = 1$,表示询问 $a_r$ 的值($l$和 $c$ 忽略)。 # 输出格式 对于每次询问,输出一

m0_64542522的博客 726

数列分块入门4

数列分块入门4 给出一个长为n的数列,以及n个操作,操作涉及区间加法,区间求和。

m0_64542522的博客 1019
上一篇: BZOJ1999树网的核
下一篇: BZOJ1031字符加密
Slr2002
博客等级 码龄9年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值