hdu 1166 敌兵布阵

来源:互联网 发布:中国汽车历年进口数据 编辑:程序博客网 时间:2024/04/28 22:36

大意就不说了。中文题目。除非你是外星人。拉倒吧,你肯定不是

线段树的单点更新。query求的是一段内的SUM

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 50005using namespace std;int tree[MAXN<<2];void build(int num,int l,int r){    tree[num]=0;    if(l==r)return;    int mid=(l+r)>>1;    build(num<<1,l,mid);    build(num<<1|1,mid+1,r);}void insert(int num,int s,int e,int pos,int val){    int mid=(s+e)>>1;    if(s==e)    {        tree[num]+=val;        return;    }    if(pos<=mid)        insert(num<<1,s,mid,pos,val);    else        insert(num<<1|1,mid+1,e,pos,val);    tree[num]=tree[num<<1] + tree[num<<1|1];}int query(int num,int s,int e,int l,int r){    int mid=(s+e)>>1;    if(s==l && r==e)return tree[num];    if(r<=mid)        return query(num<<1,s,mid,l,r);    else    {        if(l>mid)        return query(num<<1|1,mid+1,e,l,r);        else        return query(num<<1,s,mid,l,mid) + query(num<<1|1,mid+1,e,mid+1,r);    }}int main(){    int T;    int CASE=1;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        build(1,1,n);        for(int i=1;i<=n;i++)        {            int t;            scanf("%d",&t);            insert(1,1,n,i,t);        }        char str[10];        printf("Case %d:\n",CASE++);        while(~scanf("%s",str))        {            if(str[0]=='E')break;            int a,b;            scanf("%d%d",&a,&b);            switch(str[0]){            case 'A':insert(1,1,n,a,b);break;            case 'S':insert(1,1,n,a,-b);break;            case 'Q':            {                printf("%d\n",query(1,1,n,a,b));                break;            }            }        }    }}

树状数组也来一发

#include <iostream>#include <cstdio>using namespace std;int n,C[50005],A[50005];inline int lowbit(int x){    return x&-x;}void SZinit(){    for(int i=1;i<=n;i++)    {        scanf("%d",&A[i]);        C[i]=0;    }    for(int i=1;i<=n;i++)    {        for(int j=i-lowbit(i)+1;j<=i;j++)        C[i]+=A[j];    }}int sum(int x){    int ret=0;    while(x>0)    {        ret+=C[x];        x-=lowbit(x);    }    return ret;}void add(int x,int d){    while(x<=n)    {        C[x]+=d;        x+=lowbit(x);    }}int main(){    int T;    scanf("%d",&T);    for(int cas=1;cas<=T;cas++)    {        scanf("%d",&n);        SZinit();        char op[20];        printf("Case %d:\n",cas);        while(scanf("%s",op)!=EOF)        {            if(op[0]=='E')break;            else if(op[0]=='Q')            {                int l,r;                scanf("%d%d",&l,&r);                printf("%d\n",sum(r)-sum(l-1));            }            else if(op[0]=='A')            {                int l,r;                scanf("%d%d",&l,&r);                add(l,r);            }            else if(op[0]=='S')            {                int l,r;                scanf("%d%d",&l,&r);                add(l,-r);            }        }    }    return 0;}


原创粉丝点击