HDOJ 1166.敌兵布阵

2015-06-08

问题简述:

  原题的题意相当于有一些连续摆放的箱子,里面装着球,球的数量可以加减,现要查询几个连续的箱子里球的总数,其中存在放球和拿球的操作。

解题思路:

  查询区间和的问题,可以使用线段树。

  最初的输入相当于构建线段树的过程;每一次的加减相当于对线段树进行更新;最后使用线段树的查询区间和算法直接得出答案。

源代码:

 1 /*
 2 OJ: HDOJ
 3 ID: forever
 4 TASK: 1166.敌兵布阵
 5 LANG: C++
 6 NOTE: 线段树
 7 */
 8 #include <cstdio>
 9
10 const int MAX=200005;
11 int a[MAX];
12 char str[10];
13
14 void build(int l,int r,int flag) {
15     if(l==r) {
16         scanf("%d",&a[flag]);
17         return;
18     }
19     int m=(l+r)/2;
20     build(l,m,flag*2);
21     build(m+1,r,flag*2+1);
22     a[flag]=a[flag*2]+a[flag*2+1];
23 }
24
25 void update(int x,int y,int l,int r,int flag) {
26     if(l==r) {
27         a[flag]+=y;
28         return;
29     }
30     int m=(l+r)/2;
31     if(x<=m)
32         update(x,y,l,m,flag*2);
33     else
34         update(x,y,m+1,r,flag*2+1);
35     a[flag]=a[flag*2]+a[flag*2+1];
36 }
37
38 int query(int x,int y,int l,int r,int flag) {
39     if(x<=l&&r<=y)
40         return a[flag];
41     int m=(l+r)/2;
42     int ans=0;
43     if(x<=m)
44         ans+=query(x,y,l,m,flag*2);
45     if(y>m)
46         ans+=query(x,y,m+1,r,flag*2+1);
47     return ans;
48 }
49
50 int main()
51 {
52     int t,n,x,y,k=1;
53     scanf("%d",&t);
54     while(t--) {
55         scanf("%d",&n);
56         build(1,n,1);
57         printf("Case %d:\n",k++);
58         while(scanf("%s",str)&&str[0]!=‘E‘) {
59             scanf("%d %d",&x,&y);
60             if(str[0]==‘Q‘)
61                 printf("%d\n",query(x,y,1,n,1));
62             else if(str[0]==‘A‘)
63                 update(x,y,1,n,1);
64             else if(str[0]==‘S‘)
65                 update(x,-y,1,n,1);
66         }
67     }
68     return 0;
69 }
时间: 2024-08-14 23:24:05

HDOJ 1166.敌兵布阵的相关文章

线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵

题目传送门 1 /* 2 线段树基本功能:区间值的和,修改某个值 3 */ 4 #include <cstdio> 5 #include <cstring> 6 #define lson l, m, rt << 1 7 #define rson m+1, r, rt << 1|1 8 9 const int MAX_N = 50000 + 10; 10 int sum[MAX_N<<2]; 11 12 void pushup(int rt) //

hdoj 1166 敌兵布阵 (树状数组)

敌兵布阵 http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 51862    Accepted Submission(s): 21695 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek

hdoj 1166 敌兵布阵(树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 思路分析:该问题为动态连续和查询问题,使用数组数组可以解决:也可使用线段树解决该问题: 代码如下: #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX_N = 50000 + 10; int c[MAX_N]; inline int Lo

hdoj 1166 敌兵布阵(线段树and树状数组)

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

hdu 1166:敌兵布阵(树状数组,练习题)

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

hdu 1166 敌兵布阵 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query 的时候,需要计算出 某个区间的和. 树状数组第一题,算是模板吧 ^_^ 有个小细节,wa 了几次,细心~细心~~~细心 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <

hdu 1166 敌兵布阵 线段树 点更新

// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就可以了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 虽然十分简单,十分的水,继续加油 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits

HDU 1166 敌兵布阵 (线段树 &amp; 树状数组)

敌兵布阵 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u SubmitStatus 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的

HDU 1166 敌兵布阵 (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 59954    Accepted Submission(s): 25368 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子