【POJ No. 3468】 简单的整数问题 A Simple Problem with Integers

news2024/9/23 9:24:58

【POJ No. 3468】 简单的整数问题 A Simple Problem with Integers

北大OJ 题目地址

在这里插入图片描述

其实这道题之前也已经 做过了

https://blog.csdn.net/weixin_44226181/article/details/128112081

在这里插入图片描述

上次就 直接用的区间更新 和区间查询。这次 我们使用 分块方法实现一次。

【题意】

有N 个整数A 1, A 2, …, AN ,需要对其进行两种操作,一种操作是对给定区间中的每个数都添加一个给定的数,另一种操作是查询给定区间中数的总和。

【输入输出】

输入:

第1行包含两个数N 和Q (1≤N ,Q ≤105 );第2行包含N 个数,为A 1 , A 2 , …, AN 的初始值(-109 ≤Ai ≤109 );接下来的Q 行,每行都表示一种操作,“C a b c ”表示将Aa , Aa +1 ,…, Ab 中的每一个数都加c (-104 ≤c ≤104 ),“Q a b ”表示查询Aa , Aa +1 , …, Ab 的总和。

输出:

对每个查询,都单行输出区间和的值。

【样例】

在这里插入图片描述

提示:总和可能超过32 位整数 的范围。

【思路分析】

这道题有两种操作:区间更新和区间查询,可采用分块算法解决。

【算法设计】

① 分块预处理。将序列分块,然后对每个块都标记左右端点L[i]和R[i ],对最后一块需要特别处理;标记每个元素所属的块,累加每一块的和值。

② 区间更新。首先取l 和r 所属的块,p =pos[l ],q =pos[r];若属于同一块,则对该区间的所有元素都进行暴力修改,同时更新该块的和值。若不属于同一块,则对中间完全覆盖的块打上懒标记,add[i ]+=d ;对首尾两端的元素暴力修改即可。

③ 区间查询。首先取l 和r 所属的块,p =pos[l ],q =pos[r];若属于同一块,则对该区间的所有元素都进行暴力累加,然后加上懒标记上的值。若不属于同一块,则对中间完全覆盖的块累加sum[]值和懒标记上的值,然后对首尾两端的元素暴力累加元素值及懒标记值。

【算法实现】

#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define N 100010

using namespace std;

ll a[N],sum[N],add[N];
int L[N],R[N],d;
int pos[N];
int n,m,t,l,r;
char op[3];

void build(){
	t=sqrt(n*1.0);//float sqrt (float),double sqrt (double),double long sqrt(double long)
			 //注意没有sqrt(int),但是返回值可以为int
			 //也可以选择G++提交,否则int型做参数会提示编译问题 
    int num=n/t;
    if(n%t)  num++;
    for(int i=1;i<=num;i++){
        L[i]=(i-1)*t+1;//每块的左右 
        R[i]=i*t;
    }
    R[num]=n;
    for(int i=1;i<=num;i++)
		for(int j=L[i];j<=R[i];j++){
        	pos[j]=i;//表示属于哪个块
        	sum[i]+=a[j];//计算每块和值
		}
} 

void change(int l,int r,long long d){//区间[l,r]加上d 
    int p=pos[l],q=pos[r];//读所属块 
    if(p==q){//在一块中
        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;
        for(int i=l;i<=R[p];i++)//左端暴力修改 
			a[i]+=d;
        sum[p]+=d*(R[p]-l+1);
        for(int i=L[q];i<=r;i++)//右端暴力修改
			a[i]+=d;
        sum[q]+=d*(r-L[q]+1);
    }
}

ll query(int l,int r){
    int p=pos[l],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]*(R[i]-L[i]+1);
        for(int i=l;i<=R[p];i++)//左端暴力累加
			ans+=a[i];
        ans+=add[p]*(R[p]-l+1);
        for(int i=L[q];i<=r;i++)//右端暴力累加
			ans+=a[i];
        ans+=add[q]*(r-L[q]+1);
    }
    return ans;
}

int main(){
	
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    build(); 
    for(int i=1;i<=m;i++){
        scanf("%s %d %d",op,&l,&r);
        if(op[0]=='C'){
            scanf("%d",&d);
            change(l,r,d);
        }
        else
			printf("%lld\n",query(l,r));
    }
	
    return 0;
}

在这里插入图片描述

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

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

相关文章

IDEA搭建Android开发环境及创建Helloword项目并运行

IDEA开发Android环境搭建 安装jdk JDK版本 &#xff1a;jdk-8u161-windows-x64.exe 链接&#xff1a;https://pan.baidu.com/s/1leC6nilGeCEYsD99Rlt5hQ 提取码&#xff1a;0epq 配置环境变量 配置成功会出现如下所示 安装sdk 安装完成后&#xff0c;SDK的目录如下&#…

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

全文链接&#xff1a;http://tecdat.cn/?p30131最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据&#xff08;查看文末了解数据免费获取方式&#xff09;间的相关分析和预测分析&#xff0c;主要内容包括其使用实例&…

[附源码]计算机毕业设计学习互助辅助系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

菜谱APP源码和设计报告

《移动互联开发》 课程作业 学 院&#xff1a; 班 级&#xff1a; 学 号&#xff1a; 姓 名&#xff1a; 日 期&#xff1a; 设计要求&#xff08;提交文档时需删除&#xff09;: 1.本课程设计作为《Android 程序设计》的期末考查内容。 2.任务安排&#xff1a; &…

WAVE SUMMIT+2022飞桨平台新升级 全面支撑大模型研发与产业化

