先前写过一个,今天对线段树有新理解——闭区间代替半开半闭区间
15ms的程序是怎么写的??
/*
* hdu-1166 敌兵布阵
* mike-w
* 2011-11-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 50505
#define TSIZE 10000000
typedef struct _tnode
{
int l,r,s;
}tnode;
int N,T;
tnode tree[TSIZE];
int build(int node,int l,int r)
{
tree[node].l=l;
tree[node].r=r;
tree[node].s=0;
if(l!=r)
{
int mid=(l+r)>>1;
build(2*node,l,mid);
build(2*node+1,mid+1,r);
}
return 0;
}
int add(int node,int id,int inc)
{
int mid=(tree[node].l+tree[node].r)>>1;
tree[node].s+=inc;
if(tree[node].l == tree[node].r) /* avoid INFINITE loop */
return 0;
if(id<=mid)
add(2*node,id,inc);
else if(id>mid)
add(2*node+1,id,inc);
return 0;
}
int query(int node,int l,int r)
{
if(tree[node].l==l && tree[node].r==r)
return tree[node].s;
int mid=(tree[node].l+tree[node].r)/2;
if(r<=mid)
return query(2*node,l,r);
else if(l>mid)
return query(2*node+1,l,r);
else
return query(2*node,l,mid)+query(2*node+1,mid+1,r);
}
int main(void)
{
int i,j,t1,t2;
char buf[10];
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
scanf("%d",&T);
for(i=1;i<=T;i++)
{
printf("Case %d:\n",i);
scanf("%d",&N);
build(1,1,N);
for(j=1;j<=N;j++)
{
scanf("%d",&t1);
add(1,j,t1);
}
while(scanf("%s",buf),strcmp("End",buf))
{
scanf("%d%d",&t1,&t2);
if(!strcmp("Add",buf))
add(1,t1,t2);
else if(!strcmp("Sub",buf))
add(1,t1,-t2);
else if(!strcmp("Query",buf))
printf("%d\n",query(1,t1,t2));
}
}
return 0;
}