一、前置知识-树状数组

树状数组(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. hdu4324 dfs

    scanf("%1d")这种好像很慢. #include<stdio.h> #include<string.h> #define maxn 2010 str ...

  2. Ecplise中Junit4单元测试的基本用法

    看了一些Junit4的视频,简单了解了Junit4的一些基本用法,整理记录一下. 环境搭建 这里使用的开发工具是MyEclipse,首先新建一个Java工程,将Junit4的jar包引入,eclips ...

  3. 大侦探福老师——幽灵Crash谜踪案

    闲鱼Flutter技术的基础设施已基本趋于稳定,就在我们准备松口气的时候,一个Crash却异军突起冲击着我们的稳定性防线!闲鱼技术火速成立侦探小组执行嫌犯侦查行动,经理重重磨难终于在一个隐蔽的角落将其 ...

  4. Python深入:stevedore简介

    stevedore是用来实现动态加载代码的开源模块.它是在OpenStack中用来加载插件的公共模块.可以独立于OpenStack而安装使用:https://pypi.python.org/pypi/ ...

  5. @bzoj - 2388@ 旅行规划

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...

  6. hdu 4347 The Closest M Points(KD树)

    Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. ...

  7. H3C 分页显示

  8. 第一次作业:C++ 函数重载

    函数重载 函数重载是在C语言的学习中未涉及的新概念.我们在编程时经常会遇到这样一个问题:我们编写完一个函数准备准备调用时,一旦需要传入不同的数据类型的参数时,一个函数无法实现,我们又必须重写另一个或者 ...

  9. oracle自动选择索引

    如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性. 在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引. 举例: SELECT ENAME FROM EMP W ...

  10. http端口

    HTTPS全称是Hyper Text Transfer Protocol over Secure Socket Layer, 即http的安全版. https使用的端口是443,而http的端口是80 ...