HDU 1166 敌兵布阵 Segment Tree题解
本题是最主要的分段树操作了。或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了。
不使用lazy标志,更新仅仅是更新单点。
假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率就须要O(lgn)了。
可是不是用分段树,那么查询的时间效率是O(n),而分段树查询效率是O(lgn)
这就是amortize分摊了时间,并且lgn真的非常快,数据不是非常巨大的时候。接近常数了。
故此本题须要使用分段树。
#include <cstdio> class EnemyInfo
{
static const int SIZE = 50001;
int segTree[SIZE<<2];
inline int lChild(int r) { return r<<1; }
inline int rChild(int r) { return r<<1|1; } void pushUp(int root)
{
segTree[root] = segTree[lChild(root)] + segTree[rChild(root)];
} void buildTree(int l, int r, int rt)
{
if (l == r)
{
scanf("%d", &segTree[rt]);
return ;
} int m = l + ((r-l)>>1);
buildTree(l, m, lChild(rt));
buildTree(m+1, r, rChild(rt));
pushUp(rt);
} void update(int addPoint, int addNum, int l, int r, int rt)
{
if (l == r)
{
segTree[rt] += addNum;
return ;
} int m = l + ((r-l)>>1);
if (addPoint <= m) update(addPoint, addNum, l, m, lChild(rt));
else update(addPoint, addNum, m+1, r, rChild(rt));
pushUp(rt);
} int query(const int L, const int R, int l, int r, int rt)
{
if (L <= l && r <= R) return segTree[rt]; int m = l + ((r-l)>>1);
int res = 0;
if (L <= m) res += query(L, R, l, m, lChild(rt));
if (R > m) res += query(L, R, m+1, r, rChild(rt));
return res;
}
public:
EnemyInfo()
{
int T, n, a, b;
scanf("%d",&T);
for (int t = 1 ; t <= T ; t ++)
{
printf("Case %d:\n",t);
scanf("%d",&n);
buildTree(1 , n , 1);
char op[6];
while (scanf("%s",op) && op[0] != 'E')
{
scanf("%d%d",&a,&b);
if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
else if (op[0] == 'S') update(a , -b , 1 , n , 1);
else update(a , b , 1 , n , 1);
}
}
}
};
HDU 1166 敌兵布阵 Segment Tree题解的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...
- 【线段树I:母题】hdu 1166 敌兵布阵
[线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 (树状数组)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1166敌兵布阵(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(分块)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵
B - 敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
随机推荐
- Android开发之Menu:OptionMenu(选项菜单)、ContextMenu(上下文菜单)、SubMenu(子菜单)
菜单的概念,现在已经很普及了.Windows系统.Mac.桌面版Linux.Java Swing等,都有可视化菜单.一.Android平台3种菜单 选项菜单(OptionMenu).上下文菜单(Co ...
- Vs2012在Linux开发中的应用(1):开发环境
在Linux的开发过程中使用过多个IDE.code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE.如VisualDsp等,感觉总是不如vs强大好用.尽管 ...
- spark transform系列__groupByKey
这个操作的作用依据同样的key的全部的value存储到一个集合中的一个玩意. def groupByKey(): RDD[(K, Iterable[V])] = self.withScope { g ...
- 【Facebook的UI开发框架React入门之九】button简单介绍(iOS平台)-goodmao
--------------------------------------------------------------------------------------------------- ...
- Codeforces 11B Jumping Jack(数学)
B. Jumping Jack time limit per test 1 second memory limit per test 64 megabytes input standard input ...
- vue2.0-elementUI
main.js import Vue from 'vue' import App from './App.vue' import ElementUI from 'element-ui' import ...
- C# 利用反射和特性 来做一些事情
特性代码: [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public clas ...
- try{futureGirl}catch(Exception){"Kill All Trouble"}——echarts样式
首先先给未来女,解释一下题目吧.这是段代码,我再try{}括号里写了你,意思我会保护你.后面的catch(Exception)是捕捉你的所有麻烦,交给我解决. 今天收工较早,拖着疲惫是身躯回到宿舍,简 ...
- Bootstrap概览
摘选自runnoob.com,bootstrap4所有api概览: 一.安装: 弹性盒子(flexbox) Bootstrap 3 与 Bootstrap 4 最大的区别就是 Bootstrap 4 ...
- 玩转 Jupyter Notebook (CentOS)
Jupyter Notebook 简介 Jupyter Notebook 是一个开源的 Web 应用程序,可以用来创建和共享包含动态代码.方程式.可视化及解释性文本的文档.其应用于包括:数据整理与转换 ...