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; }