nyoj1115-士兵杀敌(二)(线段树单点更新,区间求和)

来源:互联网 发布:网络平台服务协议 编辑:程序博客网 时间:2024/06/04 20:03

题目来源:http://acm.nyist.me/OJ/pid=1115

题意

中文题意,。

思路

学完了数据结构的树这一节,对区间这种问题有了一定的了解,自己手打。。。这应该算是模板。。。

代码

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=1000000;int tree[maxn<<2];int n,q,rt;void build(int l,int r,int rt){    if(l==r)    {        scanf("%d",&tree[rt]);    }    else    {        int m=(l+r)/2;        build(l,m,rt<<1);        build(m+1,r,(rt<<1)+1);        tree[rt]+=tree[rt<<1]+tree[(rt<<1)+1];    }}void update(int l,int r,int x,int y,int rt){    if(l==r&&r==x)    {        tree[rt]+=y;        return ;    }    int m=(l+r)/2;    if(m>=x)    {        update(l,m,x,y,rt<<1);    }    else    {        update(m+1,r,x,y,(rt<<1)+1);    }    tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];}int query(int l,int r,int L,int R,int rt){    if(l<=L&&R<=r) return tree[rt];    int m=(L+R)/2;    int ret=0;    if(m>=l)        ret+=query(l,r,L,m,rt<<1);    if(m+1<=r)        ret+=query(l,r,m+1,R,(rt<<1)+1);    return ret;}int main(){    int n,q;    scanf("%d%d",&n,&q);    build(1,n,1);//    for(int i=1;i<=9;i++)//    printf("tree[%d]=%d ",i,tree[i]);//    printf("\n");    while(q--)    {        char s[10];        int x,y;        scanf("%s",s);        scanf("%d%d",&x,&y);        if(s[0]=='Q')        {            printf("%d\n",query(x,y,1,n,1));        }        else        {            update(1,n,x,y,1);        }    }}
阅读全文
0 0