HDU 1166 敌兵布阵(线段树基础)

来源:互联网 发布:知乎 全友家居 编辑:程序博客网 时间:2024/05/16 05:18

中文体面...考察线段树基本操作单点更新,区间查询...因为手边没有以前用的模板,然后就自己写了一个,估计写的比较挫....

PS:并差集和剩下的最短路四道题好难的样子...然后就来到了线段树...

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;struct node{    int l,r,x;} data[300000];void build(int l,int r,int k){    data[k].l=l;    data[k].r=r;    if(l==r)    {        int x;        scanf("%d",&x);        data[k].x=x;        return ;    }    int mid=(l+r)>>1;    build(l,mid,k*2);    build(mid+1,r,k*2+1);    data[k].x=data[k*2].x+data[k*2+1].x;}void add(int c,int k,int x){    if(data[k].l==c&&data[k].l==data[k].r)    {        data[k].x+=x;        return ;    }    if(c<data[k].l||c>data[k].r)        return ;    add(c,k*2,x);    add(c,k*2+1,x);    data[k].x=data[k*2].x+data[k*2+1].x;}int query(int l,int r,int k){    if(data[k].l==l&&data[k].r==r)        return data[k].x;    if(data[k].l>r||data[k].r<l)        return 0;    int mid=(data[k].r+data[k].l)>>1;    if(r<=mid)        return query(l,r,k*2);    else if(l>=mid+1)        return query(l,r,k*2+1);    else        return query(l,mid,k*2)+query(mid+1,r,k*2+1);}int main(){    int T,n;    scanf("%d",&T);    for(int cas=1; cas<=T; cas++)    {        scanf("%d",&n);        build(1,n,1);        char s[300];        printf("Case %d:\n",cas);        while(scanf("%s",s),s[0]!='E')        {            int x,y;            scanf("%d %d",&x,&y);            if(s[0]=='A')                add(x,1,y);            else if(s[0]=='S')                add(x,1,-y);            else if(s[0]=='Q')                printf("%d\n",query(x,y,1));        }    }    return 0;}


0 0
原创粉丝点击