题目链接:http://poj.org/problem?id=3468 http://poj.org/problem?id=3468 http://poj.org/problem?id=3468

思路:这是一个区间改动区间查询的题,因为题目中的给的数据比較大,那么用单个改动和查询肯定不行,所以。

。。。注意数据可能比較大,应该用__int64或long long存数据。

。。

code:

#include<stdio.h>
#include<math.h>
#define L(u) (u<<1)
#define R(u) (u<<1|1) const int M=100010; struct Node
{
__int64 l,r;
__int64 add;
long long sum;
}node[M*4]; __int64 a[M]; void pushup(__int64 u)
{
node[u].sum=node[L(u)].sum+node[R(u)].sum;
return ;
} void pushdown(__int64 u)
{
node[L(u)].add+=node[u].add;
node[L(u)].sum+=(node[L(u)].r-node[L(u)].l+1)*node[u].add;
node[R(u)].add+=node[u].add;
node[R(u)].sum+=(node[R(u)].r-node[R(u)].l+1)*node[u].add;
node[u].add=0;
} void build(__int64 u,__int64 left,__int64 right)
{
node[u].l=left;
node[u].r=right;
node[u].add=0;
if(left==right)
{
node[u].sum=a[left];
return ;
}
__int64 mid=(node[u].l+node[u].r)/2;
build(L(u),left,mid);
build(R(u),mid+1,right);
pushup(u); } void update(__int64 u,__int64 left,__int64 right,__int64 v)
{
if(left<=node[u].l&&node[u].r<=right)
{
node[u].add+=v;
node[u].sum+=(node[u].r-node[u].l+1)*v;
return ;
}
//node[u].sum+=(right-left+1)*v; //当前节点表示的区间不是查询区间的子区间
if(node[u].add) pushdown(u); //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
__int64 mid=(node[u].l+node[u].r)/2;
if(right<=mid) update(L(u),left,right,v);
else if(left>mid) update(R(u),left,right,v);
else
{
update(L(u),left,mid,v);
update(R(u),mid+1,right,v);
}
node[u].sum=node[L(u)].sum+node[R(u)].sum;
} __int64 query(__int64 u,__int64 left,__int64 right)
{
if(left<=node[u].l&&node[u].r<=right)
{
return node[u].sum;
}
if(node[u].add) pushdown(u); //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
__int64 mid=(node[u].l+node[u].r)/2;
if(right<=mid) return query(L(u),left,right);
else if(left>mid) return query(R(u),left,right);
else
{
return (query(L(u),left,mid)+query(R(u),mid+1,right));
}
} int main()
{
__int64 n,m,i,x,y,z;
while(scanf("%I64d%I64d",&n,&m)==2)
{
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
build(1,1,n);
char str[5];
for(i=0;i<m;i++)
{
scanf("%s",str);
if(str[0]=='C')
{
scanf("%I64d%I64d%I64d",&x,&y,&z);
update(1,x,y,z);
}
else
{
scanf("%I64d%I64d",&x,&y);
printf("%I64d\n",query(1,x,y));
}
}
}
return 0;
}

poj 3466 A Simple Problem with Integers的更多相关文章

  1. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  2. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  3. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  4. poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58269   ...

  5. poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解

    A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...

  6. POJ 3468 A Simple Problem with Integers //线段树的成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 59046   ...

  7. [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  8. [ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 55273   ...

  9. POJ 3468 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97217   ...

随机推荐

  1. 55. 略谈Lotus Notes的与众不同及系列文章至此的总结

    在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...

  2. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(二)

    在了解地图的初始化和加载之前,我们先了解下mario的地图. 用tiled工具打开mario地图 从地图中可以看到,mario的地图有很多层构成: objects层:怪物,会动的怪物 coin层:金币 ...

  3. Uva 3226 Symmetry

    题目给出一些点的坐标(横坐标,纵坐标),没有重叠的点,求是否存在一条竖线(平行于y轴的线),使线两边的点左右对称. 我的思路:对于相同的纵坐标的点,即y值相同的点,可以将x的总和计算出,然后除以点的数 ...

  4. 2080夹角有多大II

    寻人启事:2014级新生看过来! 夹角有多大II Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...

  5. Java--对象内存布局

    在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部.实例数据.对齐填充. 一.对象头部Header的布局 Mark Word Class 指针 在32位系统下,上面两部分各占4 ...

  6. 语法糖----JAVA

    语法糖 语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这种语法能使程序 ...

  7. (Problem 10)Summation of primes

    The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two milli ...

  8. C#注册表

    C#注册表情缘   记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能.直到我研究注册表前一天我都感觉他是那么的高深. 今天正好有空,于是就研究了下注册表 ...

  9. 【.Net基础拾遗】品味OO继承

    0X1 引言 提起面向对象,每个人都有不同的见解.但提的最多的无非就是:对象.封装.继承.多态.差不多就是这些元素构成了面向对象设计开发的基本逻辑.面向对象编程,“对象”指的是什么?这里的" ...

  10. Python函数式编程:内置函数map()使用说明

    一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...