LOJ.数列分块入门3
2024-10-20 11:54:17
题目
分析
由大题目知此题分块
注意处理前驱下标的合法性
\(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));
}
}
最新文章
- TODO:Golang语言TCP/UDP协议重用地址端口
- Python的模块引用和查找路径
- configure: error: no acceptable C compiler found in $PAT 的解决方案
- C#操作Excel的函数
- JS判断输入是否为整数和数字的正则表达式
- TreeList的使用
- CUDA学习笔记(二)【转】
- Spring和SpringMVC的区别
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
- 28.怎样在Swift中实现单例?
- ACM2032
- tcp/ip连接
- CentOS minimal 版安装图形界面及中文语言
- shell是什么,各种shell的初步认识,适用于初学者
- Jenkins2 插件 Pipeline+BlueOcean 实现持续交付的初次演练
- Batchnorm
- pandas实现excel中的数据透视表和Vlookup函数功能
- swift 设置阴影和圆角
- Minimum Transport Cost HDU1385(路径打印)
- ECShop 调用自定义广告
热门文章
- orcl substr函数与java substring 的不同
- .net 温故知新:【10】.NET ORM框架EFCore使用入门之CodeFirs、DBFirst
- Qwt开发笔记(一):Qwt简介、下载以及基础demo工程模板
- uni 结合vuex 编写动态全局配置变量 this.baseurl
- #define 的神奇操作
- 【大数据-课程】高途-天翼云侯圣文-Day3-实时计算原理解析
- Burpsuite2022.1详细图文安装教程(含工具链接)
- 在Windows服务器安装禅道
- JavaScript:控制跳转:break、continue与标签
- Linux基础第五章 进程控制