标签:格式 全局 return query 速度 eof 一段 add string
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
//一直在纠结如何让全局变量c[MAX]经历过一次循坏后 置零 前前后后忙活了一个多小时 还是没想出去办法 学艺不精 忘记memset()函数的快速置零
//本题采用树状数组,是由NYOJ平台上士兵杀敌(二)演变的题型 基本思想不变 了解树状数组 位运算 以及 memset()函数的用法
//需要注意的是 格式化的输出 对于Case i:需要附加判断条件 i为第几组 需要注意
//AC 代码如下
/*树状数组*/
#include<stdio.h>
#include<string.h>
const int MAX=50010;
int N,a;
int c[MAX];
void p(int i,int a)
{
while(i<=N)
{
c[i]+=a;
i+=i&(-i);//位运算
}
}
void s(int i,int a)
{
while(i<=N)
{
c[i]-=a;
i+=i&(-i);
}
}
int get(int m)
{
int sum=0;
while(m>0)
{
sum+=c[m];
m-=m&(-m);
}
return sum;
}
int main()
{
int T;
int b=1;
scanf("%d",&T);
while(T--)
{
memset(c,0,sizeof(c));//快速置零 一直纠结如何才能够让c[MAX]经过一次循环 再次置零
//哎 学艺不精!!!
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d",&a);
p(i,a);
}
int x=0,i,j;
char ch[10];
while(scanf("%s",ch)!=EOF)
{
if(ch[0]==‘E‘)break;
scanf("%d %d",&i,&j);
if(ch[0]==‘Q‘)
{
x++;
if(x==1)
printf("Case %d:\n",b++);
printf("%d\n",get(j)-get(i-1));
}
if(ch[0]==‘A‘)p(i,j);
if(ch[0]==‘S‘)s(i,j);
}
}
return 0;
}
标签:格式 全局 return query 速度 eof 一段 add string
原文地址:http://www.cnblogs.com/hys1258414454/p/7347764.html