【POJ 3468】A Simple Problem with Integers【分块】

POJ、HDU、ZOJ、SOJ水题过滤器 自动探测POJ、HDU、SOJ、ZOJ水题,对于有志于刷遍各种水题的ACMer来说非常有用 立即下载

题目大意:

题目链接:http://poj.org/problem?id=3468
给出一个初始数列,有两种操作:

  • Q   x   y Q\ x\ y Q x y,输出这个数列 x x x到 y y y之间的数字和。
  • C   x   y   z C\ x\ y\ z C x y z,将这个数列的 x x x到 y y y之间的数加上 z z z。

思路:

线段树方法
树状数组方法

这道题还可以用分块做。。。
模板的分块,就不多解释了。
把这个数列分成 n \sqrt{n} n ​块,每块长度不超过 n \sqrt{n} n ​,每块有如下几个变量:

  • s u m [ x ] sum[x] sum[x]表示第 x x x块里面所有数的总和
  • a d d [ x ] add[x] add[x]表示将第 x x x块整体加或减时的值
  • L [ x ] L[x] L[x]表示第 x x x块的最左边的位置
  • R [ x ] R[x] R[x]表示第 x x x块的最右边的位置

每一块都有一些关于数字的变量,那么每一个数字也有它的那一块的变量:

  • a [ i ] a[i] a[i]不用解释了。。。读入的初始值
  • p o s [ i ] pos[i] pos[i]数字 i i i属于第几块

过程详见代码:


代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#define N 100011
#define ll long long
using namespace std;

int n,m,L[N],R[N],pos[N],x,y,t;
ll add[N],sum[N],a[N],z;
char c;

ll ask(int l,int r)  //查找
{
	int q=pos[l],p=pos[r];  //左右边界分别的块
	ll ans=0;
	if (q==p)  //在同一块就直接暴力求答案(反正不会超过sqrt(n))
	{
		for (int i=l;i<=r;i++)
		 ans+=a[i]+add[q];  //a[i]是原来的答案,add[q]是整体加的时候这一块加的和。
		return ans;
	} 
	//不在同一块,就将中间的包含了整块整块的直接求出来
	//然后在将左右两边用上述暴力方法求出
	for (int i=q+1;i<p;i++)
	 ans+=add[i]*(ll)(R[i]-L[i]+1)+sum[i];  //中间整块的答案
	for (int i=l;i<=R[q];i++)
	 ans+=a[i]+add[q];  //暴力左边
	for (int i=L[p];i<=r;i++)
	 ans+=a[i]+add[p];  //暴力右边
	return ans;
}

void Add(int l,int r,ll z) //修改
{
	int q=pos[l],p=pos[r];
	if (q==p)  //在同一块就直接暴力
	{
		for (int i=l;i<=r;i++)
		{
			a[i]+=z;  //直接暴力加上
			sum[q]+=z;  //这一块的总和也要加
		}
		return;
	}
	//还是像查找那样,先求出中间的整段的答案,两边在分开处理
	for (int i=q+1;i<p;i++) 
	 add[i]+=z;  //中间整段都加上z
	for (int i=l;i<=R[q];i++)  //左边
	{
		a[i]+=z;
		sum[q]+=z;
	}
	for (int i=L[p];i<=r;i++)  //右边
	{
		a[i]+=z;
		sum[p]+=z;
	}
	return;
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	 scanf("%lld",&a[i]);
	t=(int)sqrt(n);  //总块数
	for (int i=1;i<=t;i++)
	{
		L[i]=(i-1)*t+1;
		R[i]=i*t;  //求出每一快的长度和左右边界
		for (int j=L[i];j<=R[i];j++)
		{
			pos[j]=i;
			sum[i]+=a[j];  //初始化
		}
	}
	if (R[t]<n)  //有可能还会差一块,补上
	{
		L[++t]=R[t-1]+1;
		R[t]=n;
		for (int i=L[t];i<=R[t];i++)
		{
			pos[i]=t;
			sum[t]+=a[i];
		}
	}
	while (m--)
	{
		cin>>c;
		scanf("%d%d",&x,&y);
		if (c=='Q')
		{
			cout<<ask(x,y)<<endl;
		}
		else 
		{
			scanf("%lld",&z);
			Add(x,y,z);
		}
	}
	return 0;
}
Matlab系列之GUI设计基础 Matlab系列之GUI设计基础简介编辑界面菜单设计控件设计控件描述个人理解Matlab转译控件属性【1】外观与行为【2】控件对象的信息【3】回调函数【4】状态信息结束结束更多精彩,等你发现~ 简介 GUI即图形用户界面(Graphical User Interface),人机交互的一种方式,可以简化用户的操作,比如只需要点点窗口上的按键或者菜单选择等等,就可以实现一个复杂的功能,有点类似黑盒的操作吧。 本篇将主要介绍GUI的使用,以及一些功能,后续的篇章再使用GUI来设计实例。 打开GUI可以在Matla 阅读详情

