敌兵布阵

                                                                            Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Problem Description
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.
Input
第一行一个整数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 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
Sample Input
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Sample Output
Case 1: 6 33 59
题目比较简单,就涉及到线段树的一些基本操作,不再多说什么。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define lson l, mid, root<<1
#define rson mid+1, r, root<<1|1
const int N = 50000 + 20;
struct node
{int l, r, sum;
} a[N<<2];void PushUp(int root) //把当前节点的信息更新到父节点
{a[root].sum = a[root<<1].sum + a[root<<1|1].sum;
}void build_tree(int l, int r, int root)
{a[root].l = l;a[root].r = r;if(l == r){scanf("%d",&a[root].sum);return ;}int mid = (l + r) >> 1;build_tree(lson);build_tree(rson);PushUp(root);
}void update(int l, int r, int root, int k)
{if(l == a[root].l && r == a[root].r){a[root].sum += k;return ;}int mid = (a[root].l + a[root].r) >> 1;if(r <= mid) update(l, r, root<<1, k);else if(l > mid) update(l, r, root<<1|1, k);else{update(lson, k);update(rson, k);}PushUp(root);
}int Query(int l, int r, int root)
{if(l == a[root].l && r == a[root].r)return a[root].sum;int mid = (a[root].l + a[root].r) >> 1;int ans = 0;if(r <= mid) ans += Query(l, r, root<<1);else if(l > mid) ans += Query(l, r, root<<1|1);elseans += Query(lson) + Query(rson);return ans;
}int main()
{int T, n, l, r, cas = 0;string op;scanf("%d",&T);while(T--){scanf("%d",&n);build_tree(1, n, 1);printf("Case %d:\n", ++cas);while(cin >> op){if(op == "End")break;if(op == "Query"){scanf("%d%d",&l,&r);printf("%d\n", Query(l, r, 1));}else if(op == "Add"){scanf("%d%d",&l, &r);update(l, l, 1, r);}else if(op == "Sub"){scanf("%d%d",&l,&r);update(l, l, 1, -r);}}}return 0;
}

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)相关推荐

  1. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  2. hdu 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. HDU 1166 敌兵布阵【树状数组】

    用树状数组很简单,太晚了,贴下代码睡觉去... 另,研究线段树的时候,发现网上流传着有几种不同的线段树,最正宗的是以单位区间为单位,只能处理线段:另外还有几种叶子结点是点的,这种也可以用来处理点,所以 ...

  4. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  5. 题目敌兵布阵-------线段树(单点修改查询,区间修改查询)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  6. 树状数组板子题之一:hdu 1166 敌兵布阵

    树状数组板子题之一:hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手 ...

  7. hdu 1166 敌兵布阵(单点更新)

    hdu 1166 敌兵布阵(基本操作) 有三种操作:询问区间总和,增加某个兵营的兵的数目,减少某个兵营的兵的数目.实际上也只有两个. 在更新的时候,每到一个区间就把当前区间的sum增加对应的数目,到达 ...

  8. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)

    线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

最新文章

  1. c#_where关键字
  2. Intel Realsense pyrealsense2 points对象
  3. 初探ES6(1)...
  4. 数据结构开发(7):典型问题分析(Bugfix)
  5. dockfile应用(二)
  6. JQuery使用笔记
  7. 2021计算机应用基础形考答案模块2,国家开放大学计算机应用基础模块2形考答案-20210603091431.docx-原创力文档...
  8. xml getelementsbytagname php,用PHP编写和读取XML的几种方式
  9. OpenStack,真的要凉了?
  10. flask+uswgi+nginx+python3.6的venv发布网站ubuntu14.04
  11. ATE软件测试工程师,ATE软硬件测试开发工程师/高级工程师
  12. javascript中正则匹配多个条件, 常用正则匹配, 正则详解
  13. 《深入理解计算机系统(CSAPP)》—— 实验一 数据表示与运算实验
  14. python+opencv修改像素值、创建图像
  15. 合并在即:详解以太坊最新技术路线
  16. 假设检验的基本原理以及思想和方法
  17. 比湿,相对湿度和绝对湿度
  18. python批量爬取校花网图片
  19. 步进电机基础(2.6)-直线步进电机
  20. Ubuntu下校园网锐捷客户端的连接

热门文章

  1. 如何学习配置webpack(一)
  2. Java Socket编程如何建立两者关系
  3. 最近一月的娱乐生活:看电影,玩游戏
  4. 怎么取消任意Windows窗口总在最前
  5. master excel
  6. 我现在编程方面的特别大的问题
  7. C#中的Decimal类型
  8. 计算机类期刊的影响因子
  9. LeetCode 669. Trim a Binary Search Tree修剪二叉搜索树 (C++)
  10. 简单介绍Kubernetes