树状数组:
找x的二进制末尾有几个0
inline int lowbit(int x){
return x&(-x);
}
加入数(减去数就是加入它的负数)
inline void add(int x,int v){
while(x<=n){
e[x]+=v;
x+=lowbit(x);
}
}
查询区间:
cout<<query(h)-query(g-1)<<endl;
inline int query(int x){
int ans=0;
while(x>=1){
ans+=e[x];
x-=lowbit(x);
}
return ans;
}
敌兵布阵:HDU:P1166
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int t,n,a,e[50010];
char ch[7];
inline int readin(){
int x=0,p=1;
char ch=getchar();
while(!(isdigit(ch))){
if (ch=='-') p=-1;
ch=getchar();
}
while((isdigit(ch))){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*p;
}
inline int lowbit (int x){
return x&(-x);
}
inline void add(int x,int v){
while (x<=n){
e[x]+=v;
x+=lowbit(x);
}
}
inline int query (int x){
int ans=0;
while(x>=1){
ans+=e[x];
x-=lowbit(x);
}
return ans;
}
int main(){
t=readin();
int m=t;
while (t--){
memset(e,0,sizeof(e));
cout<<"Case "<<m-t<<":"<<endl;
n=readin();
for (int i=1;i<=n;i++){
a=readin();
add(i,a);
}
cin>>ch;
while (ch[0]!='E'){
int g,h;
g=readin();
h=readin();
if (ch[0]=='A')
add(g,h);
if(ch[0]=='S')
add(g,-h);
if (ch[0]=='Q')
cout<<query(h)-query(g-1)<<endl;
cin>>ch;
}
}
return 0;
}