poj 3468A 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
Hint
#include<stdio.h>
#include<string.h>
#define maxn 100005
#define ll long long
char str[10];
ll a[maxn];
struct node
{
ll l,r,sum,ans;
}b[4*maxn];
void build(ll l,ll r,ll i)
{
ll mid;
b[i].l=l;
b[i].r=r;
b[i].ans=0;
if(b[i].l==b[i].r)
{
b[i].sum=a[l];
return;
}
mid=(l+r)/2;
build(l,mid,2*i);
build(mid+1,r,i*2+1);
b[i].sum=b[i*2].sum+b[i*2+1].sum;
}
void pushdown(int i)
{
if(b[i].ans){
b[i*2].ans+=b[i].ans;
b[i*2+1].ans+=b[i].ans;
b[i*2].sum+=b[i].ans*(b[i*2].r-b[i*2].l+1);
b[i*2+1].sum+=b[i].ans*(b[i*2+1].r-b[i*2+1].l+1);
b[i].ans=0;
}
}
void add(ll l,ll r,ll value,ll i)
{
ll mid;
if(b[i].l==l && b[i].r==r)
{
b[i].ans=b[i].ans+value;
b[i].sum+=(b[i].r-b[i].l+1)*value;
return;
}
pushdown(i);
b[i].sum+=(r-l+1)*value; //这一句写了,下面第二句就不用写了,是同一个意思
mid=(b[i].l+b[i].r)/2;
if(l>mid)
add(l,r,value,i*2+1);
else if(r<=mid)
add(l,r,value,i*2);
else
{
add(l,mid,value,i*2);
add(mid+1,r,value,i*2+1);
}
//b[i].sum=b[i*2].sum+b[i*2+1].sum; ---2
}
ll question(ll l,ll r,ll i)
{
ll mid;
if(b[i].l==l && b[i].r==r)
{
return b[i].sum;
}
pushdown(i);
mid=(b[i].l+b[i].r)/2;
if(l>mid)
return question(l,r,i*2+1);
else if(r<=mid)
return question(l,r,i*2);
else if(l<=mid && r>mid)
return question(l,mid,i*2)+question(mid+1,r,i*2+1);
}
int main()
{
ll n,m,c,d,e,i,j;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
while(m--)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%lld%lld",&c,&d);
printf("%lld\n",question(c,d,1));
}
else if(str[0]=='C')
{
scanf("%lld%lld%lld",&c,&d,&e);
add(c,d,e,1);
}
}
}
return 0;
}
poj 3468A Simple Problem with Integers的更多相关文章
- Poj 3468-A Simple Problem with Integers 线段树,树状数组
题目:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- POJ 3468A Simple Problem with Integers(线段树区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 112228 ...
- POJ - 3468A Simple Problem with Integers (线段树区间更新,区间查询和)
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...
- POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 105742 ...
- 3468-A Simple Problem with Integers 线段树(区间增减,区间求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 110077 ...
- POJ A Simple Problem with Integers | 线段树基础练习
#include<cstdio> #include<algorithm> #include<cstring> typedef long long ll; #defi ...
- POJ 3468_A Simple Problem with Integers(树状数组)
完全不知道该怎么用,看书稍微懂了点. 题意: 给定序列及操作,求区间和. 分析: 树状数组可以高效的求出连续一段元素之和或更新单个元素的值.但是无法高效的给某一个区间的所有元素同时加个值. 不能直接用 ...
- POJ 3468_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: 58269 ...
随机推荐
- 借助Docker搭建JMeter+Grafana+Influxdb监控平台
我们都知道Jmeter提供了原生的结果查看,既然有原生的查看结果,为什么还要多此一举使用其他工具进行查看呢,除了查看内容丰富外还有最主要的原因:Jmeter提供的查看结果插件本身是比较消耗性能的,所以 ...
- Python基础语法3-输入、输出语句
- 简要MR与Spark在Shuffle区别
一.区别 ①本质上相同,都是把Map端数据分类处理后交由Reduce的过程. ②数据流有所区别,MR按map, spill, merge, shuffle, sort, r educe等各阶段逐一实现 ...
- 【Jboss】一台服务器上如何部署多个jboss
一台服务器上如何部署多个jboss呢?直接把整个部署环境copy一份到相应的目录下? 这样只是前提,但是启动复制后的jboss就会发现,有很多端口被占用 3873,8080,8009,8443,808 ...
- 网件wndr4300 ttl连接
路由成砖而还能进入cfe或uboot等情况下,可以通过ttl快速救砖. r4300主板有TTL的接线脚,脚的顺序可以找在OpenWrt的wiki上找到. 如下图4个TTL针在左下角,从下往上分别是GN ...
- 1 分钟上手,在容器中运行 Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers 这个插件允许我们在容器中运 ...
- kernel升级模式RKS让人振奋
前几天刚将我的ERP内核从701_rel 升级到721_ext_rel,看到721的说明了讲到,对于这次的更新,支持RKS(Rolling Kernel Switch)了,简单的讲,就是以后对于内核的 ...
- 1.2V升压到3V和3.3V的升压芯片
1.2V镍氢电池升压到3V和3.3V输出,1.2V升压3V,1.2V升压3.3V稳压输出供电的芯片. PW5100 是一款低静态电流.达效率. PFM 模式控制的同步升压变换器. PW5100 所需的 ...
- 不用git 手动对比文件差异
使用python脚本比较两个文件的差异内容并输出到html文档中,可以通过浏览器打开查看. 一.脚本使用 对比文件的差异 python python_diff_file.py -f1 web26.co ...
- MongoDB 总结
目录 1. 逻辑结构 2. 安装部署 2.1 系统准备 2.2 mongodb安装 2.2.1 创建所需用户和组 2.2.2 创建mongodb所需目录结构 2.2.3 上传并解压软件到指定位置 2. ...