11月30日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT 2022深度学习开发者峰会如期举行。峰会上&#xff0c;百度AI技术生态总经理马艳军发布了飞桨深度学习平台的最新技术和生态进展&#xff0c;全新发布飞桨开源框架2.4版本&#xff0c;带来业界首个端…

在Linux中部署运维监控系统WGCLOUD

在公网IP为x.x.x.x&#xff0c;安装CentOS8或Alibaba Cloud Linux 3.2104 LTS 64位系统的服务器&#xff08;服务端&#xff09;上&#xff0c;先安装jdk8&#xff0c;然后安装数据库mariadb-10.5&#xff0c;最后进行server安装。 在需要监控的安装CentOS8或Alibaba Cloud L…

基于多时间尺度滚动优化的多能源微网双层调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Redis】redis的理解与使用、springboot中redis的五种数据类型的相关存取、StringRedisTemplate

文章目录Redis简介&#xff1a;redis的安装与使用&#xff1a;1.启动方式&#xff1a;2.修改密码3. Redis可视化软件4.redis的使用5.有关redis的存储问题springBoot项目使用redis▶jar包&#xff1a;▶示例&#xff1a;1.使用opsForValue操作字符串2.使用opsForList操作List3.使…

智能使得宇宙趋向稳定吗?

——评《智能简史》 最近读完了加拿大工程院院士于非的新著《智能简史》&#xff0c;书中的主要观点是“智能的作用是推动宇宙趋向稳定”。从这个观点出发&#xff0c;万物都有智能&#xff0c;因为它们遵循的规律都具有这个作用。即使是人们认为“无智能”的物理对象&#xff…

vue纯手写思维导图,拒绝插件(cv即用)

vue纯手写思维导图&#xff0c;拒绝插件(cv即用) 已完成功能点&#xff1a;折叠、放大、缩小、移动 后续增加功能点&#xff1a;添加、删除 先看结果&#xff1a; 有这么个需求&#xff0c;按照层级关系&#xff0c;把表格放在思维导图上&#xff0c;我第一时间想到用插件&am…

Android开发JetPack-Databinding组件

DataBinding介绍Android开发JetPack-Databinding组件1. 什么是databinding&#xff08;1&#xff09;简介&#xff08;2&#xff09;意义2. databinding基本使用&#xff08;1&#xff09;启用databinding&#xff08;2&#xff09;定义一个布局&#xff08;3&#xff09;创建一…

Redis02:企业架构介绍以及redis介绍

企业架构介绍以及redis介绍NoSql概述单机Mysql的演进当今企业架构分析NoSql概述 单机Mysql的演进 1、单机Mysql的年代 90年代一个基本的网站访问量一般不会太大&#xff0c;单个数据库完全足够&#xff01;那个时候更多的去使用静态html&#xff0c;服务器没有太大的压力。这…

HCIP实验3-1:IBGP与EBGP

实验 3-1 IBGP与EBGP 学习目的 掌握区域内部BGP的配置方法掌握多区域BGP的配置方法观察BGP的邻居表和数据库掌握BGP更新源的配置方法掌握EBGP多跳的配置方法观察IBGP和EBGP中路由的下一跳的变化掌握IBGP中下一跳的配置掌握BGP的Network命令的配置方法 拓扑图 场景 你是公司…

open label file.(This can be normal only if you use MScoco)

E:\yolov4-rubish\darknet\our_data\ImagesAug 把标签的txt文件和Jpg文件放在同一个文件夹

Kafka 入门知识,看这一篇就够了(上)

目录01 初识 Kafka02 topic & partition03 Kafka 分布式最近在学习 Kafka&#xff08;别问&#xff0c;问就是公司在用 &#xff09;&#xff0c;将学习过程中的笔记整理出来分享给大家&#xff0c;就当是入入门 01 初识 Kafka Kafka 最早是由 LinkedIn 公司开发的&#x…

python中numpy数组形状和计算

1. numpy数组形状 数组可以理解为是矩阵&#xff0c;所以会涉及几行几列 import numpy as np import randomt1 np.array([[1,2,3],[4,5,6]]) print(t1) print(t1.shape)在这段逻辑里&#xff0c;t1是个数组&#xff0c;输出结果后 (2, 3)表示的就是这个数组是一个2行3列的矩…

计算机系统基础实验——数据的机器级表示(计算浮点数 f 的绝对值[f])

题目要求&#xff1a; 这个函数计算浮点数f的绝对值[f]。如果f是NaN&#xff0c;函数应该简单的返回f。 Unsigned float_abs (unsiged f) { /**************/ return/*******/; } 先分析题目&#xff0c;题目有两个要求&#xff1a; 1.判断f是否是NAN类型&#xff0c;如果是返…

文件管理,给文件名称插入纯数字详细步骤

在日常办公过程中&#xff0c;我们经常会需要对文件名称进行重命名&#xff0c;如何给文件插入纯数字呢&#xff1f;一两个文件还好可以自定义重命名&#xff0c;面对大量文件的时候&#xff0c;怎么在文件名称中插入纯数字呢&#xff1f;一起来看看吧&#xff01; 第一步&…

这 5 本数据分析书籍,都是经典中的经典

下面要推荐的 5 本数据分析书籍对于数据分析领域而言&#xff0c;经典、经典、还是经典。 强烈建议先收藏&#xff0c;再观看。 《深入浅出数据分析》 数据分析入门第一本。 本书构思跌宕起伏&#xff0c;行文妙趣横生&#xff0c;无论是职场老手&#xff0c;还是业界新人&…

S2SH小区物业管理理系统计算机毕业论文Java项目源码下载

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH小区物业系统_哔哩哔哩_bilibili计算机毕业设计java毕设之S2SH小区物业系统共计2条视频&#xff0c;包括&#xff1…