nyoj 116
分析:单点插入,求区间和
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int NUM=1000010;
int a[NUM],N;
int lowbit(int t) //2^k
{
return t&(t^(t-1));
}
int sum(int t)
{
int num=0;
while(t>0)
{
num+=a[t];
t-=lowbit(t);
}
return num;
}
void add(int x,int y)//x~N
{
while(x<=N)
{
a[x]+=y;
x+=lowbit(x);
}
}
int main()
{
string str;
int i,x,y,M,temp;
scanf("%d%d",&N,&M);
memset(a,0,sizeof(0));
for(i=1;i<=N;i++)
{
scanf("%d",&temp);
add(i,temp);
}
while(M--)
{
cin>>str;
if(str=="QUERY")
{
scanf("%d%d",&x,&y);
printf("%d\n",sum(y)-sum(x-1));
}
else
{
scanf("%d%d",&x,&y);
add(x,y);
}
}
return 0;
}
情形二
nyoj 123
分析:区间插入,求单点和(即不是从1开始)
注意:sum(),add()在不同情况下:x>0和x<=N 是不同的
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int NUM=1000010;
int a[NUM],M;
int lowbit(int x)
{
return x&(x^(x-1));
}
int sum(int x)
{
int num=0;
while(x<=M)
{
num+=a[x];
x+=lowbit(x);
}
return num;
}
void add(int x,int temp)//1~x,线性插入
{
while(x>0)
{
a[x]+=temp;
x-=lowbit(x);
}
}
int main()
{
char str[10];
int t,x,y,temp,T;
scanf("%d%d",&T,&M);
memset(a,0,sizeof(0));
while(T--)
{
scanf("%s",str);
if(strcmp(str,"QUERY")==0)
{
scanf("%d",&t);//用cin超时
printf("%d\n",sum(t));
}
else
{
scanf("%d%d%d",&x,&y,&temp);
add(x-1,-temp);//1~x-1 -temp
add(y,temp);//1~y +temp
}
}
return 0;
}