敌兵布阵 树状数组

    xiaoxiao2021-03-25  98

    这是个区间求和的代码

    #include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; int N; int a[50010],b[50010]; int lowbit(int k) { return k&(-k); } void add(int k,int num) { while(k<=N) { a[k]+=num; k+=lowbit(k); } } void sub(int k,int num) { while(k<=N) { a[k]-=num; k+=lowbit(k); } } int read(int k) //求从1到K的和 { int sum=0; while(k>0) { sum+=a[k]; k-=lowbit(k); } return sum; } int main() { int T,i,j,re=1; cin>>T; char ch[6]; while(T--) { printf("Case %d:\n",re++); memset(a,0,sizeof(a)); cin>>N; for(i=1;i<=N;i++) { int temp; cin>>temp; add(i,temp); } while(cin>>ch) { if(strcmp(ch,"End")==0) break; if(strcmp(ch,"Add")==0) { int a,b; scanf("%d %d",&a,&b); add(a,b); } else if(strcmp(ch,"Sub")==0) { int a,b; scanf("%d %d",&a,&b); sub(a,b); } else { int a,b; scanf("%d %d",&a,&b); cout<<read(b)-read(a-1)<<endl; } } } } 下面这个是求区间最值的代码,不对不对,树状数组似乎不适合求区间最值。

    转载请注明原文地址: https://ju.6miu.com/read-40144.html

    最新回复(0)