您的位置:首页 > 其它

poj 3468 A Simple Problem with Integers

2016-11-23 17:35 246 查看
A Simple Problem with Integers

Time Limit: 5000MS Memory Limit: 131072K

Total Submissions: 100482 Accepted: 31341

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.

【分析】

继续刷线段树….

区间增减+区间求和

现在是要用到懒标记这个东西了

【代码】

//poj 3468 A Simple Problem with Integers
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=100005;
struct node {int l,r;ll sum,lazy;} t[4*mxn];
ll n,m,T,L,R,k;
ll a[mxn];
char s[15];
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void build(int num,int l,int r)
{
t[num].l=l,t[num].r=r;
if(l==r)
{
t[num].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(num<<1,l,mid);
build((num<<1)+1,mid+1,r);
t[num].sum=t[num<<1].sum+t[(num<<1)+1].sum;
}
inline void pushdown(int num)
{
if(t[num].lazy==0) return;
t[num<<1].lazy+=t[num].lazy;
t[num<<1].sum+=(t[num<<1].r-t[num<<1].l+1)*t[num].lazy;
t[(num<<1)+1].lazy+=t[num].lazy;
t[(num<<1)+1].sum+=(t[(num<<1)+1].r-t[(num<<1)+1].l+1)*t[num].lazy;
t[num].lazy=0;
}
inline void add(int num)
{
if(L<=t[num].l && t[num].r<=R)
{
t[num].lazy+=k;
t[num].sum+=(t[num].r-t[num].l+1)*k;
return;
}
pushdown(num);
int mid=(t[num].l+t[num].r)>>1;
if(L<=mid) add(num<<1);
if(mid<R) add((num<<1)+1);
t[num].sum=(t[num<<1].sum+t[(num<<1)+1].sum);
}
inline ll query(int num)
{
ll ans=0;
if(L<=t[num].l && t[num].r<=R)
return t[num].sum;
pushdown(num);
int mid=(t[num].l+t[num].r)>>1;
if(L<=mid) ans+=query(num<<1);
if(mid<R) ans+=query((num<<1)+1);
return ans;
}
int main()
{
int i,j;
n=read(),m=read();
fo(i,1,n) a[i]=read();
build(1,1,n);
while(m--)
{
scanf("%s",s);
if(s[0]=='C')
{
L=read(),R=read(),k=read();
add(1);
}
else
{
L=read(),R=read();
printf("%lld\n",query(1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: