hdu1166

链接:点击打开链接

题意:第一行一个整数T,表示有T组数据.

每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50).

接下来每行有一条命令,命令有4种形式:

(1)Add(i,j) i和j为正整数,表示第i个营地增加j个(j不超过30)

(2)Sub(i,j) i和j为正整数,表示第i个营地减少j个人(j不超过30)

(3)Query(i,j),i和j为正整数,i<=j,表示询问第i到第j个营地的总人数

(4)End表示结束,这条命令在每组数据最后出现

对第i组数据,首先输出“Case i:”和回车,

对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
int node[150000];
void update(int pos,int l,int r,int id,int x){
    int mid;
    if(l==r){                            //建数和修改写到一起减少代码长度
        node[pos]+=x;
        return;
    }
    else{
        mid=(l+r)/2;
        if(id<=mid)
        update(2*pos,l,mid,id,x);
        else
        update(2*pos+1,mid+1,r,id,x);
    }
    node[pos]=node[2*pos]+node[2*pos+1];  //回溯时加上左区间和右区间的值
}
int question(int pos,int l,int r,int ll,int rr){
    int mid,sum=0;
    if(ll<=l&&rr>=r)return node[pos];
    else{
        mid=(l+r)/2;
        if(ll<=mid)sum+=question(2*pos,l,mid,ll,rr);
        if(rr>mid)sum+=question(2*pos+1,mid+1,r,ll,rr);
        return sum;
    }
}                                   //以上为线段树模板,因人而异,也可以写成结构体那种形式
int main(){
    int i,k,t,n,x,y;
    int a[50005];
    char str[100];
    scanf("%d",&t);
    for(k=1;k<=t;k++){
        memset(node,0,sizeof(node));
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            update(1,1,n,i,a[i]);
        }
        for(i=1;i<=100;i++)
        cout<<node[i]<<" ";
        cout<<endl;
        printf("Case %d:\n",k);
        while(1){
            cin>>str;
            if(strcmp(str,"End")==0)
            break;
            if(strcmp(str,"Add")==0){
            scanf("%d%d",&x,&y);
            update(1,1,n,x,y);
            }
            if(strcmp(str,"Sub")==0){
            scanf("%d%d",&x,&y);
            update(1,1,n,x,-y);
            }
            if(strcmp(str,"Query")==0){
            scanf("%d%d",&x,&y);
            printf("%d\n",question(1,1,n,x,y));
            }
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 15:30:18

hdu1166的相关文章

【线段树(单点修改,区间求和)】HDU1166 - 敌军布阵

hdu1166 敌兵布阵,单点修改,区间求和. [ATTENTION]MAXN要开成节点数的4倍,开得不够会提示TLE. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define lson l,m,root<<1 5 #define rson m+1,r,root<<1|1 6 using namespace std; 7 const int MAXN=50000*

hdu1166 单点更新

第一道线段树,对着学长给的板子敲,嘿嘿,纪念一下~~~ 代码: 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <string.h> 5 #include <cmath> 6 #include <cstdlib> 7 #include <algorithm> 8 9 using namespace std; 10 11 co

HDU1166 敌兵布阵 splay

题意:中文题. 解题思路:splay 解题代码: 1 // File Name: hdu1166.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月02日 星期四 18时21分48秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<s

Hdu1166单点更新线段树

入门线段树,单点更新.写了几遍,都是学着notonlysuccess写的. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list>

【线段树】hdu1166敌兵布阵

/* 水水的线段树点修改: ---------------------------------------------------------------- void build(int l,int r,int o)建树 { int mid = (l + r) / 2; a[o].left = l; a[o].right = r; a[o].num = 0; if(a[o].left == a[o].right)到达叶子节点 return ; build(l, mid, lc);向左走 buil

HDU1166敌兵布阵

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 43607    Accepted Submission(s): 18499 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

敌兵布阵 (HDU1166)

Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工 兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有

HDU1166 线段树(最基础题)

1.写法一: 1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 5 using namespace std; 6 7 int numv[50005<<2]; 8 int A[50005]; 9 10 void builtTree(int o,int l,int r){ 11 if(l==r) { 12 numv[o]=A[l]; 13 return ; 14 } 15 int

树状数组Hdu1166

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <cstdio> #include <cstdlib> #inclu

[shyのJAVA初探]hdu1166●树状数组

一开始shy是为了大数而走近java,随后情不自禁地就希望能初步了解java的语言特点. java初学对c++选手而言可谓简单非常.因为java的语法和c++的语法简直一样(虽然这话不太严谨,容易遭到很多反驳,不过,,shy实在是没有见过如此相像的两种语言).比如,①java开变量的方式是:int x;char c;boolean b;②java的for循环:for(int i=1;i<=n;i++){}③java的条件语句:if(--cas>0&&str!="end