A Simple Problem with Integers

Description

You have N integers, A1A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of AaAa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

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

Sample Output

4
55
9
15

Description

You have N integers, A1A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of AaAa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

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

Sample Output

4
55
9
15 报告
题目大意: 一串数,“C a b c" 表示在区间[a,b]中每个数 + c
"Q a b"表示查询区间[a,b] 的和 线段树: 学习了线段树后的第一道题。这道题包含了线段树的Pushdown,Pushup,Query,Build,Update几个函数,很好地让初学者了解了线段树的用法和精髓--延迟更新,即每次更新时只是做一个标记,当要查找时才继续向下更新。还要注意的是,有些题不需要向下回溯(pushup),也不需要延迟更新(pushdown),甚至连更新都不用。但是需要根据题意改变要查找的内容和更新的内容,有的需要找最大值,有的需要找和,等等,需要随机应变。线段树能解决的问题,树状数组不一定能解决,但是树状数组能解决的,线段树一定能解决。 思路: 便不多说。上代码。
 #include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#define L(u) (u<<1)
#define R(u) (u<<1|1)//没有分号
using namespace std;
int n,q;
long long c;
long long a[];
struct node{
int l,r;
long long add,sum;
};
char s[];
node pp[];/**数据范围**/
void pushup(int u)
{
pp[u].sum=pp[L(u)].sum+pp[R(u)].sum;
return ;
}
void pushdown(int u)
{
pp[L(u)].add+=pp[u].add;
pp[L(u)].sum+=(pp[L(u)].r-pp[L(u)].l+)*pp[u].add;
pp[R(u)].add+=pp[u].add;
pp[R(u)].sum+=(pp[R(u)].r-pp[R(u)].l+)*pp[u].add;
pp[u].add=;/*!!!*/
}
void update(int u,int left,int right,long long t)
{
if (left<=pp[u].l&&pp[u].r<=right)
{
pp[u].add+=t;
pp[u].sum+=(pp[u].r-pp[u].l+)*t;
return ;
}
pp[u].sum+=(right-left+)*t;
if (pp[u].add) pushdown(u);
int mid=(pp[u].l+pp[u].r)>>;
if (right<=mid) update(L(u),left,right,t);
else /***/if (left>mid) update(R(u),left,right,t);
else
{
update(L(u),left,mid,t);
update(R(u),mid+,right,t);
}
//pushup(u);
} void build(int u,int left,int right)
{
pp[u].l=left;
pp[u].r=right;
pp[u].add=;
if (pp[u].l==pp[u].r)
{
pp[u].sum=a[left];//*****
return ;
}
int mid=(pp[u].l+pp[u].r)>>;
build(L(u),left,mid);
build(R(u),mid+,right);
pushup(u);
}
long long query(int u,int left,int right)
{
if (left==pp[u].l&&pp[u].r==right)
return pp[u].sum;
if (pp[u].add) pushdown(u);
int mid=(pp[u].l+pp[u].r)>>;
if (right<=mid) return query(L(u),left,right);
if (left>mid) return query(R(u),left,right);
else
return (query(L(u),left,mid)+query(R(u),mid+,right));
}
int main()
{
//freopen("tree.in","r",stdin);
cin>>n>>q;
for (int i=;i<=n;i++)
scanf("%lld",&a[i]);//long long 读数
build(,,n);
for (int i=;i<=q;i++)
{
scanf("%s",s);
if (s[]=='Q')
{
int k,b;
scanf("%d%d",&k,&b);
cout<<query(,k,b)<<endl;
}
else
{
int k,b;
cin>>k>>b>>c;
update(,k,b,c);
}
} return ;
}
注意事项:1、数据范围:线段树一般定义4*n
2、#difine 的使用 function() ( ** ) 注意括号没有分号;
     3、runtime error :运行错误 long long a[i], %lld(linux) %I64d (windows)
     4、模板答题 顺便抱怨一下,poj的评测系统太慢了,waiting了好久.......

poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解的更多相关文章

  1. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  2. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

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

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

  4. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

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

  5. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  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. poj 3468 A Simple Problem with Integers 线段树区间更新

    id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072 ...

  9. POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)

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

随机推荐

  1. O(n)获得中位数及获得第K小(大)的数

    首先,中位数问题可以归结为求 K=n/2的 第K小元素,并无明显区别. 第一种方法,用MaxHeap,大小为K的大顶堆,能够求出最小的K的元素,复杂度为O(n*logK). 当K较大时,复杂度会较高. ...

  2. android学习---- WindowManager 接口 (

    The interface that apps use to talk to the window manager. 这个接口用于与 window manager (窗口管理器, 应用框架层) 进行交 ...

  3. return

    return作为返回关键字,有以下两种意义的返回格式: 1,返回把握与函数成果:停止函数执行,返回调用函数,并且把函数的值作为返回成果. turn只能退出当前函数,如果多个函数嵌套就不行了,要想整个退 ...

  4. toolbar

    toolbar= (Toolbar) findViewById(R.id.toolbar_mainactivity); // 设置主标题及其颜色 toolbar.setTitle("Andr ...

  5. 晒幸福, qq空间晒法

    qq空间晒法 1.成为老婆之后,还是说新交的女朋友,这会让女朋友感动

  6. VC++ 中使用 std::string 转换字符串编码

    目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...

  7. java 多线程8(join)

    join():  加入.一个线程如果执行了join语句,那么就有新的线程加入,执行该语ij 句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行. import java.util.Scann ...

  8. (转)Android APK反编译详解

    转载地址:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到 ...

  9. 小程序---根据数据库反向生成java文件

    工作中写entry太繁琐,写了一个小程序反向生成.从而大大减少了工作量 import java.io.File; import java.io.FileWriter; import java.io.I ...

  10. BT5更新源

    感谢http://blog.csdn.net/seaos/article/details/7064136终于找到更新成功的源了 下面简单介绍步骤吧 gedit /etc/apt/sources.lis ...