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 ...
随机推荐
- RDLC 图形报表预览时 “本地报表处理期间错误”
在RDLC报表中有图形报表的导出和打印都正常,但预览时"本地报表处理期间错误",这是因为你设置的图形太宽已经超过默认的A4 纸的宽度,解决办法:报表页面的报表--->报表属性 ...
- 微信小程序-开心大转盘(圆盘指针)代码分析
大转盘是比较常见的抽奖活动 .以前做过h5的大转盘,最近小程序比较火,客户要求做小程序的大转盘.我们就来分析下代码.先上几个图: 界面效果还是很不错的. 做界面还是比较容易的,只要有前端基础没 ...
- TCP中的KeepAlive与HTTP中的Keep-Alive
KeepAlive 与 Keep-Alive 前言 昨天被问到了HTTP中Keep-Alive的概念,看名字我只知道是保持连接用的,但是对于他怎么结束连接,为什么要用他这些就不是很清楚了,今天查了一下 ...
- Spatial Sound Research
Spatial Sound Research What are our goals? The basic goal of our research is to develop cost-effecti ...
- 关于Stm32定时器+ADC+DMA进行AD采样的实现
Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进 ...
- git配置用户名邮箱,全局配置/单仓库配置
在项目根目录下进行单仓库配置(作用域只在本仓库下): git config user.name "gitlab's Name" git config user.email &quo ...
- Java知多少(28)super关键字
super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类 ...
- Linux 下用 valgrind 查找内存泄漏小例子
1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...
- Python encode() 方法(转)
转自:http://www.cnblogs.com/wushuaishuai/p/7686290.html 描述 encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'. 对应的 ...
- Python匿名函数——lambda表达式
如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式 ...