poj------(3468)A Simple Problem with Integers(区间更新)
A Simple Problem with Integers
Time Limit: 5000MS |
Memory Limit: 131072K |
|
---|---|---|
Total Submissions: 60745 |
Accepted: 18522 |
|
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
The sums may exceed the range of 32-bit integers.
Source
POJ Monthly--2007.11.25, Yang Yi
代码:
#include<cstdio>
#include<cstring>
const int maxn=100005;
struct node
{
int lef,rig;
__int64 sum,cnt;
int mid(){
return lef+(rig-lef>>1);
}
};
node reg[maxn<<2];
void Build(int left ,int right,int pos)
{
reg[pos]=(node){left,right,0,0};
if((left==right))
{
scanf("%I64d",®[pos].sum);
return ;
}
int mid=reg[pos].mid();
Build(left,mid,pos<<1);
Build(mid+1,right,pos<<1|1);
reg[pos].sum=reg[pos<<1].sum+reg[pos<<1|1].sum;
}
void Update(int left,int right,int pos,int val)
{
if(reg[pos].lef>=left&®[pos].rig<=right)
{
reg[pos].cnt+=val;
reg[pos].sum+=val*(reg[pos].rig-reg[pos].lef+1);
return ;
}
if(reg[pos].cnt)
{
reg[pos<<1].cnt+=reg[pos].cnt;
reg[pos<<1|1].cnt+=reg[pos].cnt;
reg[pos<<1].sum+=reg[pos].cnt*(reg[pos<<1].rig-reg[pos<<1].lef+1);
reg[pos<<1|1].sum+=reg[pos].cnt*(reg[pos<<1|1].rig-reg[pos<<1|1].lef+1);
reg[pos].cnt=0;
}
int mid=reg[pos].mid();
if(left<=mid)
Update(left,right,pos<<1,val);
if(right>mid)
Update(left,right,pos<<1|1,val);
reg[pos].sum=reg[pos<<1].sum+reg[pos<<1|1].sum;
}
__int64 Query(int left,int right,int pos)
{
if(left<=reg[pos].lef&®[pos].rig<=right)
{
return reg[pos].sum;
}
if(reg[pos].cnt) //再向下更新一次
{
reg[pos<<1].cnt+=reg[pos].cnt;
reg[pos<<1|1].cnt+=reg[pos].cnt;
reg[pos<<1].sum+=reg[pos].cnt*(reg[pos<<1].rig-reg[pos<<1].lef+1);
reg[pos<<1|1].sum+=reg[pos].cnt*(reg[pos<<1|1].rig-reg[pos<<1|1].lef+1);
reg[pos].cnt=0;
}
int mid=reg[pos].mid();
__int64 res=0;
if(left<=mid)
res+=Query(left,right,pos<<1);
if(mid<right)
res+=Query(left,right,pos<<1|1);
return res;
}
int main()
{
int n,m,a,b,c;
char ss;
while(scanf("%d%d",&n,&m)!=EOF)
{
Build(1,n,1);
while(m--)
{
getchar();
scanf("%c %d%d",&ss,&a,&b);
if(ss=='Q')
printf("%I64dn",Query(a,b,1));
else{
scanf("%d",&c);
Update(a,b,1,c);
}
}
}
return 0;
}
- 【android开发】Android GUI系统学习1:Gralloc
- 【kaggle实战】从KNN,LR,SVM,RF到深度学习
- 开发 | 训练一个AI给颜值打分,公平公正!
- 【android开发】Android HAL模块实现
- 让剁手党洞察物体细节,“放大镜”当之无愧
- CSS3过渡,不再为JS动画而犯愁
- 【编程基础】c语言中获取整数和浮点数的符号位
- 前端特效开发 | JS实现聚光灯看图效果
- 【专业知识】Android主线程的消息系统(Handler\Looper)
- CSS3渐变,就是这么玩
- 前端特效开发 | 图片翻转的制作
- 【Windows编程】系列第四篇:使用Unicode编程
- CSS3蒙版 — 元旦快乐!
- 轮播图效果,不再局限于JS制作!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GWAS | 使用GEMMA进行全基因组关联分析
- 使用eggnog-mapper进行功能注释
- 离线环境下使用Conda安装软件
- 利用cutree划分pheatmap聚类结果
- 使用Mfuzz进行转录组表达模式聚类分析
- 使用PopLDdecay快速进行连锁不平衡分析
- 报错坑 | LDSC安装报错怎么解决?
- 看看斯坦福大学是如何教学生编程的
- 安全框架shiro入门示例
- maven导入jar包到本地仓库
- Python-matplotlib 空间栅格数据可视化
- 图解面试题:如何找到喜欢的电影?
- Java agent 与 byte buddy
- 关于TRTC云端混流的踩坑分享
- 聊聊dubbo-go的ConsistentHashLoadBalance