敌兵布阵

题目链接

大意:给你一个数列,和三个操作,

Query操作为查询从i到j之间的数的和
Add操作为第i个数加j
Sub操作为第i个数减j

要求每次Query操作你给他一个正确的回答

大概思路

直接线段树,区间维护的为当前区间的总和,

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>using namespace std;int n;
int arr[100020];
int sum[100020];void build(int l, int r, int pos)
{if(l == r)  //不是区间也就是最下面的单个数的时候{sum[pos] = arr[l];return;}int m = (l + r)/2;build(l, m, pos*2); //维护左区间build(m+1, r, pos*2+1); //右区间sum[pos] = sum[pos*2] + sum[pos*2+1];  //二叉树转换成线性关系,双亲对应的左右子树return;
}void add(int i, int j, int l, int r, int pos)
{if(i >= l && i <= r) // 如果要改变的i在当前区间,就加j{sum[pos] += j;}if(l == r) return; // 到最后returnint m = (l+r) / 2;if(i <= m) add(i, j, l, m, pos*2);if(i >= m+1) add(i, j, m+1, r, pos*2+1);
}void sub(int i, int j, int l, int r, int pos)
{if(i >= l && i <= r){sum[pos] -= j;}if(l == r) return;int m = (l+r) / 2;if(i <= m) sub(i, j, l, m, pos*2);if(i >= m+1) sub(i, j, m+1, r, pos*2+1);
}int query(int i, int j, int l, int r, int pos)
{if(i <= l && j >= r){return sum[pos];}int ans = 0;int m = (l + r) / 2;if(i <= m) ans += query(i, j, l, m, pos*2);if(j > m) ans += query(i, j, m+1, r, pos*2+1);return ans;
}int main()
{int skip = 0;int t;cin >> t;while(t--){memset(arr, 0, sizeof arr);  //初始化memset(sum, 0, sizeof sum);printf("Case %d:\n", ++skip); scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", &arr[i]); //储存数列}build(1, n, 1); //构建线段树string a;while(cin >> a && a != "End"){int x, y;if(a == "Query"){scanf("%d%d", &x, &y);printf("%d\n", query(x, y, 1, n, 1));}else if(a == "Add"){scanf("%d%d", &x, &y);add(x, y, 1, n, 1);}else {scanf("%d%d", &x, &y);sub(x, y, 1, n, 1);}}}return 0;
}

HDU 1166 线段树相关推荐

  1. HDU 1166(线段树)

    线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...

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

    线段树模板题: 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<c ...

  3. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  4. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  5. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  6. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  7. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

  8. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  9. HDU 5238 线段树+数论

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...

最新文章

  1. Centos6.3修改源码遇到无法yum安装的问题
  2. C#读写xml文件最简单方法(操作配置文件)
  3. 功能性农业投融资-农业大健康·周荣江:国情讲坛体制创新
  4. printf格式化字符串用法
  5. 又整理了一批可以拿去做副业的开源项目...
  6. Java开发童年小游戏
  7. 物联网之NB-IoT技术实践开发二
  8. 数据库基本语句和关键字详解
  9. 三国时代微博(佩服博主琢磨先生太有才了!)
  10. 数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具
  11. Android 10 SystemUI 如何添加4G信号和WiFi图标
  12. hdu 2977 Color Squares
  13. 更正:复旦大学工研院计算机学硕不是第一年招生
  14. 百度前CTO刘建国任搜索网站爱帮网CEO
  15. Arch 中 fcitx5 提示拼音不可用的解决过程
  16. 美国知乎热议: 关于CS专业, 有哪些你不知道的内幕
  17. html中border边框线上添加文字
  18. DBCP连接池中BasicDataSource类的基本使用
  19. ubuntu 更换主题
  20. 青春是黄鹤·《致我们终将逝去的青春》

热门文章

  1. Python框架——最详细的Django框架入门
  2. android 高德地图卡顿,【报Bug】快速反复缩放地图会卡死(plus.maps)
  3. 图像处理—数据集的构建
  4. ubuntu16.04安装libiconv
  5. 芯科EFRBG22C112 empty工程创建
  6. 不安装Oracle使用plsqldev工具
  7. 关于实施DevOps持续集成的整理
  8. java val变量声明_Kotlin中变量不同于Java: var 对val(KAD 02)
  9. 简单在线编辑器的使用
  10. 在Windows10操作系统下安装Ubuntu20.04 LTS,实现双系统