HDU1166 敌兵布阵 BZOJ1012 最大数[树状数组]
一、前置知识-树状数组
树状数组(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 最大数[树状数组]的更多相关文章
- HDU1166敌兵布阵(线段树,树状数组)
题面 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- kuangbin专题七 HDU1166 敌兵布阵 (线段树或树状数组)
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- HDU1166 敌兵布阵_线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU1166敌兵布阵(线段树单点更新)
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b ...
- hdu1166敌兵布阵_线段树单点更新
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- hdu1166 敌兵布阵【线段树】
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- hdu1166 敌兵布阵 (线段树单点更新)
Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务就是要监视这 ...
- HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树)
HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树) Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...
- HDU1166 敌兵布阵(树状数组实现
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- QT_OPENGL-------- 3.ElementArraryBuffer
与上一节内容基本相同,只是用ElementArraryBuffer绘制三角形,也就是VBO与IBO. 1.VBO 一系列点,通过glDrawArrays指定绘制几个点,是连续的,不能跳跃.2.IBO( ...
- “不是不需要运维工程师,是人人皆是运维”|对话阿里云MVP蒋烁淼(上)
摘要: 与湖畔大学首期学员.阿里云MVP.驻云创始人蒋烁淼面对面 [三位阿里云MVP(驻云CEO.首席架构师.大数据总监)<MVP时间>首次同台授课,“湖畔第一大脑” 蒋烁淼领头线上精讲, ...
- spider csdn博客和quantstart文章
spider csdn博客和quantstart文章 功能 提取csdn博客文章 提取quantstart.com 博客文章, Micheal Hall-Moore 创办的网站 特色功能就是: 想把原 ...
- HZOJ 巨神兵
60pts: 每个DAG的拓扑序是唯一的,所以考虑将DAG分层.f[i][j]记录当前选择的节点状态是i,最后一层的节点状态为j(dep取最大). 初始状态:$f[i][i]=1;i\in [1,1& ...
- 2016 Asia Jakarta Regional Contest L - Tale of a Happy Man UVALive - 7722
UVALive - 7722 一定要自己做出来!
- SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目
原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-1-setting-up-a-sharpdx-project-in-visual-studi ...
- Java帮助文档打开索引就停止服务
cmd: regsvr32 jscript.dllregsvr32 hhctrl.ocxregsvr32 itss.dllregsvr32 itircl.dll
- php 处理 大并发
小谈php处理 大并发 大流量 大存储 一.判断大型网站的标准: 1.pv(page views)网页的浏览量: 概念:一个网站所有的页面,在24小时内被访问的总的次数.千万级别,百万级别 2. uv ...
- Eclipse(Maven) web项目更改项目名称
1. 右键工程:Refactor->Rename,更改项目名称: 2. 修改项目目录下:.project文件 <?xml version="1.0" encoding= ...
- Android 自定义ProgressDialog
Android本身已经提供了ProgressDialog进度等待框,使用该Dialog,我们可以为用户提供更好的体验:在网络请求时,弹出此框等待网络数据. 不过,既然是为了提高用户体验,我们肯定希望该 ...