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

然后,它是一种暴力算法

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

分块算法会对一个序列(长度为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. [BZOJ1076][SCOI2008]奖励关解题报告|状压DP

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  2. 【NOIP】提高组2013 转圈游戏

    [算法]快速幂运算 [题解]ans=(m*10^k+x)%n,用快速幂计算10^k即可,复杂度为O(log k). #include<cstdio> long long n,m,k,x,a ...

  3. python初步学习-python数据类型之number(数值)

    数据类型之 Number python number 数据类型用于存储数值. 数据类型是不容许改变的. 这就意味着如果改变 number 数据类型的值,将重新分配内存空间. python支持四种不同数 ...

  4. AndroidStudio获得发布版安全码SHA1

    耗了一下午才搞定 在cmd中: 1.打开keytool的目录:即JDK的安装目录 2.输入口令: (E:\tenyears\tenyears\app是keystore文件的目录)

  5. linux内核网络接收数据流程图【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3141409.html 4.3 数据接收流程图   各层主要函数以及位置功能说明:          1)s ...

  6. Deep Learning基础--CNN的反向求导及练习

    前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...

  7. sqlserver2008 死锁解决方法及性能优化方法

    sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Serv ...

  8. 《Java编程思想》阅读笔记一

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)第四版进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会 ...

  9. Leetcode 之Longest Common Prefix(34)

    这题实现起来还是挺麻烦的,就偷懒使用下库函数strtod().第二个参数表示字符中不是数字的地方,如果后面是空格,则认为其仍是数字,否则不是. bool isNumber(char *s) { cha ...

  10. HDU-4255

    A Famous Grid Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...