您的位置:首页 > 其它

2017-07-14:树状数组(多组数据要先清空)

2017-07-14 09:57 302 查看
树状数组:

找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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: