首页 > 其他分享 >分块

分块

时间:2024-03-12 15:22:24浏览次数:19  
标签:www 分块 int long html https block

与线段树类似。是暴力的优化版,详细见下两个链接

https://www.cnblogs.com/milky-w/p/8447724.html

https://www.cnblogs.com/Miracevin/p/9403620.html

 

 

板子:

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5;
int n, m, a[N], st[N], ed[N], pos[N], sum[N], add[N];
int op, x, y, k;
void init()
{
	int block=sqrt(n);
	int t=n/block;
	
	if (n%block) t++;
	
	for (int i=1; i<=t; i++)
	{
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
    ed[t]=n;
	for (int i=1; i<=n; i++) pos[i]=(i-1)/block+1;
	
	for (int i=1; i<=t; i++)
		for (int j=st[i]; j<=ed[i]; j++) sum[i]+=a[j];
}
void Add(int L, int R, int d)
{
	int p=pos[L], q=pos[R];
	if (p==q)
	{
		for (int i=L; i<=R; i++) a[i]+=d;
		sum[p]+=d*(R-L+1);
	}
	else
	{
		for (int i=p+1; i<=q-1; i++) add[i]+=d;
		
		for (int i=L; i<=ed[p]; i++) a[i]+=d;
		sum[p]+=d*(ed[p]-L+1);
		
		for (int i=st[q]; i<=R; i++) a[i]+=d;
		sum[q]+=d*(R-st[q]+1);
	}
}
int query(int L, int R)
{
	int p=pos[L], q=pos[R], ans=0;
	if (p==q)
	{
		for (int i=L; i<=R; i++) ans+=a[i];
		ans+=add[p]*(R-L+1);
	}
	else
	{
		for (int i=p+1; i<=q-1; i++) ans+=sum[i]+add[i]*(ed[i]-st[i]+1);
		
		for (int i=L; i<=ed[p]; i++) ans+=a[i];
		ans+=add[p]*(ed[p]-L+1);
		
		for (int i=st[q]; i<=R; i++) ans+=a[i];
		ans+=add[q]*(R-st[q]+1);
	}
	return ans;
}
signed main()
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%lld", &a[i]);
	init();
	
	while (m--)
	{
		scanf("%d", &op);
		if (op==1)
		{
			scanf("%d%d%lld", &x, &y, &k);
			Add(x, y, k);
		}
		else if (op==2)
		{
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query(x, y));
		}
	}
	return 0;
}

  

标签:www,分块,int,long,html,https,block
From: https://www.cnblogs.com/didiao233/p/18068394

相关文章

  • 分块小结
    分块概念就是把一个长序列分成\(\sqrt{n}\)个区间,分别维护每个区间内的信息和,然后查询时可以优化时间复杂度。还可以完成一些线段树完成不了的神秘操作,比如这道题。但是总体时间复杂度不如线段树,但它的扩展性比线段树还要强,因为分块中每个区间的信息和不需要具有传递性。怎......
  • 莫队与分块学习笔记
    分块思想介绍分块是一种思想,而不是一种数据结构。思想就是,将一块大的区间,转换成小的区间来处理。例如,在一个\(n\)长度上的数轴,我们可以将其分成\(\sqrtn\)个长度为\(\sqrtn\)的块来解决。典型问题对于一类很典型的问题,可以用分块来做。单点修改,区间查询这玩意咋......
  • 分块 学习笔记
    目录分块思想分块基础操作2.1\(O(\sqrtn)-O(\sqrtn)\)区间加、区间查询2.2\(O(1)-O(\sqrtn)\)区间加、单点查询2.3\(O(\sqrtn)-O(1)\)单点加、区间查询各种分块思路3.1对序列分块普通区间和维护区间\(k\)大等3.2对值域分块3.3对操作分块3.......
  • Ynoi 大分块系列
    最初分块先考虑怎么用分块维护区间第\(k\)小。首先肯定想到二分区间第\(k\)小,然后查询区间有多少个数小于等于\(x\)。但这样时间复杂度是\(\operatorname{O}(n\sqrt{n}\log^2n)\)的,无法通过此题。考虑这样一个事情,我们可以暴力枚举区间第\(k\)小,然后查询区间内有多......
  • 分块相关题目
    题单。UPD:题单里的题\(n=m\)。数列分块入门一看到区间修改\(+\)单点查询,考虑差分。考虑分块维护差分数组。对于修改操作,就对\(l\)位置\(+k\),\(r+1\)位置\(-k\);对于查询操作,查询\([1,x]\)的和即可。时间复杂度\(O(m\sqrt{n})\),可以通过。代码。数列分块入门二如......
  • 分块一览
    前言如题。值域分块顾名思义,就是在桶上分块。它的用处是把区间修改和区间询问中某一种操作变成\(O(1)\),另一种变成\(O(\sqrtn)\)。所以经常用来辅助维护两种操作数量严重不对等的数据结构。典型代表有莫队和根号分治。这里看一个莫队的例子。如我们要维护一个二维数点......
  • 分块和莫队
    1分块1.1概念简述分块被称为“优雅的暴力”。对于一个区间$[1,n]$,我们将其分成若干个块。在处理整块时直接维护整块信息,达到降低时间复杂度的目的。对于常规分块,设块长为$m$,则一般情况下$m$取$\sqrt{n}$时复杂度最优。下面举几例来说明分块如何降低时间复杂度。1.2......
  • 【学习笔记】分块学习笔记
    学习笔记索引分块经常听别人提起,我也学一下。正片分块就是将一个数列分成很多块,然后每块单独操作,最后的结果放到原数列里。分块的题目类型经常是区间中修改和查询。这里,一个长度为\(n\)的数列最多分成\(\sqrtn\)个块。先来看例题吧。例题P2357守墓人题目背景在一......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......
  • 分块
    分块前言在了解过树状数组和线段数之后,我们已经能处理许多区间的信息修改和查询的题目。但当信息不具有区间可加性时,用树状数组和线段树就不好处理了,这时候就可以用到一种优雅的暴力——分块。简介分块是一种思想,通过适当的划分,预处理一部分信息并保留,用空间换时间达到时空平......