首页 > 其他分享 >ARC 175 C 题解

ARC 175 C 题解

时间:2024-03-26 20:23:48浏览次数:18  
标签:题解 long else 最小值 ARC && ans 175 getchar

我们考虑经典套路,假设前 \(i - 1\) 个数已经被确定。

设 \(f_k(x)\) 表示 \(a_k = x\) 时 \(\sum_{i = k + 1}^n | \ a_i - a_{i - 1} \ |\) 的最小值。

那么,\(a_i = x\) 当且仅当 \(x\) 取最小值且 \(| \ x - a_{i - 1} \ | + f_i(x)\) 为所有可能中的最小值。

我们设集合 \(I_k = \operatorname{argmin}_{x \in [l_k, r_k]} f_k(x)\)。

一个奇妙性质:\(I_k\) 一定是一个区间。

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


我们考虑 \(f_k(x)\) 怎么求。

丁真一下。我们可以考虑直接贪心。若 \(a_i = p\),则 \(a_{i + 1}\) 取 \(\operatorname{argmin}_{x \in [l_k, r_k]} | \ x - p \ |\)。然后转移还是比较简单的。

我们设 \(m_k = \min_{x \in [L_k, R_k]}\{f_k(x)\}\):

\[f_k(x) = \begin{cases} m_{k+1} + l_k - x & (x < l_k)\\ m_{k+1} & (x\in [l_k, r_k])\\ m_{k+1} + x - r_k & (r_k < x) \end{cases} \]

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

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

  • 如果 \([L_k, R_k] \cap I_{k+1} \neq \emptyset\),则 \(I_k = [L_k, R_k] \cap I_{k+1}\)。
  • 如果 \(R_k < l_{k + 1}\),则 \(I_k = R_k\)。
  • 如果 \(L_k > r_{k + 1}\),则 \(I_k = L_k\)。

综上,我们求出了 \(I\)。\(f\) 实际上不需要求出。


回到原题。我们要找到 \(x\) 使 \(x\) 取最小值且 \(| \ x - a_{i - 1} \ | + f_i(x)\) 为所有可能中的最小值。

仍然是大力分讨:

  • \(a_{i - 1} \in I_i\) 时,\(a_i = a_{i - 1}\)。

  • \(L_i \leq a_{i - 1} < l_i\) 时,\(a_i = a_{i - 1}\)。

  • \(a_{i - 1} < L_i\) 时,\(a_i = l_i\)。

  • \(a_{i - 1} > r_i\) 时,\(a_i = r_i\)。

发现上述过程可以简化为 \(a_i\) 取 \([L_i, r_i]\) 中最靠近 \(a_{i - 1}\) 的值。


以下是代码实现。

#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;
}

标签:题解,long,else,最小值,ARC,&&,ans,175,getchar
From: https://www.cnblogs.com/aemmprty/p/18097471

相关文章

  • 【蓝桥杯省赛真题33】python单词排序 中小学青少年组蓝桥杯比赛 算法思维python编程省
     目录python单词排序一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python单词排序第十三届蓝桥杯青少年组python比赛省赛真题一、题目要求(注:input......
  • AT_arc174_b [ARC174B] Bought Review 题解
    题目翻译针对\(T\)个测试用例解决以下问题:在美食评论网站EatCocoder上,你可以评论餐厅的星级(从\(1\)到\(5\)的整数)。最初,由厨师长\(B\)管理的餐厅有\(A_i\)条\(i\)星级评价。(\(1≤i≤5\))厨师可以向EatCocoder管理部门行贿提供\(P_i\)日元,以获得一......
  • AT_arc174_a [ARC174A] A Multiply 题解
    题目翻译给你一个长度为\(N\)的整数序列,\(A=(A_1,A_2,…,A_N)\),和一个整数\(C\)。在执行以下操作最多一次后,找出A中元素的最大可能和:选择两个整数\(l\)和\(r\)(\(1≤l≤r≤N\)),将\(A_l,A_{l+1},…,A_r\)分别乘以\(C\)。算法法一(暴力)可以\(O_{(N^2)}\)暴力......
  • java用es报错ElasticsearchStatusException[Elasticsearch exception [type=x_content
    java报错ElasticsearchStatusException[Elasticsearchexception[type=x_content_parse_exception,reason=[1:55][bool]failedtoparsefield[must]]];nested:ElasticsearchException[Elasticsearchexception[type=parsing_exception,reason=[match]unknowntoke......
  • 20240326每日一题题解
    20240326每日一题题解Problem给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。2<=......
  • ArcGIS Desktop使用入门(二)常用工具条——地理配准
    系列文章目录ArcGISDesktop使用入门(一)软件初认识ArcGISDesktop使用入门(二)常用工具条——标准工具ArcGISDesktop使用入门(二)常用工具条——编辑器ArcGISDesktop使用入门(二)常用工具条——数据驱动页面ArcGISDesktop使用入门(二)常用工具条——基础工具ArcGISDesktop......
  • ElasticSearch理论指导
    引子本文致力于ElasticSearch理论体系构建,从基本概念和术语讲起,具体阐述了倒排索引和TransLog,接着讲了ElasticSearch的增删改查的流程和原理,最后讲了讲集群的选举和脑裂问题。前言大碗宽面-Kafka一本道万事通,上一篇文章被评论区的老哥们夸了,夸我写的很有体系,哈哈,真是过赞......
  • 问题解答:ABAP 关键字 ANY TABLE 的使用场合深入剖析
    本教程下面这篇讲述ABAP动态编程的文章,有朋友提问:127.答网友疑问:ABAPFunctionModule如何支持内表结构不确定的动态输入参数汪老师,我这边定义了一个ANYTABLE,但是报错,说是没有这个类型,我在SE38定义的时候也报错,只有用FIELD-symbols定义才不会报错,所以就很好奇为什......
  • ccf-csp-2020-12-2期末预测之最佳阈值(c++满分题解)
    这个题暴力是可以有70分的,下面是暴力代码:(注释写的比较清楚了,也很好理解)#include<iostream>#include<vector>#include<set>#include<algorithm>usingnamespacestd;boolsort1(pair<int,int>vec1,pair<int,int>vec2)//对阈值从小到大排序{ returnvec1.first<=ve......
  • ElasticSearch
    简介    es是一个高度可伸缩的开源全文搜索引擎,es让你可以快速,实时地存储,搜索和分析大量数据,它通常作为互联网应用的内部搜索引擎,为需要复杂搜索功能的应用提供支持。    es是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于R......