博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分块算法
阅读量:4571 次
发布时间:2019-06-08

本文共 823 字,大约阅读时间需要 2 分钟。

浅谈分块

区间修改,单点查询

  • 众所周知,这种题线段树是可以跑得下来的,但是线段树的常数太大了,前几天本蒟蒻改一道线段树题改到自闭,调好之后就被卡掉了,太可怕了。蒟蒻就手残,打了一篇博客......

分块大法

  • 对于任意一个序列{a},给定两种操作:

    0:给定l,r,c把l-r中a[i] (l=<i<=r)的值都加上c;

    1:给定l,r,c(l,c可以忽略)查询a[r]的值。

  • 虽然线段树数据结构是O(nlogn),分块是O(n sqrt(n))的复杂度。但是分块可以维护好多东西.

分块的实现

  • 分块就是把一个区间分成好几个小块,大部分题的复杂度都是n sqrt(n),所以默认是把区间分成sqrt(n)块。如果某题用分块复杂度带log,就让块分的更多一些,大概是乘个log。

维护

  • 当询问某段区间时,把区间覆盖的整块打上一个num标记,两边离散的块呢,就暴力就好了。最后输出时把num加上。询问区间如果在一个块里要特判,所以要多打几个if。

不废话了,请看代码

#include
#define ll long longusing namespace std;ll n,k;struct block{ ll val;//数值 ll idd;//第几块}a[50010];ll num[50010];inline void add(int l,int r,int c){ if(a[r].idd-a[l].idd<2) { for(int i=l;i<=r;i++) a[i].val+=c; return ; } for(int i=a[l].idd+1;i
Block Code

 

转载于:https://www.cnblogs.com/maoyingcheng/p/11252470.html

你可能感兴趣的文章
普通用户也能运行WCF服务端
查看>>
创建一个存储过程,接受1个部门编号,利用传出参数返回月薪高于该部门平均月薪的人数。...
查看>>
the ruby resources
查看>>
一个稍微整理过的curl函数
查看>>
解决Flex4 amchart 日期出现两个月的问题
查看>>
java环境配置错误集锦
查看>>
【SICP练习】81 练习2.53
查看>>
poj3335 Rotating Scoreboard
查看>>
yum安装jdk如何配置JAVA_HOME
查看>>
nefu 三国之战
查看>>
creat-react-app搭建的项目中按需引入antd以及配置Less和如何修改antd的主题色
查看>>
IIS安装
查看>>
c#核心基础-委托
查看>>
VS2008试用版到期解决办法
查看>>
luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree
查看>>
html块级元素和行级元素的区别和使用
查看>>
for循环嵌套
查看>>
寒冬夜行人
查看>>
bat for循环
查看>>
poj1151 Atlantis
查看>>