[ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)
| Time Limit: 5000MS | Memory Limit: 131072K | |
| Total Submissions: 55273 | Accepted: 16628 | |
| Case Time Limit: 2000MS | ||
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
Hint
Source
解题思路:
某个区间内的数都加上同一个数,成段更新。
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=100005;
long long sum[maxn<<2];
long long add[maxn<<2];
int n,k;
void PushUp(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int m)
{
if(add[rt])
{
//add[rt<<1]=add[rt<<1|1]=add[rt];//不能写成这样
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
sum[rt<<1]+=add[rt]*(m - (m>>1));
sum[rt<<1|1]+=add[rt]*(m>>1);
add[rt]=0;
}
}
void build(int l,int r,int rt)
{
add[rt]=0;
if(l==r)
{
scanf("%lld",&sum[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
} void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
add[rt]+=c;
sum[rt]+=(long long)c*(r-l+1);
return;
}
PushDown(rt,r-l+1);
int m=(r+l)>>1;
if(L<=m)
update(L,R,c,lson);
if(R>m)
update(L,R,c,rson);
PushUp(rt);
}
long long query(int L,int R,int l,int r,int rt)//注意long long类型
{
if(L<=l&&r<=R)
{
return sum[rt];
}
PushDown(rt,r-l+1);//查询的时候要向下更新。懒惰标记
int m=(l+r)>>1;
long long ans=0;//注意long long
if(L<=m)
ans+=query(L,R,lson);
if(R>m)
ans+=query(L,R,rson);
return ans;
}
int main()
{
scanf("%d%d",&n,&k);
build(1,n,1);
char c;int a,b,d;
while(k--)
{
scanf("%s",&c);
if(c=='Q')
{
scanf("%d%d",&a,&b);
printf("%lld\n",query(a,b,1,n,1));
}
else
{
scanf("%d%d%d",&a,&b,&d);
update(a,b,d,1,n,1);
}
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
[ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)的更多相关文章
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
		
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
 - POJ 3468 A Simple Problem with Integers (线段树成段更新)
		
题目链接:http://poj.org/problem?id=3468 题意就是给你一组数据,成段累加,成段查询. 很久之前做的,复习了一下成段更新,就是在单点更新基础上多了一个懒惰标记变量.upda ...
 - 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 w ...
 - 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(树状数组区间更新)
		
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 97217 ...
 - 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 1741】Tree
			
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11570 Accepted: 3626 Description ...
 - WPF案例 (四) 模拟Windows7桌面任务栏
			
原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...
 - 嗨翻C语言
			
<嗨翻C语言> 基本信息 作者: (美)David Griffiths Dawn Griffiths 译者: 程亦超 出版社:人民邮电出版社 ISBN:978711531884 ...
 - python中print,return和yield的区别
			
def func1(): for i in range(1, 5): print i def func2(): for i in range(1, 5): return i def func3(): ...
 - Django写的投票系统4(转)
			
原文地址:http://www.cnblogs.com/djangochina/archive/2013/06/04/3114269.html 现在已经可以在后台管理投票了,现在就差怎么在前台显示和如 ...
 - IIS7 配置 PHP5.5
			
本文环境: 操作系统:Win7(x64) 中文专业版 PHP :V5.5 首先添加IIS. 控制面板-〉程序-〉打开或关闭Windows功能 1. 勾选“Internet 信息服务” ...
 - jar包有嵌套的jar的打包成jar的方法
			
1.先写一个类,将其打包成jar包. 代码如下: package com.wjy.jar; public class GetUserName { public String getUserName() ...
 - 再探vim经常使用命令
			
 最開始学习过vim,见 http://blog.csdn.net/u011848617/article/details/12837873 之后以前不了了之,当再次学习后,发现经常使用命令的掌握还 ...
 - JUnit4.8.2来源分析-6.1 排序和过滤
			
Runner.sort.Request.sortWith和Sorter.apply yqj2065很快,他们搞死. Sorter.apply().Request.sortWith()和Sortable ...
 - 期望dp专题
			
一直不明白为什么概率是正推,期望是逆推. 现在题目做多了,慢慢好像有点明白了 poj2096 收集bug, 有n个种类的bug,和s个子系统. 每找到一个bug需要一天. 要我我们求找到n个种类的 ...