AtCoder AGC030-B题解报告

作者 : 开心源码 本文共1459个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共146人阅读

一、题目

https://atcoder.jp/contests/agc030/tasks/agc030_b

二、分析

1.png

如上图所示,0是Takahashi的住处。1,2,3,4,5是五棵树的位置。对于每棵树,都有逆时针和顺时针两个方向。
(1)逆时针到达第1棵树所能经过的最大距离为0(逆时针)-> 2(顺时针)-> 1,顺时针到达第1棵树所能经过的最大距离为0(顺时针)-> 1。
(2)逆时针到达第2棵树所能经过的最大距离为0(逆时针)-> 1(顺时针) -> 3(逆时针) -> 2,顺时针到达第2棵树所能经过的最大距离为0(顺时针) -> 3(逆时针) -> 1(顺时针)-> 2。
(3)逆时针到达第3棵树所能经过的最大距离为0(逆时针)-> 1(顺时针) -> 5(逆时针)-> 2(顺时针)-> 4(逆时针)-> 3,顺时针到达第3棵树所能经过的最大距离为0(顺时针) -> 5(逆时针) -> 1(顺时针)-> 4(逆时针) -> 2(顺时针) -> 3(逆时针)。
(4)逆时针到达第4棵树所能经过的最大距离为0(逆时针)-> 3(顺时针) -> 5(逆时针) -> 4,顺时针到达第4棵树所能经过的最大距离为0(顺时针) -> 5(逆时针) -> 3(顺时针)-> 4。
(5)逆时针到达第5棵树所能经过的最大距离为0(逆时针)-> 5,顺时针到达第5棵树所能经过的最大距离为0(逆时针)-> 4(顺时针) -> 5。
上面计算出N * 2 = 5 * 2 = 10个距离,找出最大值即为所求。

在计算距离之前,要计算:①逆时针经过每一棵树并返回到原点的累积距离,存到l数组中;②顺时针到达每一棵树并返回原点的累积距离,存到r数组中。
而后计算总距离时,哪一棵树没有经过,就要把相应的距离减掉。
以逆时针经过第2棵树为例,经过的距离为X[2] + l[1]+ r[3] – 从0点到第4棵树的往返距离 – 从0点到第5棵树的往返距离。
具体可看下面的代码。

三、AC代码

#include <bits/stdc++.h>typedef long long ll;using namespace std;int L, N, X[200000];ll r[200001], l[200001], MAX;int main(){    cin >> L >> N;    for (int i = 0; i < N; ++i)    {        cin >> X[i];    }    for (int i = 0; i < N; ++i)    {        // 逆时针,不是当前树的往返距离,而是累积当前经过的所有的树的往返距离        l[i + 1] = l[i] + X[i] * 2;    }    for (int i = N - 1; i >= 0; --i)    {        // 顺时针,不是当前树的往返距离,而是累积当前经过的所有的树的往返距离        r[i] = r[i + 1] + (L - X[i]) * 2;    }    for (int i = 0; i < N; ++i)    {        // 逆时针,左右两棵树一定会到达        ll cnt = X[i] + l[i] + r[i + 1];        if (i >= N - (i + 1))        {            // 当前树的位置大于等于N的一半,要减去经过但没停下来的树            cnt -= l[i - (N - (i + 1))];        }        else        {            // 当前树的位置小于N的一半,要减去经过但没停下来的树            cnt -= r[i + 1 + i + 1];        }        MAX = max(MAX, cnt);        // 顺时针,与逆时针情景相似        cnt = L - X[i] + l[i] + r[i + 1];        if (i <= N - (i + 1))        {            cnt -= r[i + 1 + i];        }        else        {            cnt -= l[i - (N - (i + 1)) - 1];        }        MAX = max(MAX, cnt);    }    cout << MAX << endl;    return 0;}

TopCoder & Codeforces & AtCoder交流QQ群:648202993

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » AtCoder AGC030-B题解报告

发表回复