本题是最主要的分段树操作了。或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了。

不使用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题解的更多相关文章

  1. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  2. HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)

    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...

  3. 【线段树I:母题】hdu 1166 敌兵布阵

    [线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...

  4. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  5. HDU 1166 敌兵布阵 (树状数组)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    M ...

  7. HDU 1166 敌兵布阵(线段树单点更新,板子题)

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

  8. HDU 1166 敌兵布阵(分块)

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

  9. HDU 1166 敌兵布阵

    B - 敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

随机推荐

  1. 紫书 例题 10-27 UVa 10214(欧拉函数)

    只看一个象限简化问题,最后答案乘4+4 象限里面枚举x, 在当前这条固定的平行于y轴的直线中 分成长度为x的一段段.符合题目要求的点gcd(x,y) = 1 那么第一段1<= y <= x ...

  2. 题解 CF911D 【Inversion Counting】

    这是一道看似复杂其实也不简单的思维题. 其实思路很明显. 因为这道题的数据范围比较大,有1e5的询问,如果暴力(像我考场上那样打平衡树)的话可以做到$mnlogn$. 但那样也是稳T. 经过思考之后我 ...

  3. 做一个萌萌哒的button之box-shadow

    接上篇:http://blog.csdn.net/u010037043/article/details/47035077 一.box-shadow box-shadow是给元素块加入周边阴影效果. b ...

  4. 基于请求响应的MVC框架调用分析

    一.使用Servlet来处理请求响应 当client提交数据之后.接着发送请求,请求被封装成对象,server接收到请求,依据请求的URL.来推断将请求对象交由哪个Servlet处理. 在servle ...

  5. 免费WiFi初体验——个小白的WiFi旅程

    说来羞愧,真正接触到WiFi还是在毕业后,此前自己封闭在一个人的世界,再加上外在学校的包围,我还成了个"山里"的孩子. 去年毕业了,也算是个90后,可自觉得心态过于成熟.了解外界太 ...

  6. js插件---强大的图片裁剪Cropper

    js插件---强大的图片裁剪Cropper 一.总结 一句话总结:官网或者github里面的文档或者demo才是真的详细 使用的话找到图片裁剪后的base64数据,然后这个数据可下载可传递到服务器 1 ...

  7. A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法

    电脑安装openSUSE42.3和 Ubuntu16.04 双系统,当电脑插上网线后开机会出现A start job is running for Network Manager wait onlin ...

  8. python单元测试-unittest

    python内部自带了一个单元测试的模块,pyUnit也就是我们说的:unittest 1.介绍下unittest的基本使用方法: 1)import unittest 2)定义一个继承自unittes ...

  9. comm---两个文件之间的比较

    comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的且不相同的行. 差集:打印出包含 ...

  10. 【Henu ACM Round#14 F】 President and Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...