ARC 175 C 题解

我们考虑经典套路,假设前 i1 个数已经被确定。

fk(x) 表示 ak=xi=k+1n| aiai1 | 的最小值。

那么,ai=x 当且仅当 x 取最小值且 | xai1 |+fi(x) 为所有可能中的最小值。

我们设集合 Ik=argminx[lk,rk]fk(x)

一个奇妙性质:Ik 一定是一个区间。

感性理解。容易发现 fk 是一个凸函数,所以当取到最小值时,取值定为一个区间。


我们考虑 fk(x) 怎么求。

丁真一下。我们可以考虑直接贪心。若 ai=p,则 ai+1argminx[lk,rk]| xp |。然后转移还是比较简单的。

我们设 mk=minx[Lk,Rk]{fk(x)}

fk(x)={mk+1+lkx(x<lk)mk+1(x[lk,rk])mk+1+xrk(rk<x)

以上贪心可以通过大力分讨得证。但是这一眼正确吧。

那么我们观察 fk(x) 的转移式,发现最小值是非常能确定的。于是得到下列结论:

  • 如果 [Lk,Rk]Ik+1,则 Ik=[Lk,Rk]Ik+1
  • 如果 Rk<lk+1,则 Ik=Rk
  • 如果 Lk>rk+1,则 Ik=Lk

综上,我们求出了 If 实际上不需要求出。


回到原题。我们要找到 x 使 x 取最小值且 | xai1 |+fi(x) 为所有可能中的最小值。

仍然是大力分讨:

  • ai1Ii 时,ai=ai1

  • Liai1<li 时,ai=ai1

  • ai1<Li 时,ai=li

  • ai1>ri 时,ai=ri

发现上述过程可以简化为 ai[Li,ri] 中最靠近 ai1 的值。


以下是代码实现。

#include <bits/stdc++.h>
using namespace std;

long long read() {
    char c = getchar();
    long long x = 0, p = 1;
    while ((c < '0' || c > '9') && c != '-') c = getchar();
    if (c == '-') p = -1, c = getchar();
    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x * p;
}

const int N = 5e5 + 7;

int n;
int l[N], r[N], L[N], R[N];
int ans[N];

void solve() {
    n = read();
    for (int i = 1; i <= n; i ++)
        L[i] = read(), R[i] = read();
    l[n] = L[n], r[n] = R[n];
    for(int i = n - 1; i >= 1; i --) {
        if (R[i] < l[i + 1]) {
            l[i] = r[i] = R[i];
        } else if (L[i] > r[i + 1]) {
            l[i] = r[i] = L[i];
        } else {
            l[i] = max(L[i], l[i + 1]);
            r[i] = min(R[i], r[i + 1]);
        }
    }
    ans[1] = l[1];
    for(int i = 2; i <= n; i++) {
        if (ans[i - 1] >= l[i] && ans[i - 1] <= r[i])
            ans[i] = ans[i - 1];
        else if (ans[i - 1] >= L[i] && ans[i - 1] < l[i])
            ans[i] = ans[i - 1];
        else if (ans[i - 1] < L[i])
            ans[i] = L[i];
        else ans[i] = r[i];
    }
    for(int i = 1; i <= n; i ++) cout << ans[i] << ' ';
}

signed main() {
    int t = 1;
    while (t --) solve();
    return 0;
}

作者:DE_aemmprty

出处:https://www.cnblogs.com/aemmprty/p/18097471

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DE_aemmprty  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示