HDU 1166 敌兵布阵(线段树)
2015-07-22 21:27
405 查看
题目连接:Click here
思路:简单的单点更新,区间查询。
思路:简单的单点更新,区间查询。
#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int ans[250005]; void build(int left, int right, int f) {//建立线段树 int mid; if(left == right) //如果左边等于右边,证明到达叶子节点 scanf("%d", &ans[f]); else { mid = (left + right) / 2; build(left, mid, f * 2); //f是节点的信息,f*2是其左子树节点的下标 build(mid + 1, right, f * 2 + 1); ans[f] = ans[f*2] + ans[f*2+1]; } } void update(int place, int add, int left, int right, int f) {//更新线段树信息 int mid; ans[f] += add; if(left == right)return; mid = (left + right) / 2; if(place <= mid) update(place, add, left, mid, f * 2); else update(place, add, mid + 1, right, f * 2 + 1); } int que(int ql, int qr, int left, int right, int f) {//查询区间ql-qr的值 int ans2, mid; ans2 = 0; if(ql <= left && right <= qr) return ans[f]; mid = (left + right) / 2; if(qr > mid) ans2 += que(ql, qr, mid + 1, right, f * 2 + 1); if(ql <= mid) ans2 += que(ql, qr, left, mid, f * 2); return ans2; } int main() { int t, n, a, b; char ord[20]; scanf("%d", &t); for(int k = 1; k <= t; k++) { printf("Case %d:\n", k); scanf("%d", &n); build(1, n, 1); while(scanf("%s", ord) != EOF) { if(ord[0] == 'E')break; if(ord[0] == 'Q') 4000 { scanf("%d%d", &a, &b); printf("%d\n", que(a, b, 1, n, 1)); } if(ord[0] == 'A') { scanf("%d%d", &a, &b); update(a, b, 1, n, 1); } if(ord[0] == 'S') { scanf("%d%d", &a, &b); update(a, -b, 1, n, 1); } } } return 0; }
相关文章推荐
- 2015 Multi-University Training Contest HDU5297
- 四大组件
- tomcat安装及优化
- Onclick 调不到JS函数
- 文章标题
- 实现多线程的两种方法:继承Thread类或实现Runnable接口
- 【西祠日志】【06】日志规范 :0、日期简述 1、当日计划 2、做了什么 3、反省 4 、【悟】5、明日打算
- 217 Contains Duplicate
- 菲波那契数列
- 如何访问DataTable中的某个元素
- QListWidget的item上实现右键菜单
- [转载]转:CreateFileMapping实现的共享内存及用法
- 数据归一化和两种常用的归一化方法
- Remove Nth Node From End of List
- 计算机视觉、机器学习相关领域论文和源代码大集合
- pureftp、vsftp部署及优化
- linux中的lsof命令简介(某公司社招笔试试题)
- IOS SDWebImage的使用
- lnmp+wordpress: 您的PHP似乎没有安装运行WordPress所必需的MySQL扩展
- Alignment poj1836