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 ...
随机推荐
- 反射技术的入口 获取类的Class信息
package com.sxt.reflect; import com.sxt.reflect.entity.Student; /* * 获取类的Class信息 */ public class Tes ...
- windows7蓝屏0x000000c4
故障还原: 360更新弹出更新提示,于是选择了关机自动更新,第二天开机发现电脑蓝屏报0x000000c4错误! 故障排查: 1.无法从最后一次正确配置启动windows7 2.无法进入安全模式 该错误 ...
- Hibernate错误——No row with the given identifier exists
错误 是用的是Hibernate自动建立的数据表,在进行数据库操作时,出现错误No row with the given identifier exists 解决 关系数据库一致性遭到了破坏,找到相关 ...
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- selenium webdriver学习(四)------------定位页面元素(转)
selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...
- oracle函数 exp(y)
[功能]返回e的y次幂(e为数学常量) [参数]y,数字型表达式 [返回]数字 [示例] select exp(3),exp(0),exp(-3) from dual; 返回:20.0855369,1 ...
- H3C TCP封装
- H3C DCC的特点
- 【t079】火星上的加法运算
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限,想向你求助,作为一名 ...
- hadoop 端口总结
localhost:50030/jobtracker.jsp localhost:50060/tasktracker.jsp localhost:50070/dfshealth.jsp 1. Name ...