相关推荐

使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第一部分

American fuzzy lop 是一款面向安全的模糊测试器,它采用一种新型的编译时插桩和遗传算法,可以自动发现干净、有趣的测试用例,从而触发目标二进制文件中新的内部状态。这显著提高了模糊测试代码的功能覆盖率。AFL 的地址是它已经有一段时间没有更新了。虽然 AFL 仍然运行良好,但有一个新项目 AFL++,它是 AFL 的一个分支,包含许多改进和新功能。AFL++ 的地址是,其源代码位于。在本文中,我们将研究如何使用 AFL++ 对 IoT 二进制文件进行模糊测试。

技术超强的网络安全平台 1086

poj3468-线段树详解

什么是线段树线段树,是一种树形结构,它的各个节点都保存的是一条线段。线段树主要是解决动态查询的问题,使用二叉树的结构后,它的操作基本的复杂度为O(logn).线段树的每个节点表示一个区间,其左右子树表示该节点的左半区间和右半区间。比如说,一个节点为[a, b],中间的值为c=(a+b)/2,左子节点表示的区间为[a,c],右子节点表示的区间为[c+1, b]线段树要解决的问题问题描述:在一个数组ar

编码之路 3011

大疆M3508电机使用CAN通信进行速度PID闭环控制详解

目录一. 简介二. 电机通信协议三. 电机PID控制原理四. 官方代码移植-中断接收五. 官方代码移植-查询接收 一. 简介 之前写过一篇文章STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法,其中是以大疆的M3508电机为例进行讲解的(没错,就是RoboMaster机器人同款电机,不过Robomaster上的电机好像是小一号的M2006)。不少小伙伴私信问我要代码,我都回复说不是有官方demo么。后来问的人多了我大概明白了,看来官方的Demo还是有点门槛。可能是带FreeRTOS操作系统看

qq_30267617的博客 7万+

详解代码(线段树) POJ-3468: A Simple Problem with Integers

很明显从逻辑上来说是一道关于线段树或者树状数组的模板题,需要我们去维护一个区间和,并且随时准备修改区间值并且对修改后的数组进行区间查询,查询区间元素总和! 代码尽量做到了每一行都有注释...

weixin_65039404的博客 368

RiscV运行zephyr和Linux的方法

riscv基金会搞了一个网站,用于介绍如何使用riscv指令集进行开发。 对于运行zephyr和linux以及Qemu有非常大的帮助。 可以作为riscv开发的相关参考。 RISC-V - Getting Started Guide — RISC-V - Getting Started Guidehttps://risc-v-getting-started-guide.readthedocs.io/en/latest/index.html RISC-V - Getting Started Gu.

闲人的专栏 737

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 683

POJ3468 —— 线段树 || 树状数组

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 49696   Accepted: 14708 Case Time Limit: 2000MS Description You have N i

