About 分块
分块的的复杂度是带根号的。。。。
然后,它是一种暴力算法
简单来说就是优化过的暴力
分块算法会对一个序列(长度为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 分块的更多相关文章
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
- POJ2104 K-th Number [分块做法]
传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html 做那倒带修改的主席树时就发现分块可以做,然后就试了试 思想和教主的魔法差不多,只不过那个是求 ...
- HDU 4467 分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...
- 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 ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
- bzoj2002弹(dan)飞绵羊 分块水过
据说是道lct求深度的题 但是在小猫大的指点下用分块就n^1.5水过了 = =数据忘记加强系列 代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面... #include <cs ...
- C语言两种查找方式(分块查找,二分法)
二分法(必须要保证数据是有序排列的): 分块查找(数据有如下特点:块间有序,块内无序):
- [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传
<Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- CodeChef - QCHEF 分块
题目链接:http://vjudge.net/problem/174774/origin 题意:给定一个长度为n的序列a[],序列的值不大于m,现在有k个询问,每个询问给定(l,r).让你求出max{ ...
随机推荐
- codevs1066&&noip引水入城
这道题 解决第一问 用灌水法 枚举第一行的每一个点 查找是否最后一行的每一个点是否都能灌到水 第二问 用反灌水发 枚举最后一行的每一个点 解决第一行每一个点所能覆盖的左右端点 可以证明每个点所能覆盖的 ...
- 计蒜客 Goldbach Miller_Rabin判别法(大素数判别法)
题目链接:https://nanti.jisuanke.com/t/25985 题目: Description: Goldbach's conjecture is one of the oldest ...
- [干货,阅后进BAT不是梦]面试心得与总结---BAT、网易、蘑菇街
本文转载自:公众号:JANiubility 前言 之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人 ...
- Java8的Lambda表达式简介
先阐述一下JSR(Java Specification Requests)规范,即Java语言的规范提案.是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求 ...
- 安全测试===sqlmap(叁)转载
十五.操作系统控制 1.执行任意操作系统命令 参数:--os-cmd和--os-shell 若数据库管理系统是MySQL.PostgreSQL或微软的SQL Server且当前用户有相关权限Sqlma ...
- C++中STL容器的比较
基本参考 https://blog.csdn.net/qq_14898543/article/details/51381642 容器特性: vector:典型的序列容器,C++标准严格要求次容器的实现 ...
- C++ 模板的用法
C++中的高阶手法就会用到泛型编程,主要有函数模板, 在程序中使用模板的好处就是在定义时不需要指定具体的参数类型,而在使用时确可以匹配其它任意类型, 定义格式如下 template <class ...
- java 查看运行时某个类文件所在jar的位置
在一些大型项目中,项目所依赖的库可能比较到,有时候也会出现库冲突的情况,曾经遇到过一种情况:一个第三方云存储提供了一个sdk,这个sdk本身依赖httpclient相关的包,然而对方却把httpcli ...
- 初学jmeter
jmeter安装的前提需要有jdk环境,下载安装好jdk环境后记得要设置好环境变量. 配置环境变量:右击“我的电脑”-->"高级"-->"环境变量" ...
- node-session
session cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中 ...