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

然后,它是一种暴力算法

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

分块算法会对一个序列(长度为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. bzoj 1588 bst

    用set存下就好了. /************************************************************** Problem: 1588 User: BLADE ...

  2. [Leetcode Week15]Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/popul ...

  3. Deep Learning基础--参数优化方法

    1. 深度学习流程简介 1)一次性设置(One time setup)          -激活函数(Activation functions) - 数据预处理(Data Preprocessing) ...

  4. 【UOJ224】短路

    具体可以看UOJmyy的blog,orz 就是一个贪心. #include<bits/stdc++.h> typedef long long ll; using namespace std ...

  5. Linux下通过jstat命令查看jvm的GC情况

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]  注意!!!:使用的jdk版本是jdk8. ...

  6. 【Android开发日记】之基础篇(一)——TextView+SpannableStringBuilder

    TextView是控件中最最基础的一个控件,也是最简单的一个控件.但如果仅此,我不会专门为TextView写一篇文章.最近发现了Android中有趣的一个类,那就是标题上写的SpannableStri ...

  7. HTML5表单之Input 类型- Date Pickers(日期选择器)

    HTML5 拥有多个可供选取日期和时间的新输入类型: date-选取日.月.年 month-选取月.年 week-选取周和年 time-选取时间(小时和分钟) datetime-选取时间.日.月.年( ...

  8. LCT 文档

    file:///C:/Users/Frank/Downloads/QTREE%E8%A7%A3%E6%B3%95%E7%9A%84%E4%B8%80%E4%BA%9B%E7%A0%94%E7%A9%B ...

  9. oracle11g如何创建数据库

    oracle11g创建数据库的步骤如下:1.按住键盘上Windows键,打开开始菜单,找到Database Configuration Assitant并打开:2.打开数据库配置助手Database ...

  10. hdu 2881(LIS变形)

    Jack's struggle Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...