51Nod 1081 子段求和(数组/树状数组)

来源:互联网 发布:triz 矛盾矩阵 编辑:程序博客网 时间:2024/05/17 04:11

题目链接

数组:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<vector>using namespace std;long long t[50001]={0};int n;void add(int x,long long v){while(x<=n){t[x]+=v;x+=x&-x;}}long long sum(int x){long long sum=0;while(x){sum+=t[x];x-=x&-x;}return sum;}int main(){cin>>n;for(int i=1;i<=n;i++){long long num;cin>>num;t[i]=t[i-1]+num;} int m;cin>>m;for(int i=0;i<m;i++){int a,b;cin>>a>>b;cout<<t[a+b-1]-t[a-1]<<endl; }return 0;}

树状数组:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<vector>using namespace std;long long t[50001]={0};int n;void add(int x,long long v){while(x<=n){t[x]+=v;x+=x&-x;}}long long sum(int x){long long sum=0;while(x){sum+=t[x];x-=x&-x;}return sum;}int main(){cin>>n;for(int i=1;i<=n;i++){long long num;cin>>num;add(i,num);} int m;cin>>m;for(int i=0;i<m;i++){int a,b;cin>>a>>b;cout<<sum(a+b-1)-sum(a-1)<<endl; }return 0;}


原创粉丝点击