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 ...
随机推荐
- jq动态添加代码监听问题
$(document).on('click', '.class', function() { console.log($(this).attr('id')); });
- 【转载】STL 的 erase() 陷阱-迭代器失效总结
下面材料整理自Internet&著作. TL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.se ...
- [HLSL]HLSL 入门参考 (dx11龙书附录B译文)
原文:[HLSL]HLSL 入门参考 (dx11龙书附录B译文) HLSL 高级着色语言 参考文档 龙书DirectX12现已推出中文版,其附录B的高级着色器语言参考的翻译质量比本文更高,有条件的读者 ...
- Python基础:06条件和循环
1:条件表达式(三元操作符) Python 在很长的一段时间里没有条件表达式(C ? X : Y), 或称三元运算符.人们试着用 and 和 or 来模拟它, 但大多都是错误的. 根据 FAQ , 正 ...
- Linux中使用gcc编译文件
一个项目中可能有多个cpp文件,在linux下编译执行过程如下: g++ main.cpp distance.cpp ./a.out 即可一起编译两个文件,然后执行该程序.
- Libev源码分析05:Libev中的绝对时间定时器
Libev中的超时监视器ev_periodic,是绝对时间定时器,不同于ev_timer,它是基于日历时间的.比如如果指定一个ev_periodic在10秒之后触发(ev_now() + 10),然后 ...
- OO第四单元博客作业
OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...
- Spring Boot 集成日志logback + 控制台打印SQL
一: 控制台打印SQL application.properties中添加如下即可在控制台打印sql logging.level.com.fx.fxxt.mapper=debug 二:日志 因为Spr ...
- 【原生JS】写最简单的图片轮播
非常简单的一个大图轮播,通过将控制显示位置来进行轮播效果,写来给正在学习的新手朋友们参考交流. 先看效果:(实际效果没有这么快) 先看布局: <div id="display" ...
- Flex AIR应用拍照功能(Android和IOS版本)
说明: 使用AIR处理拍照后的回调.照片文件的保存功能时,针对于IOS和Android两个平台是有所不同的. 但.关于如何调用摄像头进行拍照这个功能,Android和IOS是一致的. 技术实现: 1) ...