您的位置:首页 > 其它

POJ3468 A Simple Problem with Integers

2016-05-02 18:04 323 查看

Description

给出了一个序列,你需要处理如下两种询问。

"C abc"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。

"Q ab" 询问[a, b]区间中所有值的和。

Input

第一行包含两个整数N, Q。1≤ N,Q ≤ 100000.

第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤1000000000)。

接下来Q行询问,格式如题目描述。

Output

对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。

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

 


依旧是线段树操作,注意数据范围用long long

//#include<bits/stdc++.h>//POJ不吃这条
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct NODE{
int l,r;
long long sum,t;
}node[1500000];
int data[500000];
int n,m;
void Build(int num,int left,int right){//以num为根建线段树
node[num].l=left;
node[num].r=right;
if(left==right){
node[num].sum=data[left];
return;
}
int mid=(left+right)/2;
Build(num*2,left,mid);
Build(num*2+1,mid+1,right);
node[num].sum=node[num*2].sum+node[num*2+1].sum;
return;
}

void update(int num){//标记下传
node[num<<1].t+=node[num].t;
node[num*2+1].t+=node[num].t;
node[num<<1].sum+=(node[num<<1].r-node[num<<1].l+1)*node[num].t;
node[num*2+1].sum+=(node[num*2+1].r-node[num*2+1].l+1)*node[num].t;
node[num].t=0;
return;
}
long long qu(int l,int r,int num){//求和
if(node[num].r<l || node[num].l>r)return 0;
if(node[num].l>=l && node[num].r<=r)return node[num].sum;
if(node[num].t)update(num);
return qu(l,r,num<<1)+qu(l,r,num*2+1);
}
void change(int l,int r,int c,int num){
if(node[num].r<l || node[num].l>r)return;
if(node[num].l>=l && node[num].r<=r){
node[num].sum+=c*(node[num].r-node[num].l+1);
node[num].t+=c;
return;
}
if(node[num].t)update(num);
change(l,r,c,num<<1);
change(l,r,c,num*2+1);
node[num].sum=node[num<<1].sum+node[num*2+1].sum;
return;
}
int main(){
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++)scanf("%d",&data[i]);
Build(1,1,n);
char s;
int a,b,c;
for(i=1;i<=m;i++)
{
cin>>s;
if(s=='C'){
scanf("%d%d%d",&a,&b,&c);
change(a,b,c,1);
}
if(s=='Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",qu(a,b,1));
}
}
return 0;
}

 


因为printf里忘了用lld而WA,纠结了半个多小时才意识到问题所在←又犯了这种蠢错误

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: