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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java之XML的使用「建议收藏」

    Java之XML的使用「建议收藏」一.xml的定义和优势:(1).定义:在描述一些有结构性的数据时应当使用XML来描述,例如:用户信息/省市结构等XML(eXtensibleMarkupLanguage),是一种可扩展的标记语言,类似HTML。XML技术是W3C组织(WorldWideWebConsortium万维网联盟)发布的,目前遵循的是W3C组织于1998年发布的XML1.0规范。HTML:显示页面,网…

    2022年7月7日
    25
  • mysql Navicat 15 激活码(JetBrains全家桶)

    (mysql Navicat 15 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月20日
    104
  • 音视频编解码常用知识点

    音视频编解码常用知识点目录视频播放器原理流媒体协议封装格式(容器)编解码转码帧(Frame)帧率(Framerate)分辨率比特率(码率)采样率采样位数声道数有损压缩和无损压缩帧内压缩和帧间压缩对称编码和不对称编码音频编码声音数字化三要素音频编码标准视频编码色彩空间RGB色彩空间YUV色彩空间压缩原理熵与冗余帧内编码…

    2022年7月13日
    27
  • 流水线设计的方法和作用「建议收藏」

    流水线设计的方法和作用「建议收藏」流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。如下图所示:典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当她是…

    2022年4月19日
    44
  • 单调栈用法_栈函数

    单调栈用法_栈函数单调栈,是指栈内元素从栈底到栈顶单调递增或单调递减的栈。简单来讲,单调栈=单调+栈,它同时满足两个特性:单调性、栈。以单调递增栈来讲解单调栈原理。假设当前元素为x,(1)若x<栈顶元素,那就不满足单调递增性,这时将栈中元素y弹出,若此时条件仍然不满足,则继续弹出栈顶元素,直到满足条件,再将x入栈;(2)若x>=栈顶元素,满足单调递增性,将x入栈;如此不断重复以上步骤,直到所有满足条件的元素都入栈。以一个具体例子[3,5,2,6,8]为例:(1)首先将3入栈,此时栈中元素为[3];(2

    2022年9月22日
    2
  • steam钓鱼网站源码_绝地求生驱动压枪源码

    steam钓鱼网站源码_绝地求生驱动压枪源码看到到处都在发钓鱼网站简单丧心病狂索性我干脆开源了,大不了互相伤害啊!源码地址:https://www.lanzous.com/i1tl2ad如果有什么不懂的开源加QQ群:726840814…

    2022年8月24日
    10

发表回复

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

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