HDU 1166 敌兵布阵
2011-06-01 20:10
316 查看
#include<stdio.h>
int N;
const int MAX=50010;
int numbers[MAX];
char s[7];
struct line
{
int left;
int right;
int maxNum;
};
line lines[MAX<<2];
void buildTree(int le,int ri,int root)
{
lines[root].left=le;
lines[root].right=ri;
if(le==ri)
{
lines[root].maxNum=numbers[le];
return ;
}
int mid=(le+ri)>>1;
buildTree(le,mid,root<<1);
buildTree(mid+1,ri,(root<<1)+1);
lines[root].maxNum=lines[root<<1].maxNum+lines[(root<<1)+1].maxNum;
}
int query(int le,int ri,int root)
{
if(lines[root].left==le&&lines[root].right==ri)
{
return lines[root].maxNum;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(ri<=mid)
{
return query(le,ri,root<<1);
}else
if(mid+1<=le)
{
return query(le,ri,(root<<1)+1);
}else
{
return query(le,mid,root<<1)+query(mid+1,ri,(root<<1)+1);
}
}
void modify(int id,int root,int data)
{
if(lines[root].left==id&&lines[root].right==id)
{
lines[root].maxNum+=data;
return ;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(id<=mid)
{
modify(id,root<<1,data);
}else
{
modify(id,(root<<1)+1,data);
}
lines[root].maxNum=lines[root<<1].maxNum+lines[root*2+1].maxNum;
}
int main()
{
int cases=0;
int T;
scanf("%d",&T);
while(T--)
{
cases++;
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
scanf("%d",&numbers[i]);
}
buildTree(1,N,1);
printf("Case %d:\n",cases);
while(scanf("%s",s))
{
if(s[0]=='E')
{
break;
}
int a,b;
scanf("%d%d",&a,&b);
if(s[0]=='A')
{
modify(a,1,b);
continue;
}
if(s[0]=='S')
{
modify(a,1,-b);
continue;
}
else
printf("%d\n",query(a,b,1));
}
}
return 0;
}
int N;
const int MAX=50010;
int numbers[MAX];
char s[7];
struct line
{
int left;
int right;
int maxNum;
};
line lines[MAX<<2];
void buildTree(int le,int ri,int root)
{
lines[root].left=le;
lines[root].right=ri;
if(le==ri)
{
lines[root].maxNum=numbers[le];
return ;
}
int mid=(le+ri)>>1;
buildTree(le,mid,root<<1);
buildTree(mid+1,ri,(root<<1)+1);
lines[root].maxNum=lines[root<<1].maxNum+lines[(root<<1)+1].maxNum;
}
int query(int le,int ri,int root)
{
if(lines[root].left==le&&lines[root].right==ri)
{
return lines[root].maxNum;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(ri<=mid)
{
return query(le,ri,root<<1);
}else
if(mid+1<=le)
{
return query(le,ri,(root<<1)+1);
}else
{
return query(le,mid,root<<1)+query(mid+1,ri,(root<<1)+1);
}
}
void modify(int id,int root,int data)
{
if(lines[root].left==id&&lines[root].right==id)
{
lines[root].maxNum+=data;
return ;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(id<=mid)
{
modify(id,root<<1,data);
}else
{
modify(id,(root<<1)+1,data);
}
lines[root].maxNum=lines[root<<1].maxNum+lines[root*2+1].maxNum;
}
int main()
{
int cases=0;
int T;
scanf("%d",&T);
while(T--)
{
cases++;
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
scanf("%d",&numbers[i]);
}
buildTree(1,N,1);
printf("Case %d:\n",cases);
while(scanf("%s",s))
{
if(s[0]=='E')
{
break;
}
int a,b;
scanf("%d%d",&a,&b);
if(s[0]=='A')
{
modify(a,1,b);
continue;
}
if(s[0]=='S')
{
modify(a,1,-b);
continue;
}
else
printf("%d\n",query(a,b,1));
}
}
return 0;
}
相关文章推荐
- hdu 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵(线段树模板)
- HDU 1166 敌兵布阵(树状数组)
- hdu 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵
- HDU-1166 敌兵布阵【简单线段树-单点更新+区间查询】
- HDU1166 敌兵布阵(树状数组)
- hdu-1166 敌兵布阵(树状数组水题)
- HDU 1166 敌兵布阵(线段树单点更新)
- HDU 1166 敌兵布阵 线段树
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
- 树状数组-HDU-1166-敌兵布阵
- HDU-1166 敌兵布阵 ( 线段树 )
- HDU 1166 敌兵布阵(树状数组)
- HDU 1166 敌兵布阵(线段树:单点add,区间求和)
- 敌兵布阵 【hdu-1166】【树状数组】
- [HDU - 1166] 敌兵布阵(树状数组)
- [线段树] HDU 1166 - 敌兵布阵