hdu-1166

来源:互联网 发布:用excel数据分析方法 编辑:程序博客网 时间:2024/05/17 08:25

这题让我树状数组和线段树都入门了!不错的题目。

树状数组

#include<iostream>#include<cstdio>#include<string>using namespace std;int c[50005],a[50005],N;int lowbit(int x){return x & (-x);}int sum(int n){int ans=0;while(n){ans+=c[n];n-=lowbit(n);}return ans;}void add(int n,int num){while(n<=N){c[n]+=num;n+=lowbit(n);}}int main(){int i,j,n;//freopen("d:\\test.txt","r",stdin);scanf("%d",&n);for(i=1;i<=n;++i){char s[10];int x,y,m;a[0]=0;//c[0]=0;scanf("%d",&N);for(j=1;j<=N;++j){scanf("%d",&x);a[j]=a[j-1]+x;c[j]=a[j]-a[j-lowbit(j)];}printf("Case %d:\n",i);while(scanf("%s",s) && s[0]!='E'){scanf("%d%d",&x,&y);if(s[0]=='Q')printf("%d\n",sum(y)-sum(x-1));else if(s[0]=='A')add(x,y);else add(x,-y);}}return 0;}

  线段树

#include<iostream>#include<cstdio>#include<string>using namespace std;#define maxn 50000int sum,a,b;struct node {    int l,r,sum;    int mid()    {        return (l+r)>>1;    }}tree[maxn*4];void btree(int l,int r,int p){    tree[p].l=l;    tree[p].r=r;    if(l==r)    {        scanf("%d",&tree[p].sum);        return ;    }    int m=tree[p].mid();    btree(l,m,p<<1);    btree(m+1,r,p<<1|1);    tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;}void query(int l,int r,int p){    if(a<=l && r<=b)    {        sum+=tree[p].sum;        return;    }    int m=tree[p].mid();    if(b<=m)        query(l,m,p<<1);    else if(a>m)        query(m+1,r,p<<1|1);    else    {        query(l,m,p<<1);        query(m+1,r,p<<1|1);    }}void update(int l,int r,int p){    if(l==r)    {        tree[p].sum+=b;        return;    }    int m=tree[p].mid();    if(a<=m)        update(l,m,p<<1);    else        update(m+1,r,p<<1|1);    tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;}int main(){    int t,n,cnt;    char s[10];    cnt=1;//freopen("d:\\test.txt","r",stdin);    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        btree(1,n,1);        printf("Case %d:\n",cnt++);        while(scanf("%s",s))        {            if(s[0]=='E')                break;            scanf("%d%d",&a,&b);            if(s[0]=='Q')            {                sum=0;                query(1,n,1);                printf("%d\n",sum);continue;            }            if(s[0]=='S')b=-b;            update(1,n,1);        }    }    return 0;}

  

原创粉丝点击