HDU-1166 树状数组,zkw线段树

版权声明:本文为博主原创文章,若需要引用、转载,只需注明来源及原文链接,若有错误,欢迎纠正。 https://blog.csdn.net/u014137295/article/details/87479504

Input
第一行一个整数T,表示有T组数据。
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。

Sample Input
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
Sample Output
Case 1:
6
33
59
树状数组:

#include<bits/stdc++.h>
#define maxn 50005
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
int bit[maxn],a[maxn],n;
int lowbit(int x){return x&(-x);}
void add(int x,int i){while(i<=n)bit[i]+=x,i+=lowbit(i);}
void sub(int x,int i){while(i<=n)bit[i]-=x,i+=lowbit(i);}
int sum(int i){
    int s=0;
    while(i>0)s+=bit[i],i-=lowbit(i);
    return s;
}
int main(){
    int t=read();
    for(int i=1;i<=t;++i){
        memset(bit,0,sizeof(bit));
        n=read();
        for(int j=1;j<=n;++j)a[j]=read(),add(a[j],j);
        printf("Case %d:\n",i);
        string str;
        while(cin>>str){
            if(str[0]=='Q'){
                int l=read(),r=read();
                printf("%d\n",sum(r)-sum(l-1));
            }
            else if(str[0]=='A') add(read(),read());
            else if(str[0]=='S') sub(read(),read());
            else break;
        }
    }
    return 0;
}

zkw线段树:

#include<bits/stdc++.h>
#define maxn 50005
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
int T[maxn<<2],m,n;
void build(){
	for(m=1;m<=n+1;m<<=1);
	for(int i=1;i<=n;++i) T[i+m]=read();
	for(int i=m-1;i;--i)  T[i]=T[i<<1]+T[i<<1|1];
}
void updata(int x,int val){
	T[x+=m]+=val;
	for(x>>=1;x>=1;x>>=1) T[x]=T[x<<1]+T[x<<1|1];
}
int query(int l,int r){
	int ans=0;
	for(l=l+m-1,r=r+m+1;l^r^1;l>>=1,r>>=1){
		if(~l&1)ans+=T[l^1];
		if(r&1) ans+=T[r^1];
	}
	return ans;
}
int main(){
	int t=read();
	for(int i=1;i<=t;++i){
		memset(T,0,sizeof(T));
		n=read();
		build();
		printf("Case %d:\n",i);
		string str;
		while(cin>>str&&str[0]!='E'){
			int a=read(),b=read();
			if(str[0]=='Q')printf("%d\n",query(a,b));
			else if(str[0]=='A') updata(a,b);
			else if(str[0]=='S') updata(a,-b);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u014137295/article/details/87479504
今日推荐