【CF765F】Souvenirs
【CF765F】Souvenirs
题面
题解
我们可以发现,对于某个右端点\(i\),左端点\(j\)在由\(i\rightarrow 1\)的过程中,每一段的答案是单调不增的,由这个性质,我们想办法维护出加入右端点\(i\)后的答案。
我们只考虑形如\(j<i,a_i<a_j\)的答案,因为其他的情况我们只需要将值域翻转即可得到答案。
根据我们上面的说法,你首先需要找到一个\(j\),使得\(a_j>a_i\)且\(j\)最大,这个可以用值域线段树维护。然后我们又要找到一个一个\(j'\),使得\(a_{j'}-a_i<a_j-a_i\),那么我们可以令\(j=j'\),继续更新答案。
如果仅仅是这样的话,我们的复杂度还是不满足要求的,但是限制\(a_{j'}-a_i<a_j-a_i\)可以转化为\(a_{j'}-a_i<a_j-a_{j'}\),因为大于的情况之前肯定以及更新过了,那么我们没必要再次更新,而这个限制又可以变为\(a_{j'}-a_i<\frac 12(a_j-a_i)\),这样子每次值域减半的话复杂度可以保证。
而维护某个左端点的话可以用树状数组维护后缀取\(\min\)即可。
复杂度\(O(n\log ^2 10^9)\)。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int INF = 1e9;
const int MAX_N = 3e5 + 5;
vector<pair<int, int> > vec[MAX_N];
int N, M, a[MAX_N], ans[MAX_N];
int c[MAX_N];
inline int lb(int x) { return x & -x; }
void Add(int x, int v) { while (x) c[x] = min(c[x], v), x -= lb(x); }
int Min(int x) { int res = INF; while (x <= N) res = min(res, c[x]), x += lb(x); return res; }
struct Node { int ls, rs, v; } t[MAX_N << 5];
int rt[MAX_N], tot;
void modify(int &o, int p, int l, int r, int pos, int v) {
o = ++tot, t[o] = t[p], t[o].v = max(t[o].v, v);
if (l == r) return ;
int mid = (l + r) >> 1;
if (pos <= mid) modify(t[o].ls, t[p].ls, l, mid, pos, v);
else modify(t[o].rs, t[p].rs, mid + 1, r, pos, v);
}
int query(int o, int l, int r, int ql, int qr) {
if (!o || l > r) return 0;
if (ql <= l && r <= qr) return t[o].v;
int mid = (l + r) >> 1, res = 0;
if (ql <= mid) res = max(res, query(t[o].ls, l, mid, ql, qr));
if (qr > mid) res = max(res, query(t[o].rs, mid + 1, r, ql, qr));
return res;
}
void solve() {
for (int i = 1; i <= N; i++) c[i] = INF;
for (int i = 1; i <= tot; i++) t[i] = (Node){0, 0, 0};
tot = 0, memset(rt, 0, sizeof(rt));
for (int i = 1; i <= N; i++) modify(rt[i], rt[i - 1], 0, INF, a[i], i);
for (int i = 1; i <= N; i++) {
int j = query(rt[i - 1], 0, INF, a[i], INF);
while (j) {
Add(j, a[j] - a[i]);
j = query(rt[j - 1], 0, INF, a[i], ((a[i] + a[j]) >> 1) - (~(a[i] + a[j]) & 1));
}
for (auto it : vec[i]) ans[it.second] = min(ans[it.second], Min(it.first));
}
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
N = gi();
for (int i = 1; i <= N; i++) a[i] = gi();
M = gi();
for (int i = 1; i <= M; i++) {
int l = gi(), r = gi();
vec[r].push_back(make_pair(l, i));
ans[i] = INF;
}
solve();
for (int i = 1; i <= N; i++) a[i] = INF - a[i];
solve();
for (int i = 1; i <= M; i++) printf("%d\n", ans[i]);
return 0;
}
【CF765F】Souvenirs的更多相关文章
- 【CF765F】Souvenirs 主席树
[CF765F]Souvenirs 题意:给你一个长度为n的序列{ai},有m个询问,每次询问给出l,r,问在所有$l\le x < y\le r$中,$|a_x-a_y|$的最小值是多少. $ ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- Django中一些常用的文档段落
1. Settings¶ STATIC_URL¶ MEDIA_ROOT¶ MEDIA_URL¶ AUTH_USER_MODEL¶ USE_I18N¶ USE_L10N¶ USE_TZ¶ (三者默 ...
- C++:构造函数
问题提出 默认初始化 答案 ▶问题提出 主要是在VC++ 2015里经常提示莫名其妙的编译错误. 分析一下,为什么Java里构造函数这个问题很简单: 1. C++里对象类型不止有按引用传递,还可能拷贝 ...
- ssh tunneling应用案例-AWS EC2 vnc图形化桌面的支持
一般地,无论是AWS EC2还是阿里云的云主机,linux系统默认都只提供ssh登录方式.如果你是一个技术控,非常希望把图形化界面给折腾出来,这其中就不需有vnc server的支持,除此之外,还涉及 ...
- 使用基础知识完成java小作业?强化练习-1.输入数组计算最大值-2.输出数组反向打印-3.求数组平均值与总和-4.键盘输两int,并求总和-5.键盘输三个int,并求最值;
完成几个小代码练习?让自己更加强大?学习新知识回顾一下基础? 1.输入数组计算最大值 2.输出数组反向打印 3.求数组平均值与总和 4.键盘输两int,并求总和 5.键盘输三个int,并求最值 /* ...
- Java自学-I/O File类
Java 的File类,以及常用方法 文件和文件夹都是用File代表 步骤 1 : 创建一个文件对象 使用绝对路径或者相对路径创建File对象 package file; import java.io ...
- 2.JavaScript中的原型规则以及原型设计模式
原型规则 原型规则 所有的引用类型(数组.对象.函数),都具有对象特征,即可自由扩展属性: 所有的引用类型,都有一个_proto_ 属性(隐式原型),属性值是一个普通对象: 所有函数,都具有一个pro ...
- main process exited, code=exited, status=203/EXEC
问题描述: Oct :: c_3. systemd[]: Started etcd. Oct :: c_3. systemd[]: Starting etcd... Oct :: c_3. syste ...
- (1)jmeter录制脚本(使用代理的方式)
(1)jmeter录制脚本(使用代理的方式) jmeter 2018年07月09日 17时27分24秒 很多APP使用badboy是无法录制的,这种情况下需要使用chrome或Firefox,如果能联 ...
- lvs+keepalived高可用负载均衡
一.实验环境和网络拓扑图 本实验需要5台虚拟机,一台客户机,2台lvs调度器,两台web服务器. 客户机:192.168.0.6/24 lvs1:192.168.0.201/24 lvs2:192.1 ...
- 基于gin框架搭建的一个简单的web服务
刚把go编程基础知识学习完了,学习的时间很短,可能还有的没有完全吸收.不过还是在项目中发现知识,然后在去回顾已学的知识,现在利用gin这个web框架做一个简单的CRUD操作. 1.Go Web框架的技 ...