HDU-1166 敌兵布阵

来源:互联网 发布:视频特效软件有哪些 编辑:程序博客网 时间:2024/06/03 02:26

题目链接:https://vjudge.net/problem/HDU-1166

线段树模板题

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<map>#include<set>#include<string>#include<stack>using namespace std;typedef long long ll;#define maxn 50000struct node{    int l, r, sum;    int mid(){        return (l+r)/2;    }};node Tree[maxn*4];int value[maxn+10];int flag;//初始化树,根节点是1void init_tree(int root, int l, int r){    Tree[root].l = l;    Tree[root].r = r;    if(l == r)        Tree[root].sum = value[l];    else{        init_tree(2*root, l, (l+r)/2);        init_tree(2*root+1, (l+r)/2 + 1, r);        Tree[root].sum = Tree[2*root].sum + Tree[2*root+1].sum;    }}//查找和int query_tree(int root, int l, int r){    int m = Tree[root].mid();    if(l == Tree[root].l && r == Tree[root].r)        return Tree[root].sum;    else{        if(l > m)            return query_tree(2*root+1, l, r);        else if(r <= m)            return query_tree(2*root, l, r);        else            return query_tree(2*root, l, m) + query_tree(2*root+1, m+1, r);    }}void update_tree(int root, int idx, int v){    if(Tree[root].l == Tree[root].r)        Tree[root].sum += flag*v;    else{        Tree[root].sum += flag*v;        if(idx <= Tree[root].mid())            update_tree(2*root, idx, v);        else            update_tree(2*root+1, idx, v);    }}int n;int main(){    //freopen("/home/zlwang/Desktop/t2.txt","r",stdin);    int T,kase=0;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)        scanf("%d",&value[i]);        init_tree(1,0,n-1);        printf("Case %d:\n",++kase);        char s[5];        int a,b;        while(~scanf("%s",s))        {            if(s[0]=='E') break;            scanf("%d%d",&a,&b);            if(s[0]=='Q')            {                printf("%d\n",query_tree(1,a-1,b-1));            }            else if(s[0]=='A')            {                flag=1;                update_tree(1,a-1,b);            }            else if(s[0]=='S')            {                flag=-1;                update_tree(1,a-1,b);            }        }    }    return 0;}


原创粉丝点击