XMzhou的专栏 889

包络检波电路(Envelope Detector)

把 100 kHz 载波想象成"电台的高频信号",把 1 kHz 包络想象成"主持人说话的声波"。而今天电路的工作,就是把这个"调大调小的外壳"(包络)重新剥出来,还原成主持人的声音 🎵。这是三极管开关电路的重要搭档,也是从"二极管家族"过渡到"三极管家族"的桥梁 🔌。——倍压整流看的是"幅值累积"(多个电容接力),包络检波看的是"频率分离"(高低频分开)。同样的"D1 串联 + RC 并联"拓扑,今天被赋予了"AM 解调"的新生命。——电感负载的"泄洪闸",保护三极管开关不被反向电动势击穿。

飞多学堂的博客 94

POJ -- 3468 --线段树成段更新

很久以前的题目再做一遍复习一下。 要点: 1)约定在任何时候 add_num 到达节点的时候就立即更新节点的 sum 值。 2)每次更新节点回溯的时候记得维护节点的 sum 值。 3)执行询问操作的时候,遇到 lazy 标记为1 的时候往下 Push_down,,同时记得第一点 4)遇到符合要求的询问区间时,由于第一条的规定,直接返回 sum 值,而不必加上 区间长度*add_num

WoniuGe 722

LLaMA-Factory微调教程5:多模态VLM模型对话

视觉-语言模型(VLM)概述与应用 视觉-语言模型(VLM)是一类结合视觉和语言信息的人工智能模型,旨在实现跨模态的理解与交互。其核心目标包括跨模态理解和生成能力,关键技术涉及模态表示与映射、多模态预训练以及跨模态交互机制。 典型VLM模型包括: CLIP:通过对比学习实现图像和文本的向量空间对齐 BLIP:结合自监督和弱监督学习提升语义对齐 ALBEF:基于BERT结构扩展跨模态注意力 DALL-E系列:基于文本生成图像的生成式模型 CLIP4Clip:扩展CLIP到视频领域 VLM在图像/视频检索、视觉

Cachel Wood的博客 1114

生成EtherCAT从站XML图片信息方法

详细介绍了EtherCAT从站XML文件中图片元素的生成方法。

kevin1499的博客 2128

POJ 3468【线段树,懒惰标记】

题目:http://poj.org/problem?id=3468 给出N个整数,进行M次询问,C a b c 表示给区间[a, b]中的每一个数加上c, Q a b 表示询问区间[a, b] 的和 #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #define ll long long int using na

Tw_light的博客 292

Three.js 完整实战项目:构建一个 3D 商品展示空间

Three.js 作为强大的 WebGL 框架,广泛应用于交互式 3D 场景开发,尤其适合创建沉浸式商品展示空间。本文将通过一个完整的实战项目,展示如何构建一个 3D 商品展示空间,涵盖项目架构、资源组织、多模型切换、交互热点绑定、移动端适配和帧率优化。项目以展示虚拟商品(如家具或电子产品)为核心,结合用户交互,基于 Vite、TypeScript 和 Tailwind CSS,支持 ES Modules,确保响应式布局,遵循 WCAG 2.1 可访问性标准。本文适合希望通过综合项目掌握 Three.js

zimin的专栏 1462

POJ3468 A Simple Problem with Integers 分块

题目链接 http://poj.org/problem?id=3468 分析 将原序列划分成若干段长度为 ⌊n⌋\lfloor \sqrt{n} \rfloor⌊n​⌋ 的区间进行维护; 设 a[i]a[i]a[i] 以表示原序列每个元素, b[i]b[i]b[i] 表示每个元素所属的区间, sum[i]sum[i]sum[i] 表示每个区间的元素之和,add[i]add[i]add[i] 表示每...

Kevin的博客 466

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

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

POJ 3468 A Simple Problem with Integers (分块)

Description You haveNintegers,A1,A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is...

邵光亮的博客 659

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

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

