LOJ.数列分块入门3
题目
分析
由大题目知此题分块
注意处理前驱下标的合法性
\(Code\)
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], t[N], st[N], ed[N], be[N], tag[N];
void Sort(int x)
{
for(register int i = st[x]; i <= ed[x]; i++) t[i] = a[i];
sort(t + st[x], t + ed[x] + 1);
}
void prepare()
{
int num = (int)sqrt(n);
for(register int i = 1; i <= num; i++) st[i] = n / num * (i - 1) + 1, ed[i] = n / num * i;
ed[num] = n;
for(register int i = 1; i <= num; i++)
{
for(register int j = st[i]; j <= ed[i]; j++) be[j] = i;
Sort(i);
}
}
void update(int l, int r, int c)
{
int x = be[l], y = be[r];
if (x == y)
{
for(register int i = l; i <= r; i++) a[i] += c;
Sort(x); return;
}
for(register int i = l; i <= ed[x]; i++) a[i] += c;
for(register int i = st[y]; i <= r; i++) a[i] += c;
for(register int i = x + 1; i <= y - 1; i++) tag[i] += c;
Sort(x), Sort(y);
}
int get(int x, int y, int c)
{
if (!x || !y) return x + y;
int p = c - t[x] - tag[be[x]], q = c - t[y] - tag[be[y]];
return (p < q) ? (x) : (y);
}
int query(int l, int r, int c)
{
int x = be[l], y = be[r], p, q = 0x3f3f3f3f;
if (x == y)
{
for(register int i = l; i <= r; i++)
if (a[i] + tag[x] < c && c - a[i] - tag[x] < q) q = c - a[i] - tag[x];
return (q == 0x3f3f3f3f) ? (-1) : (c - q);
}
for(register int i = l; i <= ed[x]; i++)
if (a[i] + tag[x] < c && c - a[i] - tag[x] < q) q = c - a[i] - tag[x];
for(register int i = st[y]; i <= r; i++)
if (a[i] + tag[y] < c && c - a[i] - tag[y] < q) q = c - a[i] - tag[y];
for(register int i = x + 1; i <= y - 1; i++)
{
p = lower_bound(t + st[i], t + ed[i] + 1, c - tag[i]) - t - 1;
if (p < st[i]) continue;
if (c - t[p] - tag[i] < q) q = c - t[p] - tag[i];
}
return (q == 0x3f3f3f3f) ? (-1) : (c - q);
}
int main()
{
scanf("%d", &n);
for(register int i = 1; i <= n; i++) scanf("%d", &a[i]);
prepare();
for(register int i = 1, opt, l, r, c; i <= n; i++)
{
scanf("%d%d%d%d", &opt, &l, &r, &c);
if (opt == 0) update(l, r, c);
else printf("%d\n", query(l, r, c));
}
}
LOJ.数列分块入门3的更多相关文章
- LOJ 数列分块入门 9 题解题报告
LOJ 数列分块入门 9 题解题报告 \(\text{By DaiRuiChen007}\) I. 数列分块入门 1 题目大意 \(\text{Link}\) 维护一个长度为 \(n\) 的序列,支持 ...
- [Loj] 数列分块入门 1 - 9
数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...
- loj 数列分块入门 6 9(区间众数)
6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...
- loj 数列分块入门 5 7 8
5 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和. 思路 用\(tag\)记录这一块是否已全为\(1\). 除分块外,还可用 树状数组+并查集(链表) 或者 线 ...
- LOJ 数列分块入门系列
目录 1.区间加+单点查 每个块维护tag,散的暴力改. code: #include<bits/stdc++.h> using namespace std; const int maxn ...
- LOJ 6277:数列分块入门 1(分块入门)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
随机推荐
- 在Windows模拟器中使用LVGL8.3
引言 LVGL是一个跨平台.轻量级.易于移植的图形库.也因其支持大量特性和其易于裁剪,配置开关众多,且版本升级较快,不同版本之间存在一定的差异性,相关的使用教程有一定的滞后性,由于缺少最新版本的中文教 ...
- Clickhouse表引擎之MergeTree
1.概述 在Clickhouse中有多种表引擎,不同的表引擎拥有不同的功能,它直接决定了数据如何读写.是否能够并发读写.是否支持索引.数据是否可备份等等.本篇博客笔者将为大家介绍Clickhouse中 ...
- 社论 22.10.14 区间在线去重k小
浅谈区间在线去重k小 关于讨论 https://www.luogu.com.cn/discuss/509205 本文将描述一种分块做法以及讨论中提出的各种 \(O(n \ \text{polylog} ...
- 浏览器内存漫游解决方案(js逆向)
//浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ...
- 常用BOM操作 DOM操作 事件 jQuery类库
目录 BOM操作 常用BOM操作 三种弹出框 alert confirm prompt 定时任务 setTimeout 循环定时 setInterval DOM操作 查找标签 直接查找 间接查找 操作 ...
- Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决
前言 在学习<Python从入门到精通(第2版)>的第15章 GUI界面编程--15.2.4 将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学有所帮助 ...
- CONDITION EVALUATION DELTA热部署启动失效
1.问题描述 我在启动一个SpringBoot项目的时候,在启动中控制台不停的打印日志(如下图所示) 2.产生原因 当时我是看了这篇文章后CONDITION EVALUATION DELTA_苦逼码农 ...
- screenfetch—最炫酷的查看你的设备信息
screenfetch是一个很方便的并且很炫酷的一个程序,它可以做到很炫酷的输出你想要看到的系统信息. 只需要短短一行命令,就可以快速的安装上它.! 并且可以直观的显示出来,当前设备的信息.
- [OpenCV实战]43 使用OpenCV进行背景分割
运动背景分割法Background Segment主要是指通过不同方法拟合模型建立背景图像,将当前帧与背景图像进行相减比较获得运动区域.下图所示为检测图像: 通过前面的检测帧建立背景模型,获得背景图像 ...
- Flutter异常监控 - 叁 | 从bugsnag源码学习如何追溯异常产生路径
如果觉得文章对你有帮助,点赞.收藏.关注.评论,一键四连支持,你的支持就是我创作最大的动力. ️ 本文原创听蝉 公众号:码里特别有禅 欢迎关注原创技术文章第一时间推送 ️ 前言 没错,继Flutte ...