有显然的 \(O(n^3)\) 做法,可以获得 \(38pts\)。(退火在洛谷上能跑 \(75pts\))

答案具有单调性,考虑二分一个 \(M\) 并判断。列出 \(i\) 到 \(j\) 的距离公式:

  1. 求出 \(l_i\) 的前缀和数组 \(L\),不加边的情况,\(i\) 和 \(j\) 的距离就是 \(L_j-L_i+d_i+d_j\)。

  2. 在 \(a,b\) 之间加入一条长度为 \(C\) 的边,距离和 \(|L_i-L_a|+|L_j-L_b|+d_i+d_j+C\) 取 \(\min\)。

注意到,在公式 \(1\) 中,如果值已经 \(\le M\) 的可以不用管。需要计算的是 \(1\) 中 \(\gt M\) 的 \((i,j)\) 中 \(2\) 式的最大值。

绝对值很不好看,将其暴力拆开:

\[L_i+L_j + d_i+d_j+C-M \le L_a+L_b \quad (L_i \ge L_a, L_j \ge L_b) \tag{1}
\]
\[L_i-L_j + d_i+d_j+C-M \le L_a-L_b \quad (L_i \ge L_a, L_j \lt L_b) \tag{2}
\]
\[L_i-L_j - d_i-d_j-C+M \ge L_a-L_b \quad (L_i \lt L_a, L_j \ge L_b) \tag{3}
\]
\[L_i+L_j - d_i-d_j-C+M \ge L_a+L_b \quad (L_i \lt L_a, L_j \lt L_b) \tag{4}
\]

对于公式 \((1)\),显然若括号内条件不成立,求出的答案一定会更小,无法更新最大值。

对于公式 \((2)(3)(4)\) 也是同理,若括号内条件不成立则不会对不等式的解集产生贡献。

所以,可以不考虑括号内的条件,分别求出上述 \(4\) 个不等式左边的最大/最小值,并考察是否有 \((a,b)\) 满足其不等式。

至于不等式左侧的最值,可以很方便地枚举 \(j\) 并使用单调队列求出最优的 \(i\)。求出左侧的 \(4\) 个最值后,直接枚举 \(b\),并维护 \(a\) 的两个可行区间,判断是否有交。

结合最外层的二分,本题时间复杂度为 \(O(n \log n)\),可以通过全部数据。

/**
* @file: shortcut.cpp
* @author: yaoxi-std
* @url:
*/
// #pragma GCC optimize ("O2")
// #pragma GCC optimize ("Ofast", "inline", "-ffast-math")
// #pragma GCC target ("avx,sse2,sse3,sse4,mmx")
#include <bits/stdc++.h>
using namespace std;
#define resetIO(x) \
freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout)
#define debug(fmt, ...) \
fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
template <class _Tp>
inline _Tp& read(_Tp& x) {
bool sign = false; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) sign |= (ch == '-');
for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48);
return sign ? (x = -x) : x;
}
template <class _Tp>
inline void write(_Tp x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar((x % 10) ^ 48);
}
bool m_be;
using ll = long long;
const int MAXN = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int n, cst, que[MAXN];
ll len[MAXN], dis[MAXN];
bool check(ll mid) {
int fr = 1, bk = 0;
// vmin: min{len[i]-dis[i]}, vmax: max{len[i]+dis[i]}
ll vmin = 1e18, vmax = -1e18;
// mx1 ~ mn4 对应 4 个式子
ll mx1 = -1e18, mx2 = -1e18, mn3 = 1e18, mn4 = 1e18;
for (int i = 1; i <= n; ++i) {
if (len[i] + dis[i] - vmin > mid) {
while (fr <= bk && len[i] - len[que[fr]] + dis[que[fr]] + dis[i] > mid)
vmax = max(vmax, len[que[fr]] + dis[que[fr]]), ++fr;
mx1 = max(mx1, vmax + len[i] + dis[i] + cst - mid);
mx2 = max(mx2, vmax - len[i] + dis[i] + cst - mid);
mn3 = min(mn3, vmin - len[i] - dis[i] - cst + mid);
mn4 = min(mn4, vmin + len[i] - dis[i] - cst + mid);
}
vmin = min(vmin, len[i] - dis[i]);
while (fr <= bk && dis[que[bk]] - len[que[bk]] <= dis[i] - len[i]) --bk;
que[++bk] = i;
}
if (mn4 < mx1 || mn3 < mx2) return false;
int l1 = n + 1, r1 = n, l2 = 1, r2 = 0;
for (int i = 1; i <= n; ++i) {
while (l1 > 1 && len[i] + len[l1 - 1] >= mx1) --l1;
while (l1 <= r1 && len[i] + len[r1] > mn4) --r1;
while (r2 < n && len[r2 + 1] - len[i] <= mn3) ++r2;
while (l2 <= r2 && len[l2] - len[i] < mx2) ++l2;
if (l1 > r1 || l2 > r2) continue;
if (max(l1, l2) <= min(r1, r2)) return true;
}
return false;
}
bool m_ed;
signed main() {
// resetIO(shortcut);
// debug("Mem %.5lfMB.", fabs(&m_ed - &m_be) / 1048576);
read(n), read(cst);
for (int i = 2; i <= n; ++i) read(len[i]);
for (int i = 1; i <= n; ++i) read(dis[i]);
for (int i = 2; i <= n; ++i) len[i] += len[i - 1];
ll l = 0, r = 1e18, ans = 1e18;
while (l <= r) {
ll mid = (l + r) >> 1;
if (check(mid)) {
r = mid - 1, ans = mid;
} else {
l = mid + 1;
}
}
write(ans), putchar('\n');
return 0;
}

