hdu1166及树状数组模板

来源:互联网 发布:工业企业数据库 161 编辑:程序博客网 时间:2024/04/30 08:07

树状数组关键的两个函数如下,这两个函数掌握了,树状数组也就掌握了。具体原理各个大神都有了详细的解答,不加以累述,只提供一下模板

函数如下:

int sum(int i){int s=0;while (i>0){s+=num[i];i-=i & -i;}return s;}void update(int i,int x){while (i<=n){num[i]+=x;i+=i & -i;}}

AC代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#define rep(i,a,b)for (int i=a;i<=b;i++)using namespace std;int n,num[50050]={0};int sum(int i){int s=0;while (i>0){s+=num[i];i-=i & -i;}return s;}void update(int i,int x){while (i<=n){num[i]+=x;i+=i & -i;}}int main(){int T;scanf("%d",&T);rep(z,1,T){memset(num,0,sizeof num);scanf("%d",&n);rep(i,1,n){int x;scanf("%d",&x);update(i,x);}char s[100];printf("Case %d:\n",z);while (1){scanf("%s",s);if (s[0]=='E')break;if (s[0]=='Q'){int a,b;scanf("%d%d",&a,&b);printf("%d\n",sum(b)-sum(a-1));}if (s[0]=='A'){int a,x;scanf("%d%d",&a,&x);update(a,x);}if (s[0]=='S'){int a,x;scanf("%d%d",&a,&x);update(a,-x);}}}return 0;}

这题除了用树状数组来解之外,依旧可以用线段树解答,线段树相关代码如下:

#include<iostream>#include<cstdio>#include<cstring>#define rep(i,a,b)for (int i=a;i<=b;i++)using namespace std;struct P{int sum,l,r;}node[150050];int n,num[50050]={0};void build(int k,int l,int r){node[k].l=l,node[k].r=r;if (l==r)node[k].sum=num[l];else {build(2*k,l,(l+r)>>1);build(2*k+1,((l+r)>>1)+1,r);node[k].sum=node[2*k].sum+node[2*k+1].sum;}}void update(int k,int i,int x){if (node[k].l<=i&&node[k].r>=i)node[k].sum+=x;if (node[k].l==node[k].r)return ;if (i<=node[2*k].r)update(2*k,i,x);else update(2*k+1,i,x);}int query(int k,int l,int r){if (l==node[k].l&&r==node[k].r)return node[k].sum;if (r<=node[2*k].r)return query(2*k,l,r);if (l>=node[2*k+1].l)return query(2*k+1,l,r);else return query(2*k,l,node[2*k].r)+query(2*k+1,node[2*k+1].l,r);}int main(){int T;scanf("%d",&T);rep(z,1,T){memset(num,0,sizeof num);scanf("%d",&n);rep(i,1,n)scanf("%d",&num[i]);build(1,1,n);char s[100];printf("Case %d:\n",z);while (scanf("%s",s)){if (s[0]=='E')break;if (s[0]=='Q'){int a,b;scanf("%d%d",&a,&b);printf("%d\n",query(1,a,b));}if (s[0]=='A'){int a,x;scanf("%d%d",&a,&x);update(1,a,x);}if (s[0]=='S'){int a,x;scanf("%d%d",&a,&x);update(1,a,-x);}}}return 0;}


0 0
原创粉丝点击