HDU 1166 - 敌兵布阵 - [分块]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题解:
本题作为一个模板题,我用它来检验过总查询时间复杂度为 $O(q \log n)$ 的树状数组模板、线段树模板以及zkw线段树模板;而今天,我们要来用分块来写这道题目。
时间复杂度:
初始化 $O(n)$;每次修改均为 $O(1)$,每次查询为 $O(\sqrt n)$;总时间复杂度 $O(n + q \sqrt n)$。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+; int n; int a[maxn],sum[maxn];
int block[maxn],len,tot;
int L[maxn],R[maxn];
void init(int l,int r)
{
memset(sum,,sizeof(sum));
len=sqrt(r-l+);
tot=;
for(int i=l;i<=r;i++)
{
block[i]=(i-l)/len+;
tot=max(block[i],tot);
sum[block[i]]+=a[i];
if(i==l) L[block[i]]=i;
if(i==r) R[block[i]]=r;
if(l<=i- && i<=r && block[i-]!=block[i])
{
R[block[i-]]=i-;
L[block[i]]=i;
}
}
}
void add(int p,int x)
{
a[p]+=x;
sum[block[p]]+=x;
}
int ask(int l,int r)
{
int st=block[l],ed=block[r];
int res=;
if(st==ed) for(int i=l;i<=r;i++) res+=a[i];
else
{
for(int i=l;i<=R[st];i++) res+=a[i];
for(int i=st+;i<=ed-;i++) res+=sum[i];
for(int i=L[ed];i<=r;i++) res+=a[i];
}
return res;
} int main()
{
int T;
cin>>T;
for(int kase=;kase<=T;kase++)
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
init(,n);
printf("Case %d:\n",kase);
char op[];
while(scanf("%s",op))
{
if(op[]=='E') break;
if(op[]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",ask(l,r));
}
else if(op[]=='A')
{
int pos,x;
scanf("%d%d",&pos,&x);
add(pos,x);
}
else if(op[]=='S')
{
int pos,x;
scanf("%d%d",&pos,&x);
add(pos,-x);
}
}
}
}
HDU 1166 - 敌兵布阵 - [分块]的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...
- 【线段树I:母题】hdu 1166 敌兵布阵
[线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 (树状数组)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1166敌兵布阵(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 1166 敌兵布阵(分块)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵
B - 敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
随机推荐
- spring-mybatis-data-common程序级分表操作实例
spring-mybatis-data-common-2.0新增分表机制,在1.0基础上做了部分调整. 基于机架展示分库应用数据库分表实力创建 create table tb_example_1( i ...
- 跟我学SharePoint2013视频培训课程——版本控制示例(15)
课程简介 第15天,SharePoint 2013版本控制示例 视频 SharePoint 2013 交流群 41032413
- IT? 挨踢
中国的IT,是最憋屈的IT. 他们掌握着正常人看不懂的英文+字母+标点符号组成的各类代码语言 他们像作者一样从无到有,从空白的白纸上敲出上千上万条华丽的计算机语言 但是他们承受着正常人的鄙视: 我的需 ...
- 格雷码(Gray code)仿真
作者:桂. 时间:2018-05-12 16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码, ...
- function 与 => 的区别
在JS中,箭头函数并不是简单的function(){}匿名函数的简写语法糖,实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了.而匿名函数的this ...
- Lua 5.1 5.3 参考手册
Lua 5.1 参考手册: https://www.codingnow.com/2000/download/lua_manual.html Lua 5.3 参考手册: http://cloudwu.g ...
- BW中DSO的分类及应用
1.DSO的分类,标准DSO(生成主数据标识.对于相同关键字段的值进行合并.可直接出具报表).写优化的DSO(不生成主数据标识.不合并相同关键字段的值.速度快可用于存储大容量数据).直接写入的DSO, ...
- 比Screen更好用的神器:tmux
安装并启动 tmux tmux 应用程序的名称来源于终端(terminal)复用器(muxer)或多路复用器(multiplexer).换句话说,它可以将您的单终端会话分成多个会话. 它管理窗口和窗格 ...
- Numpy数组与PIL Image转换
引用于这个博客
- postman参数获取不到原因
在使用postman时,会发现经常提示参数错误,然而代码没有问题,仔细一看,原来是粘贴复制参数到postman时,前后有空格.