POJ - 3468 A Simple Problem with Integers(分块)

题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次操作,每次操作分为两种情况: C l r d:区间 [ l , r ] 内的数字都加上 d Q l r :查询 [ l , r ] 内的区间和 题目分析:分块的做法比较直观,将长度为 n 的数列分为 sqrt( n ) 个长度为 sqrt( n ) 的独立部分,对于查询和修改: 如果 l 和 r 位于同一个部分内,则直接遍历即可 如果 l 和 r 位于不同的部分内:记 ll 和 rr 分别为第几个部分 遍历 [ ll + .

Falcon的博客 504

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

POJ 3468 A Simple Problem with Integers (分块)

Description You have \(N\) integers, \(A_1, A_2, ... , A_N\). You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval....

G19850917的博客 149

POJ 3468 A Simple Problem with Integers【分块 | 模板】

题目链接 题目描述: 线段树模板题:给定 N 个数的数列 A,Q 次查询,查询分为两种:(1)将区间[l, r]的值改变d;(2)查询区间[l, r]的和。 题解: 本题可用线段树做,但是也可用分块做。 分块: 把数列A分成若干个长度不超过 ⌊N12⌋\lfloor N^{\frac{1}{2}} \rfloor⌊N21​⌋ 的段,其中第 i 段左端点为 (i−1)⌊N12⌋+1(i-1)\lfloor N^{\frac{1}{2}} \rfloor+1(i−1)⌊N21​⌋+1,右端点为min(i⌊N1

weixin_44258590的博客 153

POJ 3468 A Simple Problem with Integers(分块)

A Simple Problem with Integers You have NNN integers, A1,A2,...,ANA_1, A_2, ... , A_NA1​,A2​,...,AN​. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask f

m0_51864047的博客 181

Poj3468 A Simple Problem with Integers (分块)

题面 Poj 题解 区间求和\(+\)区间修改板子,这里用分块写的 #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using std::min; using std::max; using std::swap; using std::sort; t...

weixin_30733003的博客 89

A Simple Problem with Integers POJ - 3468 (分块)

题目链接:https://cn.vjudge.net/problem/POJ-3468 题目大意:区间加减+区间查询操作。 具体思路:本来是一个线段树裸题,为了学习分块就按照分块的方法做吧。 分块真的好暴力,,,(但是还是挺优美的)。 说一下各个数组的作用。 a数组,代表每一个点的值。 sum数组,代表分块后每一段的值。 add数组,相当于线段树中的lazy标记,记录的数当...

diaomeijiao3430的博客 154

POJ 3468 A Simple Problem with Integers (分块解法)

You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the su...

weixin_44003265的博客 275

A Simple Problem with Integers 【POJ - 3468】【区间更新分块】

题目链接 大概题意 一个数列有两个操作,一个是在【l,r】这个区间内加上一个数,一个适合计算【l,r】区间的和。 解題思路 这个题之前也是做过的,是用线段树写的,今天用分块练一下区间修改,lazy的意义和线段树差不多,就是个懒惰标记。 看了下时间分块和线段树的时间不差很多,但是线段是更优秀一点吧。 #include<stdio.h> #include<string.h> #...

qq_41925919的博客 144

POJ-3468 A Simple Problem with Integers 分块 线段树区间更新

POJ-3468 A Simple Problem with Integers 题意: 给定一个数字序列, 有两张操作: 1. 查询[L, R] 的所有数字之和。2. 给定区间[L, R] 的所有数加C. 分析: 很明显的线段树区间更新问题, 但是在这里要引入一种新的算法------分块。 分块的思想就是把区间分为相等的块, 大小一般为sqrt(n), 在进行操作的时候直接对块进行操作, 查询...

YancyKahn 405
上一篇: 【洛谷P3254】【24题】圆桌问题【网络流】
下一篇: 【Contest Hunter 3101】阶乘分解【数论,数学】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值