标签:des style http color os 使用 io strong ar
题目:
|
Language:
A 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. 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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#define eps 1e-9
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100000+10;
ll col[maxn*4];
ll tree[maxn*4];
int n,m;
void push_up(int dex)
{
tree[dex]=tree[dex<<1]+tree[dex<<1|1];
}
void push_down(int cnt,int dex)
{
if(col[dex])
{
col[dex<<1]+=col[dex];//这里要累积起来
col[dex<<1|1]+=col[dex];
tree[dex<<1]+=(cnt-(cnt>>1))*col[dex];
tree[dex<<1|1]+=(cnt>>1)*col[dex];
col[dex]=0;
}
}
void buildtree(int l,int r,int dex)
{
col[dex]=0;
if(l==r)
{
scanf("%I64d",&tree[dex]);
return;
}
int mid=(l+r)/2;
buildtree(l,mid,dex<<1);
buildtree(mid+1,r,dex<<1|1);
push_up(dex);
}
void update(int L,int R,int l,int r,int dex,long long val)
{
if(L<=l&&R>=r)
{
tree[dex]+=(r-l+1)*val;
col[dex]+=val;
return;
}
push_down(r-l+1,dex);
int mid=(l+r)/2;
if(L<=mid) update(L,R,l,mid,dex<<1,val);
if(R>mid) update(L,R,mid+1,r,dex<<1|1,val);
push_up(dex);
}
long long Query(int L,int R,int l,int r,int dex)
{
if(L<=l&&R>=r)
return tree[dex];
push_down(r-l+1,dex);
int mid=(l+r)/2;
if(R<=mid) return Query(L,R,l,mid,dex<<1);
else if(L>mid) return Query(L,R,mid+1,r,dex<<1|1);
else return Query(L,R,l,mid,dex<<1)+Query(L,R,mid+1,r,dex<<1|1);
}
int main()
{
char str[2];
int u,v;
long long w;
while(~scanf("%d%d",&n,&m))
{
buildtree(1,n,1);
while(m--)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%d%d",&u,&v);
printf("%I64d\n",Query(u,v,1,n,1));
}
else
{
scanf("%d%d%I64d",&u,&v,&w);
update(u,v,1,n,1,w);
}
}
}
return 0;
}
|
|||||||||
poj3468A Simple Problem with Integers(线段树+成段更新)
标签:des style http color os 使用 io strong ar
原文地址:http://blog.csdn.net/u014303647/article/details/38947559