线段树 敌兵布阵

来源:互联网 发布:无法访问网络共享 编辑:程序博客网 时间:2024/05/07 11:40

题目链接

#include <stdio.h>#include <string.h>#define MAX 50005char str[6];typedef struct _node{    int left;    int right;    int count;}node;node no[MAX*3];int num[MAX], value, a, res;int n;//建树void insert(int l, int r, int i){    no[i].left = l, no[i].right = r;    if(l == r){        no[i].count = num[l];        return ;    }    int mid = (l+r)/2;    insert(l, mid, i*2);    insert(mid+1, r, i*2+1);    no[i].count = no[i*2].count + no[i*2+1].count;}//按要求修改树void modify(int l, int r, int i){    if(no[i].left == no[i].right){        no[i].count+=value;        return;    }    int mid = (no[i].left+no[i].right)/2;    if(a <= mid){        modify(l, r, i*2);    }    else {        modify(l, r, i*2+1);    }    no[i].count = no[i*2].count+no[i*2+1].count;}//查询void query(int start, int end, int i){    if(start==no[i].left&&end==no[i].right){        res += no[i].count;        return ;    }    int mid = (no[i].left+no[i].right)/2;    if(end <= mid){        query(start, end, i*2);    }    else if(start > mid){        query(start, end, i*2+1);    }    else{        query(start, mid, i*2);        query(mid+1, end, i*2+1);    }}int main(){//  freopen("input.txt","r", stdin);    int t,i,j;    scanf("%d", &t);    for(i = 1; i <= t; i ++){        printf("Case %d:\n", i);        scanf("%d", &n);//      scanf("%*c");        for(j = 1; j <= n; j ++){            scanf("%d", &num[j]);        }        insert(1, n, 1);        while(scanf("%s",str)&&strcmp(str, "End")!=0){            scanf("%d%d", &a, &value);//          scanf("%*c");            if(strcmp(str, "Add")==0){                modify(1, n, 1);            }            else if(strcmp(str, "Sub")==0){                value=-value;                modify(1, n, 1);            }            else{                res = 0;                query(a, value, 1);                printf("%d\n", res);            }        }    }    return 0;}


0 0