分块的的复杂度是带根号的。。。。

然后,它是一种暴力算法

简单来说就是优化过的暴力

分块算法会对一个序列(长度为N)进行划分,每一块最多有K个元素,这样就会分为N/K块;

一般K取sqrt(N),那么块数也有K+1 or K块

通常实现时,我们用belong【i】示第i个位置所属的块,对于每个块都进行信息维护。

单点修改时,我们一般先将对应块的标记下传,再暴力更新被修改块的状态

如果是区间 l,r 修改的话,对于被整块跨过的块直接打标记,两端剩余的部分暴力重构

至于询问操作,和区间修改类似,对于中间跨过的整块,直接利用块保存的信息统计答案,两端剩余部分打暴力

m次询问复杂度o(sqrt(N))

以上就是思路;

建块:

void divide()
{
//n 个数
int s=sqrt(n);//分成块的大小为sqrt(n);
for(int i=;i<=n;i++)
belong[i]=(i-)/s+;//belong[i]数组表示第i个数所在的块
int cnt=belong[n];//一共有几块 for(int i=;i<=cnt;i++)
{ //设置每一块长度
sum[i]=add[i]=;//sum表示此时第i块的总值为几,add表示第i块添加的数的总和
if(i==cnt)
{
//防止最后一块不足s,size表示每一块的长度
if (n%s==) size[i]=s;
else size[i]=n%s;
}
else size[i]=s;
}
for(int i=;i<=n;i++)
sum[belong[i]]+=a[i];//i所属的那一块的sum加上ai }

修改:

void modify(int l,int r,int v)
{
//修改
if (belong[l]==belong[r])
{
//属于同一分块
for (int i=l; i<=r; i++)so easy
a[i]+=v;
return;
}
while (belong[l]==belong[l-])
{
//自此往下同上访问
a[l]+=v;
l++;
}
while (belong[r]==belong[r+])
{
a[r]+=v;
r--;
}
for (int i=belong[l]; i<=belong[r]; i++) {
add[i]+=v;
sum[i]+=size[i]*v;
}
}

查询:

int query(int l,int r)
{
//访问
int ans=;
if(belong[l]==belong[r]) ans-=sum[belong[l]];//此处为避免l与r属于同一块画图很好理解,此处不再解释
while (belong[l]==belong[l-])
{
ans+=a[l]+add[belong[l]];//因为l要++,所以l会遍历在从l到r的不整区间中所有的数,so要加a数组
//**从左到第一个整区间
l++;
}
while(belong[r]==belong[r+])
{
//**从最后一个整区间到最后
ans+=a[r]+add[belong[r]];
r--;
}
for (int i=belong[l]; i<=belong[r]; i++) //加入所有整区间的数
ans+=sum[i];
return ans;
}

About 分块的更多相关文章

  1. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

  2. POJ2104 K-th Number [分块做法]

    传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html 做那倒带修改的主席树时就发现分块可以做,然后就试了试 思想和教主的魔法差不多,只不过那个是求 ...

  3. HDU 4467 分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...

  4. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  5. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  6. bzoj2002弹(dan)飞绵羊 分块水过

    据说是道lct求深度的题 但是在小猫大的指点下用分块就n^1.5水过了 = =数据忘记加强系列 代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面... #include <cs ...

  7. C语言两种查找方式(分块查找,二分法)

    二分法(必须要保证数据是有序排列的):   分块查找(数据有如下特点:块间有序,块内无序):    

  8. [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传

    <Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...

  9. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  10. CodeChef - QCHEF 分块

    题目链接:http://vjudge.net/problem/174774/origin 题意:给定一个长度为n的序列a[],序列的值不大于m,现在有k个询问,每个询问给定(l,r).让你求出max{ ...

随机推荐

  1. HDU 1180 诡异的楼梯 (广搜)

    题目链接 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一 ...

  2. I题 hdu 1234 开门人和关门人

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1234 开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)   ...

  3. 5.0docer 网络链接

    docker0 :linux的虚拟网桥 虚拟网桥特点: 1.可以设置ip地址 2.相当于拥一个隐藏的虚拟网卡     安装网桥工具 apt-get install bridge-utils brctl ...

  4. Arduino 舵机sg90电位器实现转动方向控制

    /* Sweep*/ #include <Servo.h> int potpin = 0;//电位器接到A0 int val; //存储电位器读取的数值 Servo myservo//定义 ...

  5. python基础===isinstance() 函数,判断一个对象是否是一个已知的类型

    isinstance(object, classinfo) object -- 实例对象. classinfo -- 可以是直接或间接类名.基本类型或者有它们组成的元组. >>>a ...

  6. EF添加ADO.NET实体模型处直接选择Oracle数据源

    上一文介绍了如何下载Mysql for vs Tools来进行Mysql的ADO.NET实体模型数据源选择,今天将Oracle的测试了下.步骤如下: 1.在你项目Model层中nuget安装选中项 2 ...

  7. Queue类

    1.LinkedBlockingQueue:基于链接节点的可选限定的blocking queue . 这个队列排列元素FIFO(先进先出). 队列的头部是队列中最长的元素. 队列的尾部是队列中最短时间 ...

  8. sicily 1036. Crypto Columns

    Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description The columnar encryption scheme scram ...

  9. Oracle事务处理

    原文转自:(http://www.cnblogs.com/ITtangtang/archive/2012/04/23/2466554.html) 一.事务概念事务用于保证数据的一致性,它由一组相关的d ...

  10. [ python ] 下划线的意义和一些特殊方法

    Python用下划线 Python用下划线为变量前缀和后缀制定特殊变量 _xxx 不能用 'from module import *' 导入__xxx__ 系统定义名字__xxx 类中的私有变量名 核 ...