md 一个 线段树 写了一天!! 用结构体写的 超超时 !
超时代码
#include
#include
#include
#include
using namespace std;
#define maxn 50000+10000
struct node{
int l,r;
int sum;
}tre[maxn*5];
int a[maxn];
void build(int in,int l,int r){
tre[in]
.l=l;
tre[in].r=r;
if(l==r){
tre[in].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(in<<1,l,mid);
build(in<<1|1,mid+1,r);
tre[in].sum=tre[in<<1].sum+tre[in<<1|1].sum;
}
void updata(int in,int va,int l){
tre[l].sum+=va;
if(tre[l].l==in&&tre[l].r==in) return ;
int mid=(tre[l].l+tre[l].r)>>1;
if(in<=mid){
updata(in,va,l<<1);
}
else updata(in,va,l<<1|1);
}
int query(int l,int r,int in){
if(tre[in].l>=l&&tre[in].r<=r){
return tre[in].sum;
}
int mid=(tre[in].l+tre[in].r)>>1;
if(r<=mid){
return query(l,r,in<<1);
}
else if(l>mid){
return query(l,r,in<<1|1);
}
else return query(l,mid,in<<1)+query(mid+1,r,in<<1|1);
}
int main(){
int t;
scanf("%d",&t);
int num=1;
while(t--){
int n;
printf("Case %d:\n",num);
num++;
scanf("%d",&n);
for(int j=1;j<=n;j++){
scanf("%d",a+j);
}
build(1,1,n);
char b[10];
while(scanf("%s",b)){
if(b[0]=='E') break;
int x,y;
scanf("%d%d",&x,&y);
if(b[0]=='Q'){
int s=query(x,y,1);
printf("%d\n",s);
}
else if(b[0]=='A'){
updata(x,y,1);
}
else if(b[0]=='S'){
updata(x,-y,1);
}
}
}
}
ac代码
#include
#include
#include
#include
using namespace std;
#define maxn 50000+10000
int a[maxn];
int b[maxn*5];
void build(int in,int l,int r){
if(l==r){
b[in]=a[l];
return ;
}
int mid=(l+r)/2;
build(in*2,l,mid);
build(in*2+1,mid+1,r);
b[in]=b[in*2]+b[in*2+1];
}
void updata(int in,int va,int l,int r,int rt){
b[rt]+=va;
if(l==r) return ;
int mid=(l+r)/2;
if(in>mid){
updata(in,va,mid+1,r,rt*2+1);
}
else updata(in,va,l,mid,rt*2);
}
int query(int x,int y,int l,int r,int in){
if(x==l&&y==r){
return b[in];
}
int mid=(l+r)/2;
if(y<=mid){
return query(x,y,l,mid,in*2);
}
else if(x>mid){
return query(x,y,mid+1,r,in*2+1);
}
else return query(mid+1,y,mid+1,r,in*2+1)+query(x,mid,l,mid,in*2);
}
int main(){
int t,num=1;
scanf("%d",&t);
while(t--){
int n;
printf("Case %d:\n",num++);
scanf("%d",&n);
for(int j=1;j<=n;j++){
scanf("%d",a+j);
}
build(1,1,n);
string s;
while(cin>>s&&s!="End"){
int x,y;
scanf("%d%d",&x,&y);
if(s=="Query"){
printf("%d\n",query(x,y,1,n,1));
}
else if(s=="Add"){
updata(x,y,1,n,1);
}
else {
updata(x,-y,1,n,1);
}
}
}
return 0;
}