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{ ...
随机推荐
- 20155335《java程序设计》第一周学习总结
18个章节的问题 (1)为什么需要JVM让java跨平台? (2)JVM与JDK,与JRE的关系? (3)为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号 ...
- WordPress在nginx服务器伪静态
server { listen 80; root /var/www/xxx; server_name www.xxx.com; access_log /var/log/www/xxx.log main ...
- js 的function为什么可以添加属性
(1) function person(){ this.name = 'Tom'; } (2) function person(){} person.name = 'Tom'; (3) functio ...
- 跨域iframe高度计算
一.同域获取iframe内容 这里有两个细节: 1. 取iframe内的文档对象,标准浏览器使用contentDocument属性,IE低版本(IE6,7,8)使用document属性. 2. cal ...
- 【自己练习】linux常见命令——(六)
菜鸟教程命令大全 http://www.runoob.com/linux/linux-command-manual.html 命令大全: http://man.linuxde.net/ ta ...
- 【转】debian下的update-rc.d的使用
在Linux系统下,一个Services的启动.停止以及重启通常是通过/etc/init.d目录下的脚本来控制的.然而,在启动或改变运行级别时, 是在/etc/rcX.d中来搜索脚本.其中X是运行级别 ...
- monkey测试===如何获取android app的Activity
方法一(推荐): 手机连接adb,手机界面在需要取得activity的界面. 推荐使用该命令: adb shell dumpsys activity top | findstr ACTIVITY 获取 ...
- linux sort排序命令
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. 2 sort的-u选项 在输出行中去除重复行. $ ...
- JVM对象分配和GC分布【JVM】
最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象: 栈:什么是栈? 先说一下栈的数据结构吧,栈它是一种先进后出的数据结构(FILO),跟队列刚好相反(先进 ...
- 破解 myeclipse 2014 professional,步骤很重要
网易 博客 GACHA-动漫萌妹汇集地 LOFTER-最美图片社交 印像派-我的照片书 这些小语种最有前途,免费学 注册登录 加关注 日志 Windows下解决PostgreSQL8 ...