poj3468 A Simple Problem with Integers 成段更新

2024-06-12 01:58

本文主要是介绍poj3468 A Simple Problem with Integers 成段更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

跟上一题的成段更新有所不同的是  此处的更新不是直接变成某一个值 而是在原来的基础上加上某一个值

所以 标记的变量也有所改变 是在原来的基础上加上那个值 (一开始 我以为标记变量只是标记用的 具体的加减在sum变量里进行 导致 答案错误)

另外这道题目 数据比较大,超过了int 范围注意到了sum的范围 但是没有注意到标记变量 col 的范围 导致答案错误

#include <iostream>
#include<cstdio>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
long long int sum[440000];
long long int col[440000];//long long int 型
long long int an;
void PushUp(int rt)
{sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int m)
{if(col[rt]!=0){col[rt<<1]+=col[rt];//标记变量应该在原来的基础上加上新变化的值col[rt<<1|1]+=col[rt];sum[rt<<1]=sum[rt<<1]+(m-(m>>1))*col[rt];sum[rt<<1|1]=sum[rt<<1|1]+(m>>1)*col[rt];col[rt]=0;}
}
void build(int l,int r,int rt)
{col[rt]=0;if(l==r){scanf("%lld",&sum[rt]);return;}int m=(l+r)>>1;build(lson);build(rson);PushUp(rt);
}
void UpDate(int c,int d,int num,int l,int r,int rt)
{if(c<=l&&r<=d){col[rt]+=num;//在原来的基础上标记变量相应的加上变化的值sum[rt]+=(long long )num*(r-l+1);return;}PushDown(rt,r-l+1);int m=(l+r)>>1;if(m>=c)UpDate(c,d,num,lson);if(m<d)UpDate(c,d,num,rson);PushUp(rt);
}
void query(int c,int d,int l,int r,int rt)
{if(c<=l&&r<=d){an+=sum[rt];return;}PushDown(rt,r-l+1);//每次遇到有延时标记的节点是都应该相应更新它的子节点int m=(l+r)>>1;if(m>=c)query(c,d,lson);if(m<d)query(c,d,rson);
}
int main()
{int n,m,i,a,b,c;char s[5];scanf("%d%d",&n,&m);build(1,n,1);while(m--){scanf("%s",s);if(s[0]=='Q'){scanf("%d%d",&a,&b);an=0;query(a,b,1,n,1);printf("%lld\n",an);}else if(s[0]=='C'){scanf("%d%d%d",&a,&b,&c);UpDate(a,b,c,1,n,1);}}return 0;
}


这篇关于poj3468 A Simple Problem with Integers 成段更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052879

相关文章

个人博客文章目录索引(持续更新中...)

文章目录 一、Java基础二、Java相关三、MySql基础四、Mybatis基础及源码五、MybatisPlus基础六、Spring基础及源码七、Tomcat源码八、SpringMVC基础及源码   随着文章数量多起来,每次着急翻找半天,而是新申请的域名下来了,决定整理下最近几年的文章目录索引。(红色标记为常检索文章) 一、Java基础 1、Java基础(一):语言概述2、J

手把手带你实现Android增量更新

Android增量更新技术在很多公司都在使用,网上也有一些相关的文章,但大家可能未必完全理解实现的方式,本篇博客,我将一步步的带大家实现增量更新。 为什么需要增量更新? 当我们开发完一个项目之后,上线维护 , 增加新功能 , 添加第三方库 , APK大小从4 - 5M , 增长到10+M , 用户由原来的几十秒下载 , 到现在几分钟以上的下载 , 网络情况不好的时候 , 或许就是十分钟不等。每

华为欧拉 openEuler24.03 更新 阿里 yum源

华为欧拉 openEuler24.03 更新 阿里 yum源 备份 yum 源编写 阿里云 yum源 配置文件更新 yum 缓存 备份 yum 源 mv /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak 编写 阿里云 yum源 配置文件 vim /etc/yum.repos.d/openEuler.r

git 放弃本地修改 强制更新

git fetch --all git reset --hard origin/分支名称 git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本

【从0实现React18】 (四) 如何触发更新 带你了解react触发更新的流程以及更新后如何触发render

常见的触发更新的方式 创建 React 应用的根对象 ReactDOM.creatRoot().render();类组件 this.setState();函数组件 useState useEffect; 我们希望实现一套统一的更新机制,他的特点是: 兼容上述触发更新的方式方便后续拓展(优先级机制) 更新机制的组成部分 代表更新的数据结构 Update消费update的数据结构——Up

Simple-STNDT使用Transformer进行Spike信号的表征学习(一)数据处理篇

文章目录 1.数据处理部分1.1 下载数据集1.2 数据集预处理1.3 划分train-val并创建Dataset对象1.4 掩码mask操作 数据、评估标准见NLB2021 https://neurallatents.github.io/ 以下代码依据 https://github.com/trungle93/STNDT 原代码使用了 Ray+Config文件进行了参数搜

Pwn刷题记录(不停更新)

1、CTFshow-pwn04(基础canary) ​ 好久没碰过pwn了,今天临时做一道吧,毕竟刚联合了WSL和VSCode,想着试着做一道题看看,结果随手一点,就是一个很少接触的,拿来刷刷: ​ 先查看下保护: root@MSI:/home/g01den/Temp# checksec pwn[*] '/home/g01den/Temp/pwn'Arch: i386-32-lit

AtCoder Beginner Contest 359 A~C(D~F更新中...)

A.Count Takahashi 题意 给出 N N N个字符串,每个字符串为以下两种字符串之一: "Takahashi" "Aoki" 请你统计"Takahashi"出现了多少次。 分析 输入并统计即可。 代码 #include <bits/stdc++.h>using namespace std;typedef long long ll;void solve() {i

Linux基本命令有哪些(持续更新中)

Linux基本的命令有mkdir  xxx,此命令用来创建一个目录如:mkdir Linuxstuff(此命令是创建文件Linuxstuff)                                 cd  xxx,此命令用来进入一个指定的目录:cd Linuxstuff(此命令进入Linuxstuff里面去 ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样

Linux学习笔记-目录解释、添加删除用户、更新密码

vim hello.c  --编写c程序 gcc hello.c  --编译c程序 ./a.out      --运行c程序 root 存放root用户的相关文件 是一级目录 home 存放普通用户的相关文件 是二级目录 bin 存放常用命令的目录 sbin 存放的是要有一定的权限才可以使用的命令 mnt 默认挂载光驱和软驱的目录 boot 存放引导相关的文件的目录 etc 存放配置相关的