思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n)

没想到自己以前把这道题当线段树的单点更新刷了。

树状数组:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 5e4 + ;
int tree[maxn], n;
void add(int k, int num)
{
while (k <= n)
{
tree[k] += num;
k += k&-k;
}
}
int sum(int k)
{
int sum = ;
while (k)
{
sum += tree[k];
k -= k&-k;
}
return sum;
}
int main()
{
int t, x, y, k=;
scanf("%d", &t);
while (t--)
{
memset(tree, , sizeof(tree));
scanf("%d", &n);
for (int i = ; i <= n; ++i)
{
scanf("%d", &x); add(i, x);
}
char num[];
printf("Case %d:\n", ++k);
while (scanf("%s", num), strcmp(num, "End") != )
{
scanf("%d%d", &x, &y);
if (strcmp(num,"Add")==){ add(x, y); }
else if (strcmp(num,"Sub")==){ add(x, -y); }
else{ printf("%d\n", sum(y) - sum(x-)); }
}
}
}

线段树

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MID(a,b) (a+((b-a)>>1))
#define MAXN int(1e4)*5+5
struct node
{
int l, r;
int sum;
int mid(){ return MID(l, r); }
}; int num[MAXN], n; struct Tree
{
node tree[MAXN << ];
void build(int L, int R, int pos)
{
tree[pos].l = L; tree[pos].r = R; //表示区间
tree[pos].sum = ;
if (L == R){tree[pos].sum = num[R]; return; }//到了子叶
int mid = tree[pos].mid();
//二分
build(L, mid, pos<<);
build(mid + , R, pos << | );
tree[pos].sum = tree[pos << ].sum + tree[pos << | ].sum;
}
//valu 表示加的值, ind 表示第几个军营。(在区域中的位置)
void updata(int ind, int pos, int valu)
{
if (tree[pos].l == tree[pos].r)
{
tree[pos].sum += valu; return; //叶节点+valu
}
int mid = tree[pos].mid();
//二分查找单点位置?
if (ind <= mid) updata(ind, pos << , valu);
else updata(ind, pos << | , valu);
tree[pos].sum = tree[pos << ].sum + tree[pos << | ].sum;
//递归,覆盖上一层的sum
}
//查询
int query(int L, int R, int pos)//从根节点查到符合的区间节点
{
if (L <= tree[pos].l&&tree[pos].r <= R) return tree[pos].sum;
int mid = tree[pos].mid();
int sum1 = , sum2 = ;
if (L <= mid) sum1 = query(L, R, pos << );
if (R > mid) sum2 = query(L, R, pos << | );
return sum1 + sum2;
}
};
Tree tree;
int main()
{
int x, y;
int t, n,t_case=;
scanf("%d", &t);
while (t--)
{
char ch[];
scanf("%d", &n);
printf("Case %d:\n", ++t_case);
for (int i = ; i <= n; i++)
scanf("%d", &num[i]);
tree.build(, n, );
while (scanf("%s", ch) != EOF)
{
if (strcmp(ch, "End") == ) break;
else if (strcmp(ch,"Add")==)
{
scanf("%d%d", &x, &y);
tree.updata(x, , y);
}
else if (strcmp(ch, "Sub") == )
{
scanf("%d%d", &x, &y);
tree.updata(x, , -y);
}
else if (strcmp(ch, "Query") == )
{
scanf("%d%d", &x, &y);
printf("%d\n", tree.query(x, y, ));
}
}
}
return ;
}

敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)的更多相关文章

  1. 敌兵布阵 HDU 1166 线段树

    敌兵布阵 HDU 1166 线段树 题意 这个题是用中文来描写的,很简单,没什么弯. 解题思路 这个题肯定就是用线段树来做了,不过当时想了一下可不可用差分来做,因为不熟练就还是用了线段树来做,几乎就是 ...

  2. HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)

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

  3. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  4. [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)

    这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...

  5. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  6. A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)

    线段树板子题练手用 #include<cstdio> using namespace std; ; int a[maxn],n; struct Node{ int l,r; long lo ...

  7. A - 敌兵布阵 - hdu 1166

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...

  8. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  9. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

随机推荐

  1. “未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序”问题的解决

    发布到win7 64位旗舰版iis上时,报:“未能加载文件或程序集“BC.Common”或它的某一个依赖项.试图加载格式不正确的程序”. 该DLL的本地复制没有设置为true(在项目引用里找到该引用, ...

  2. C#基础知识回顾-- 反射(4)

    从程序集获得类型 先说点题外话,现在技术真的发展太快了.我这边还很多东西半生不熟 呢,那边又出现了好多有趣的新东西让你眼红不已.学还是不学这还真是 个问题.Node.js .bootstrap,我最近 ...

  3. 【HttpWeb】Post和GET请求基本封装

    别的不多少了直接代码就行了: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  4. [PHP]算法-归并排序的PHP实现

    <?php //归并排序 function merge(&$A,$left,$mid,$right,$temp){ //7.左堆起始 $i=$left; //8.右堆起始 $j=$mid ...

  5. java导出excel时合并同一列中相同内容的行

    一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...

  6. 微信小程序开发BUG经验总结

    摘要: 常见的微信小程序BUG! 小程序开发越来越热,开发中遇到各种各样的bug,在此总结了一些比较容易掉进去的坑分享给大家. 1. new Date跨平台兼容性问题 在Andriod使用new Da ...

  7. JS的DOM操作 - 你真的了解吗?

    摘要 想稍微系统的说说对于DOM的操作,把Javascript和jQuery常用操作DOM的内容归纳成思维导图方便阅读,同时加入性能上的一些问题. 前言 在前端开发的过程中,javascript极为重 ...

  8. jQuery之$.ajax()方法详解及实例

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  9. 【代码笔记】Web-ionic 网格(Grid)

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  10. 【读书笔记】iOS-iOS流媒体

    在网络上直接看电影已经不是什么新鲜的事情,在iOS等移动设备上也有很多在线视频应用,如国内的PPS和PPLive应用,还有一些新闻视频都可以在线观看,如USA TODY.所以这些在线视频都采用流媒体技 ...