题目

https://loj.ac/p/6282

题解

数据范围 \(1 \leq n \leq 10^5\),因此进行分块最多分 \(\sqrt{10^5} ≈ 318\) 块。且数据是随机生成的,因此插入数据后,每个块的长度期望值为 \(\frac{318+(318 + 100000/318)}{2} ≈ 475\)。因此,可以使用分块思想解决该问题。

对于每个块,都用一个数组维护,并且维护每个块的元素个数。

对于查询操作,从第一块开始累计元素的个数,易知该步骤的时间复杂度为 \(O(\sqrt{n})\)。当找出 \(a_r\) 所在的块的时候,直接取出该元素即可。

对于插入操作,先查询出要插入的元素是需要插入到第几个块,该步操作时间复杂度 \(O(\sqrt{n})\),随后使用插入排序的思想进行插入,由于每个块的块长期望为 \(\sqrt{n}\) 级别,因此该步操作的时间复杂度也是 \(O(\sqrt{n})\)。

参考代码

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std; typedef long long ll;
constexpr int N = 100327;
int n, op, l, r, c, len;
int a[320][N];//1e5个元素,最多只需要分为317个块 int getPieceSize(int pid) {//获取第pid个块的块长。此处是计算初始块长,添加元素该函数失效
return min(n, pid * len) - (pid - 1) * len;
} int main() {
IOS
cin >> n;
len = sqrt(n);//块长,最后一块可能不满len个元素
int num = 1;//块数
for (int i = 1; i <= n; ++ i) {
cin >> a[num][i % len];
if (i % len == 0) {
a[num][len] = a[num][0];
++ num;
}
}
//把每个块的元素个数存储在a[i][0]
for (int i = 1; i <= num; ++ i) a[i][0] = getPieceSize(i);
for (int i = 0; i < n; ++ i) {
cin >> op >> l >> r >> c;
if (op) {//询问 a[r] 的值
for (int i = 1, j = 0; i <= num; ++ i) {
if (j + a[i][0] < r) j += a[i][0];
else {
cout << a[i][r - j] << '\n';
break;
}
}
} else {//在第 l 个数字前插入数字 r
for (int i = 1, j = 0; i <= num; ++ i) {
if (j + a[i][0] < l) j += a[i][0];
else {
for (int k = a[i][0]; k >= l - j; -- k) a[i][k + 1] = a[i][k];
a[i][l - j] = r;
a[i][0] ++;
break;
}
}
}
}
return 0;
}

【分块】LibreOJ 6282 数列分块入门6的更多相关文章

  1. LibreOJ 6282. 数列分块入门 6

    题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...

  2. LibreOJ 6282 数列分块入门 6(在线插入在线查询)

    题解:还是分块,将每个块存入vector,然后在插入的时候就是sqrt(n)级的重构,如果块太大了,暴力将这个块拆开. 代码如下: #include<cmath> #include< ...

  3. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  4. LibreOJ 6277. 数列分块入门 1 题解

    题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...

  5. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  6. LibreOJ 6278. 数列分块入门 2 题解

    题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...

  7. LOJ#6282. 数列分块入门 6

    一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...

  8. LOJ.6282.数列分块入门6(块状链表/分块)

    题目链接 1.分块(vector)+重构 //直接上vector(本机还是比较慢的...) 某块size较大时O(n)重构 //注意细节 #include <cmath> #include ...

  9. LibreOJ 6285. 数列分块入门 9

    题目链接:https://loj.ac/problem/6285 其实一看到是离线,我就想用莫队算法来做,对所有询问进行分块,但是左右边界移动的时候,不会同时更新数字最多的数,只是后面线性的扫了一遍, ...

  10. LibreOJ 6277. 数列分块入门 2

    题目链接:https://loj.ac/problem/6278 参考博客:https://blog.csdn.net/qq_36038511/article/details/79725027 这题我 ...

随机推荐

  1. 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

    全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类 摘要: 在 Python 中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类 ...

  2. BOOST 环形队列circular_buffer

    BOOST库的环形队列比较灵活,前插或后插,删除队首或删除队尾元素,都支持. 只贴代码: #include <boost/circular_buffer.hpp> #include < ...

  3. [namespace hdk] Balanced_tree 整合

    代码 #include<bits/stdc++.h> using namespace std; namespace hdk{ namespace balanced_tree{ const ...

  4. Ant-Design-Vue 图片上传

    功能演示 我们要实现的功能如下,有两个按钮,点击第一个按钮选择文件,选择文件后点击第二个按钮上传到服务器. 功能需求: 只允许上传 png.jpg/jpeg 格式的图片 没有上传图片时显示占位图 选择 ...

  5. java使用正则表达式验证手机号和电话号码和邮箱号码的方法

    验证手机号 我国的手机号一般是以1开头,后面跟着10位数字.因此,可以用如下正则表达式: public static boolean isValidPhoneNumber(String phoneNu ...

  6. mmap映射类型

    文件映射和匿名映射都是操作系统中对于内存映射的两种类型,主要应用于进程间的通信或者大量数据的处理. 文件映射,也就是内存映射文件,是把一个文件或者文件的一部分映射到进程的地址空间,它允许对文件进行随机 ...

  7. 墨天轮沙龙 | SphereEx代野:Apache ShardingSphere-从中间件到分布式生态演进之路

    在9月22日举办的[墨天轮数据库沙龙第十期-国产中间件专场]中,SphereEx 解决方案专家 代野分享了Apache ShardingSphere:从中间件到分布式生态演进之路>主题演讲,本文 ...

  8. 基于腾讯云短信接口和nodejs服务器实现手机号验证码

    知识储备:js基础.nodejs基础.ajax基础: 1. 手机验证码原理 表单提交,把手机号码传送到后端:后端拿到手机号码后根据相关算法随机形成一个验证码,并将其保存在数据库:用户拿到验证码后将验证 ...

  9. KubeKey 升级 Kubernetes 次要版本实战指南

    作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...

  10. ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇

    作者:运维有术 前言 知识点 定级:入门级 KubeKey 安装部署 ARM 版 KubeSphere 和 Kubernetes ARM 版 KubeSphere 和 Kubernetes 常见问题 ...