1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1166
前段时间,去北京参加蓝桥杯决赛了,额。。做的不是很好,好桑心。。。继续奋斗吧。
接下来要准备期末考试了,尽量能做到每天刷一道题。
废话不多说,来说说这道题。
这道题汉语题意就不多说了,树状数组和线段树都可以做(但是,线段树感觉时间和空间都要花费大点)
树状数组三个函数一打,就差不多出来了。
字符串比较可以不全部比较,因为 Query,Add,Sub,End首字母都没有重复的,所以只比较首字母就可以啦。
恩,这道题用了140MS,好膜拜那些31,15,甚至0MS的大神。
/*******************************************
********************************************
* Author:Tree *
* From : blog.csdn.net/lttree *
* Title : 敌兵布阵 *
* Source: hdu 1166 *
* Hint : 树状数组 *
********************************************
********************************************/
#include <stdio.h>
#include <string.h>
#define RANGE 50005
int c[RANGE],n;
// lowbit函数
int lowbit( int x )
{
return x&(-x);
}
// 求和函数
int sum(int i)
{
int s=0;
while( i>0 )
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
// 增加函数
void add( int i,int val )
{
while( i<=n )
{
c[i]+=val;
i+=lowbit(i);
}
}
int main()
{
// order数组用来读取命令
char order[10];
int T,T_num,i,val;
scanf("%d",&T);
for( T_num=1;T_num<=T;++T_num )
{
scanf("%d",&n);
memset(c,0,sizeof(c));
for( i=1;i<=n;++i )
{
scanf("%d",&val);
add(i,val);
}
printf("Case %d:\n",T_num);
int a,b;
scanf("%s",&order);
while( order[0]!='E' )
{
if( order[0]=='Q' )
{
scanf("%d%d",&a,&b);
printf("%d\n",sum(b)-sum(a-1) );
}
else if( order[0]=='S' )
{
scanf("%d%d",&a,&b);
add(a,-b);
}
else
{
scanf("%d%d",&a,&b);
add(a,b);
}
scanf("%s",&order);
}
}
return 0;
}
ACM-树状数组之敌兵布阵——hdu1166,布布扣,bubuko.com
原文地址:http://blog.csdn.net/lttree/article/details/28590759