题目

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. Java序列化、反序列化、反序列化漏洞

    目录 1 序列化和反序列化 1.1 概念 1.2 序列化可以做什么? 3 实现方式 3.1 Java 原生方式 3.2 第三方方式 4 反序列化漏洞 1 序列化和反序列化 1.1 概念 Java 中序 ...

  2. About CSP

    好了,猜猜今年第一题会考什么 linux 终端指令 这样吧 CTH 装了 ubuntu 系统的电脑被人施加了 rm -rf /home/Desktop/ 指令,导致他打不开桌面了,以下哪一个是 CTH ...

  3. 基于SqlAlchemy+Pydantic+FastApi的Python开发框架的路由处理

    在前面随笔<基于SqlAlchemy+Pydantic+FastApi的Python开发框架>中介绍了框架总体的内容,其中主要的理念就是通过抽象接口的方式,实现代码的重用,提高开发效率.本 ...

  4. Autodesk 3d Max2020 初始化闪退

    事件起因:给同事安装完 Autodesk 3d Max2020 版本之后,软件初始化就闪退,后来在网上查了资料后解决. 解决办法如下:services.msc --> Autodesk 开头的服 ...

  5. 解决 Vue 项目打包上线后客户端缓存的问题

    由于重新打包后会导致对应的 js 和 css 文件 hash 值发生变化,客户端不刷新的话就会存在之前的文件找不到,导致报错的问题. 通过 build.sh 定义打包命令 #!/usr/bin/env ...

  6. 进程D 状态的产生及原因解释

    在 Linux 系统中,进程的 D 状态表示进程处于不可中断的睡眠状态 (Uninterruptible Sleep).这种状态通常由进程等待某些资源或事件引起,这些资源或事件无法立即可用.以下是一些 ...

  7. 解决Spring Data JPA Hibernate的N+1查询问题的性能优化最佳方法

    最佳方法:定制@NamedEntityGraph.定制查询和定制VO,可以做到按照需要最佳查询,需要注意的地方:定制VO的字段一定要等于或小于实际查询的字段,才不会复制的时候触发N+1查询. 1 问题 ...

  8. vue前端开发仿钉图系列(6)左侧记事本的开发详解

    在页面开发中,深深的被element组件所吸引,里面很多小组件都可以直接使用.像是记事本提示.记事本列表时间线.右侧编辑页面的form表单,编辑和查看状态的切换等等,比之前iOS原生开发所有的东西都要 ...

  9. CSharp的@microsoft/signalr实时通信教程 - 前端 vue

    1. 安装@microsoft/signalr pnpm install @microsoft/signalr --save signalr 是微软对 websocket技术的封装,优化了操作 :1. ...

  10. 3. 用过Konva吗,用过他的api吗

    基础:使用konva,首先需要创建舞台也就是stage,然后创建一个Layer图层,将图层放到舞台上,将图形等内容放到图层上 ; 第一步:创建一个Stage舞台  , 就是创建一个 stage 实例 ...