首页 > 编程语言 >分块算法

分块算法

时间:2024-09-07 21:13:57浏览次数:4  
标签:初始化 分块 int long 算法 block 1000

#include<algorithm>
using namespace std;
int add[1000];
int st[1000], ed[1000],pos[1000];
long long a[10000];
long long sum[1000] = { 0 };
//初始化块
void init(int n) {
	int block = sqrt(n);
	int t = n / block;
	if (n % block) t++;  //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 change(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);
	}
}

//区间查询
long long ask(int L, int R) {
	int p = pos[L], q = pos[R];
	long long 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;
}```

标签:初始化,分块,int,long,算法,block,1000
From: https://www.cnblogs.com/oQAQo/p/18402158

相关文章

  • 算法设计与分析(乘船问题
    目录题目描述解题思路代码实现小结:题目描述给定一批轮船,每艘轮船的最大载重量均为M,每艘船最多只允许装两个人,旅客总人数最多为50人。每个旅客的体重不同。现要求设计算法求出装走所有旅客所需轮船的最少数量。输入格式:第一行输入为每艘船的最大载重量M和旅客总人......
  • Matlab/Simulink和AMEsim联合仿真(以PSO-PID算法为例)
    目录安装软件和配置环境变量Matlab/Simulink和AMEsim联合仿真详细流程非常重要的一点Simulink模型和AMEsim模型用S-Function建立连接从AMEsim软件打开MatlabMatlab里的设置Matlab的.m文件修改(对于PSO-PID算法)运行程序我印象中好像做过Matlab/Simulink和AMEsim联合仿......
  • 【C++算法全真练习题】迷宫问题
    目录题目描述思路AC解答题目描述‌题目描述‌:‌给定一个二维迷宫,‌其中 0 表示可以走的路,‌1 表示障碍物。‌起点坐标为 (0,0),‌终点坐标为 (m-1,n-1),‌其中 m 和 n 分别是迷宫的行数和列数。‌你需要使用广度优先搜索(‌BFS)‌找到从起点到终点的一条路径......
  • 数据结构与算法(3)栈和队列
    1.前言哈喽大家好啊,今天博主继续为大家带来数据结构与算法的学习笔记,今天是关于栈和队列,未来博主会将上一章《顺序表与链表》以及本章《栈与队列》做专门的习题应用专题讲解,都会很有内容含量,欢迎大家多多支持,你的鼓励是我最大的动力,我们码上见!2.正文2.1栈2.1.1结构定义......
  • Python数学建模算法与应用例题
    2.21.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga3.gggacggatacggattctggccacggacggaaaggaggacacggcggacataca4.atggataacggaaacaaaccagacaaacttcggtagaaatacagaagctta5.cggctggcggacaacggactggcggatt......
  • 66 道前端算法面试题附思路分析助你查漏补缺
    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个......
  • 828华为云征文|华为云Flexus X实例部署安装Jupyter Notebook,学习AI,机器学习算法
    前言由于本人最近在学习一些机器算法,AI算法的知识,需要搭建一个学习环境,所以就在最近购买的华为云FlexusX实例上安装了学习环境,JupyterNotebook。没想到效果格外的,由于华为云FlexusX实例做了很多底层的性能优化,依托创新的大模型支持和智能全域调度,X-Turbo加速技术让常见......
  • LeetCodeTest算法测试 传递一个数组和一个特定的目标整型数字,返回的两个数组元素相加
    1importjava.util.ArrayList;2importjava.util.List;34publicclassLeetCodeTest{5publicstaticvoidmain(String[]args){67int[]intArr=newint[]{2,7,11,15};8List<CustomerIntIndex>customerIntIndexL......
  • 基于基尼指数构建分类决策树[算法+示例]
    0前言本文主要讲述使用基尼指数构建二叉决策树的算法,并给出例题一步步解析,帮助读者理解。本文所使用的数据集:贷款.CSV。读者需要具备的知识:基尼指数计算。1基于基尼指数的分类树构建算法选择最优特征进行分裂:对于决策树的每个节点,遍历数据集中的所有特征。对于每个特......
  • 关于ST-CNN的算法详解
    ST-CNN(时空卷积神经网络)是一种结合了时间和空间维度信息处理的深度学习模型,它在多个领域,如交通流量预测、视频分析、动作识别等中都有广泛应用。以下是对ST-CNN算法的详细解析:一、基本概念ST-CNN通过结合卷积神经网络(CNN)和图卷积网络(GCN)的优势,能够同时捕捉数据的空间和时间特......