HDU 1166 线段树
敌兵布阵
题目链接
大意:给你一个数列,和三个操作,
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 线段树相关推荐
- HDU 1166(线段树)
线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...
- 敌兵布阵 HDU - 1166 (线段树)
线段树模板题: 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<c ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...
- hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...
- hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
[题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...
- poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...
- HDU 5238 线段树+数论
原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...
最新文章
- Centos6.3修改源码遇到无法yum安装的问题
- C#读写xml文件最简单方法(操作配置文件)
- 功能性农业投融资-农业大健康·周荣江:国情讲坛体制创新
- printf格式化字符串用法
- 又整理了一批可以拿去做副业的开源项目...
- Java开发童年小游戏
- 物联网之NB-IoT技术实践开发二
- 数据库基本语句和关键字详解
- 三国时代微博(佩服博主琢磨先生太有才了!)
- 数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具
- Android 10 SystemUI 如何添加4G信号和WiFi图标
- hdu 2977 Color Squares
- 更正:复旦大学工研院计算机学硕不是第一年招生
- 百度前CTO刘建国任搜索网站爱帮网CEO
- Arch 中 fcitx5 提示拼音不可用的解决过程
- 美国知乎热议: 关于CS专业, 有哪些你不知道的内幕
- html中border边框线上添加文字
- DBCP连接池中BasicDataSource类的基本使用
- ubuntu 更换主题
- 青春是黄鹤·《致我们终将逝去的青春》