poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解
A Simple Problem with Integers
Description
You have N integers, A1, A2, ... , 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 A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+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, A1, A2, ... , 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 A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+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 线段树第一次 + 讲解的更多相关文章
- 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 ...
- 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 ...
- [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- POJ 3468 A Simple Problem with Integers //线段树的成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 59046 ...
- poj 3468 A Simple Problem with Integers 线段树加延迟标记
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers 线段树区间更新
id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072 ...
- POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 67511 ...
随机推荐
- Linux之free命令
from http://www.cnblogs.com/peida/archive/2012/12/25/2831814.html free命令可以显示Linux系统中空闲的.已用的物理内存及swap ...
- 1 HTML
1 HTML 基础知识 软件的结构: C/S(Client Server)结构的软件: 比如: QQ. 极品飞车. 飞信 . 迅雷 cs结构的软件的缺点:更新的时候需要用户下载更新包 ...
- C++模板(基础)
本文转至:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类 ...
- Python 学习笔记 - 10.类(Class) 1
定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...
- python把str转换为int
def str2int(s): def fn(x,y): return x+y def char2num(s): ':9}[s] return reduce(fn,map(char2num,s)) ' ...
- Hbase之获取数据
import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache ...
- json方法
http://penghuaiyi.iteye.com/blog/1922632 package com.yd.web.util; import java.lang.reflect.Type; imp ...
- 基因组 de novo 组装原理
Falcon软件的组装流程 为了错误校正,将原始子reads进行overlap 预组装和错误校正 错误校正后reads的overlap检测 overlap的过滤 从overlap构建图 从图构建con ...
- 【转】 Linux 线程同步的三种方法
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的 ...
- pvresize - Unix, Linux Command
NAME pvresize - resize a disk or partition in use by LVM2 SYNOPSIS pvresize [-d|--debug] [-h|--help] ...