一、前置知识-树状数组

树状数组(binary indexed tree)是一种简洁的代码量很小的数据结构,能够高效的处理前缀区间上的问题。在很多情况下能写树状数组解决的就不用码半天线段树了。

树状数组支持两种操作:

a)单点更新: 例如更改序列中的某一个元素的值,复杂度O(logn)

b)前缀查询: 查询序列中的前缀信息,例如,区间[1,n]中的最大值或者区间和,复杂度O(logn)

同时由于求和操作的“可减性”,可以通过查询两次前缀和实现求解序列的区间和

二、HDU1166 树状数组求解区间和

题意:单点修改元素,查询区间和,树状数组求区间和实现。

代码:

 # include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
const int maxn = 5e4+;
int N,A[maxn],C[maxn];
inline int lowbit(int x)
{
return x&(-x);
}
void Update(int index,int val)
{
while(index<=N)
{
C[index] += val;
index += lowbit(index);
}
}
int Query_Sum(int index)
{
int res = ;
while(index)
{
res += C[index];
index -= lowbit(index);
}
return res;
}
void Init()
{
scanf("%d",&N);
memset(C,,sizeof(C));
memset(A,,sizeof(A));
for(int i=;i<=N;i++)
{
scanf("%d",&A[i]);
Update(i,A[i]);
}
}
void Solve(int t)
{
printf("Case %d:\n",t);
int a,b;
char ins[];
while(scanf("%s",ins)!=EOF)
{
if(ins[]=='E')
break;
scanf("%d%d",&a,&b);
if(ins[]=='Q')
printf("%d\n",Query_Sum(b)-Query_Sum(a-));
if(ins[]=='A')
Update(a,b);
if(ins[]=='S')
Update(a,-b);
}
}
int main()
{
int T;
scanf("%d",&T);
for(int t=;t<=T;t++)
{
Init();
Solve(t);
}
return ;
}

三、BZOJ1012 树状数组求解前缀最大值

题意:在空队列里不断向队尾插入元素,过程中查询倒数第K大的元素,树状数组求最值实现。

代码:

 # include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
const int maxn = 2e5+;
int M,cnt;
long long D,val,ans,A[maxn],C[maxn];
char S[];
inline long long lowbit(long long x) {return x&(-x);}
void update(int index,long long value)
{
while(index)
{
C[index] = max(C[index],value);
index -= lowbit(index);
}
}
long long query(int index)
{
long long res = ;
while(index<=M)
{
res = max(res,C[index]);
index += lowbit(index);
}
return res;
}
void Init()
{
cnt = ;
ans = ;
memset(C,,sizeof(C));
}
void Solve()
{
for(int i=;i<M;i++)
{
scanf("%s%lld",S,&val);
if(S[]=='A')
{
cnt++;
update(cnt,(val+ans)%D);
}
else
{
ans = query(cnt-val+);
printf("%lld\n",ans);
}
}
}
int main()
{
while(scanf("%d%lld",&M,&D)!=EOF)
{
Init();
Solve();
}
return ;
}

HDU1166 敌兵布阵 BZOJ1012 最大数[树状数组]的更多相关文章

  1. HDU1166敌兵布阵(线段树,树状数组)

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

  2. kuangbin专题七 HDU1166 敌兵布阵 (线段树或树状数组)

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

  3. HDU1166 敌兵布阵_线段树

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

  4. HDU1166敌兵布阵(线段树单点更新)

    线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.       对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b ...

  5. hdu1166敌兵布阵_线段树单点更新

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

  6. hdu1166 敌兵布阵【线段树】

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

  7. hdu1166 敌兵布阵 (线段树单点更新)

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

  8. HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树)

    HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树) Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  9. HDU1166 敌兵布阵(树状数组实现

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

随机推荐

  1. Python学习之路5☞文件处理

    一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...

  2. 并发编程之submit和execute区别

    前言 使用线程池难免会用到submit和execute,但是submit是有坑的,此处做个记录 1.submit坑 此处随便写一个方法,进入内部查看execute和submit /** * @Auth ...

  3. 【NS2】有线和无线混合场景 (转载)

    1. 创建简单的有线-无线混合场景 上一节建立的无线仿真可以支持多跳adhoc网络或wirelesslan.但是,我们可能需要对经过有线网络连接的多个无线网络进行仿真,或者说我们需要对有线-无线混合网 ...

  4. mysql ip常见异常

    这次的项目采用mysql数据库,以前没怎么接触过,所以遇到很多问题,在此小小总结一下: (1)com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti ...

  5. LeetCode58 Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  6. Mysql 查询一天中每半小时记录的数量

    SELECT HOUR(e.time)as Hour,FLOOR(MINUTE(e.time)/30) as M, COUNT(*) as Count FROM error_log e WHERE e ...

  7. python selenium 测试 LOG

    1.首先在根目录中新建一个Logs文件夹,写入文件 2.在framework文件夹中写入logger.py 3.在testsuits文件夹中写入test_log.py logger.py # _*_ ...

  8. iptables 规则(Rules)

    iptables的每一条规则(rule),都是由两部分组成的,第一部分包含一或多个「过滤条件」其作用是检查包是否符合处理条件(所有条件都必须成立才算数) :第而部分称为「目标」,用於決定如何处置符合条 ...

  9. Open Source Software List: The Ultimate List

    http://www.datamation.com/open-source/ Accessibility 1. The Accessibility Project The Business Value ...

  10. H3C 专线连接模型