[IOI2016] shortcut的更多相关文章

  1. Eclipse CDT: Shortcut to switch between .h and .cpp

    ctrl+ tab  is the default shortcut.You can change it in Window → Preferences → General → Keys: Toggl ...

  2. android shortcut &livefoulder

    android shortcut(实现步骤) 1.建立activity 2.minifest 里面注册并加上intent-filter,name为:android.intent.action.CREA ...

  3. 关于favicon.ico,shortcut icon,icon

    引入一篇文章.关于favicon.ico二三事. http://www.cnblogs.com/LoveJenny/archive/2012/05/22/2512683.html 一直对favicon ...

  4. Linux Shell shortcut

    Ctrl+a跳到第一个字符前Ctrl+x同上但再按一次会从新回到原位置 Details see below: Linux shell shortcut

  5. [转] Fix: Screen Clipping Shortcut In OneNote Not Working After Upgrading To Windows 8.1

    RECOMMENDED: Click here to fix Windows errors and optimize system performance No doubt, OneNote is y ...

  6. Xcode Custom Shortcut

    edit file "/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources" add < ...

  7. Android添加快捷方式(Shortcut)到手机桌面

    Android添加快捷方式(Short)到手机桌面 权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限. <!-- 添加快捷方式 --> <uses-permis ...

  8. Django views 中的 shortcut function

    shortcut function都在django.shortcuts这个包中,主要包含有:render(), render_to_response(), redirect(), get_object ...

  9. apple-touch-icon,shortcut icon和icon的区别(手机站发送到手机桌面图标自定义)

    apple-touch-icon 可以了解到这是一个类似网站favicon的图标文件,用来在iphone和ipod上创建快捷键时使用. 这个文件应当是png格式,57x57像素大小,放在网站根目录之下 ...

随机推荐

  1. JDBC数据库编程(java实训报告)

    文章目录 一.实验要求: 二.实验环境: 三.实验内容: 1.建立数据库连接 2.查询数据 2.1 测试结果 3.添加数据 3.1.测试结果 4.删除数据 4.1.测试结果 5.修改数据 5.1 测试 ...

  2. 齐博X1-栏目的调用1

    本节来说明下系统提供的几个栏目调用的方法 一节我们制作了一个公共导航,本节我们在首页index中演示下栏目的相关调用 至于其他的数据内容,参考第二季的标签调用即可,直接{qb:tag}调用就可以调用出 ...

  3. [Oracle]复习笔记-SQL部分内容

    Oracle笔记--SQL部分 整体框架 语句的执行顺序:from →where →group by→having→select→order by select * from * where * gr ...

  4. SpringBoot内置工具类,告别瞎写工具类了

    不知大家有没有注意到,接手的项目中存在多个重复的工具类,发现其中很多功能,Spring 自带的都有.于是整理了本文,希望能够帮助到大家! 一.断言 断言是一个逻辑判断,用于检查不应该发生的情况 Ass ...

  5. 华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践

    背景 湖仓一体(LakeHouse)是一种新的开放式架构,它结合了数据湖和数据仓库的最佳元素,是当下大数据领域的重要发展方向. 华为云早在2020年就开始着手相关技术的预研,并落地在华为云 Fusio ...

  6. 一次SpringBoot版本升级,引发的血案

    前言 最近项目组升级了SpringBoot版本,由之前的2.0.4升级到最新版本2.7.5,却引出了一个大Bug. 到底是怎么回事呢? 1.案发现场 有一天,项目组的同事反馈给我说,我之前有个接口在新 ...

  7. Prometheus 监测 RocketMQ 最佳实践

    本文作者:郭雨杰,阿里云智能技术专家. Prometheus 集成的 50 多款云产品中,RocketMQ 在可观测方面实现了非常完善的功能,是一个特别具有代表性的云产品. 01 RocketMQ如何 ...

  8. 1759D(数位变0)

    题目链接 题目大意: 给你两个整数n, m.你需要求一个数,它满足如下条件: 是n的整数倍,且倍数小于m. 你应该使其末尾的0尽可能的多(如100后面有2个零,1020后面有一个零,我们应该输出100 ...

  9. salesforce零基础学习(一百二十一)Limitation篇之Heap Size Limitation

    本篇参考: https://help.salesforce.com/s/articleView?id=000384468&type=1 https://help.salesforce.com/ ...

  10. 【DL论文精读笔记】Object Detection in 20 Y ears: A Survey目标检测综述

    目标检测20年综述(2019) 摘要 Abstract 该综述涵盖了400篇目标检测文章,时间跨度将近四分之一世纪.包括目标检测历史上的里程碑检测器.数据集.衡量指标.基本搭建模块.加速技术,最近的s ...