Simple Problem with Integers POJ – 3468

Simple Problem with Integers POJ – 3468

你有N整数,A1, A2, … , AN..你需要处理两种操作。一种操作是在给定的时间间隔内向每个数字添加一些给定的数字。另一种是要求给定区间内的数字之和。

输入

第一行包含两个数字NQ..1≤N,Q≤100000。
第二行包含N的初始值A1, A2, … , AN..-1000000000≤Ai≤1000000000。
下一个Q行表示操作。
“Ca b c“意思是增加c每一个AaAa+1, … , Ab..-10000≤c≤10000。
“Qa b“意思是查询…之和。AaAa+1, … , Ab.

输出量

你需要回答所有Q命令有条不紊。一字一句地回答。

样本输入

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4

样本输出

4
55
9
15

这道题也是个裸题,主要知识点,懒人标记入门 区间修改,区间查询。

上代码

 

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
const int MAX = 50000 + 10;
long long tree[MAX*4], lz[MAX*4],len[MAX];
void init(){
    memset(tree,0,sizeof(tree));
    memset(lz,0,sizeof(lz));
}
 //建树成功! 
void build(int node, int l,int r)
{
    len[node]=r-l+1;
    if(l==r)
    {
        cin>>tree[node];
        return ;
    }
    int mid=(l+r)/2;
    build(2*node,l,mid);
    build(2*node+1,mid+1,r);
    tree[node]=tree[2*node]+tree[2*node+1];
}
//ok! gaizhi1chenghgong
void push_down(int node){
    if(lz[node]){
        lz[node*2] += lz[node];
        lz[node*2 + 1] += lz[node];
        // 注意线段树的数据更新方式要一致
        tree[node*2] += len[node*2]*lz[node];
        tree[node*2 + 1] += len[node*2+1]*lz[node];
        lz[node] = 0;
    }
}
void update_range(int node,int l,int r,int L,int R,int add){
    if(l <= L && r >= R){
        lz[node] += 1LL*add;
        tree[node] += 1LL*(R - L + 1)*add; // 更新方式
        return;
    }
    push_down(node);
    int mid = (L+R) / 2;
    if(mid >= l) update_range(node*2,l,r,L,mid,add);
    if(mid < r) update_range(node*2 + 1,l,r,mid+1,R,add);
    tree[node] = tree[node*2] + tree[node*2 + 1];
}
long long query(int l,int r,int node,int x, int y)
{
    if(x<=l&&y>=r)
        return tree[node];
    push_down(node);
    int mid=(l+r)/2;
    int sum=0;
    if(mid>=x){
        sum=sum+query( l, mid, node*2, x, y);
    }
    if(mid<y)//chadiancuol
    {    
    sum=sum+query( mid+1, r, node*2+1, x, y);
    }
    return sum;
}
int main()
{
    int m,n;
    init();
    char s[MAX];
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        build(1,1,m);
        int x, y,z;
        
        while(n--)
        {
            scanf("%s",s);
            if(s[0]=='Q')
            {
                scanf("%d %d",&x,&y);
                printf("%lld\n",query(1,m,1,x,y));
            }
            if(s[0]=='C')
            {
                scanf("%d %d %d",&x,&y,&z);
                update_range(1,1,m,x,y,z);
            }
        }
    }    
    return 0;
}

回去发现又错误,检查了将近两小时,才发现,更新区域的值函数,形式参数为小写的了l,r,然后与大写的搞混了。

这样的情况已经不是第一次发生了,找这种错误耗费了我太多无用功,

下次如果再有超过半小时还没找出错误的,感觉思路绝对没问题,就自己重新写,然后就是函数的形式参数的名字尽量要区分开,找的要猝死了,感觉啊。。。

void update_range(int l,int r,int node,int L,int R,int add){
    if(L <=l  && R >= r){
        lz[node] += add;
        tree[node] += len[node]*add; // 
        return;
    }
    push_down(node);
    int mid = (l+r) / 2;
    if(mid >= L) update_range(l,mid,node*2,L,R,add);
    if(mid < R) update_range(mid+1,r,node*2+1,L,R,add);//就错这里,,,,,
    tree[node] = tree[node*2] + tree[node*2 + 1];
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114887.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月27日 下午11:00
下一篇 2021年9月28日 上午6:00


相关推荐

  • rtsp 获取视频流 java_OpenCV – 如何捕获rtsp视频流

    rtsp 获取视频流 java_OpenCV – 如何捕获rtsp视频流例如,我们有工作rtsp流测试像:“rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov”(它在发布这篇文章的时候工作)现在我想在openCV中捕获这个视频流(opencv2.4.7/2.4.8)我的代码完全适用于本地电影文件,但当我尝试捕获rtsp时,我得到的信息如下:“无法读取电影文件RTSP://184.72.239.149/vod/m…

    2022年10月17日
    6
  • SQL聚合函数「建议收藏」

    SQL聚合函数「建议收藏」一、知识点聚合函数对组执行计算并返回每个组唯一的值。GROUPBY子句通常与聚合函数一起用于统计数据。GROUPBY子句将行排列成组,聚合函数返回每个组的统计量。常用的聚合函数有:COUNT(),SUM(),AVG(),MIN(),MAX()。COUNT(),其作用主要是返回每个组的行数,也会返回有NULL值的列,可用于数字和字符列。SUM(),主要用于返回表达式中所有的总和,忽略NULL值,仅用于数字列。AVG(),返回表达式所有的平均值,仅用于数字列并且自动忽略NULL值。MIN(),返

    2022年6月21日
    24
  • PyCharm专业版激活成功教程

    PyCharm专业版激活成功教程0x01 下载 JetbrainsCra 的 jar 包下载链接 链接 百度云链接 nbsp 提取码 8u4c nbsp 0x02 把 JetbrainsCra 的 jar 包放入 pycharm 文件下的 bin 目录中 0x03 加上必要的文件代码在 bin 目录下使用记事本打开 pycharm exe vmoptions 和 pycharm64 exe vmoptions 最后一行加上 nbsp javaagen

    2026年3月27日
    2
  • opencv之打开摄像头、边缘检测

    按q退出if__name__==’__main__’:cap=cv2.VideoCapture(0)#设置摄像头0是默认的摄像头如果你有多个摄像头的话呢,可以设置1,2,3….whileTrue:#进入无限循环ret,frame=cap.read()#将摄像头拍到的图像作为frame值cv2….

    2022年4月7日
    48
  • 每天一个linux命令(34):du 命令

    每天一个linux命令(34):du 命令

    2021年10月7日
    45
  • 学生为什么要在CSDN写博客?

    学生为什么要在CSDN写博客?学生为什么要在 CSDN 写博客 引言写博客的好处构建知识体系提升写作能力扩展人脉为简历加分帮助他人为什么是 CSDN 如何写博客记录学习总结错误总结与展望引言就目前来说 学生应该是使用各种博客最多的人 但却不是写博客的主体 在我看来 这是因为学生处于一个学习阶段 在不断的学习和实践的过程中总会遇到这样那样的问题 然后在线下询问无果 或者直接喜欢上网搜索 所以 学生成为了一个使用博客的主体 后者的原因就是因为绝大多数学生认为自己能力不够 没有相关的知识储备 不能够支持自己写博客 这还是在很多人说写博客有非常非常

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号