{"id":288,"date":"2023-01-23T21:40:51","date_gmt":"2023-01-23T13:40:51","guid":{"rendered":"http:\/\/yuri3.cn\/?p=288"},"modified":"2023-02-12T03:32:24","modified_gmt":"2023-02-11T19:32:24","slug":"solution-for-atcoder-beginner-contest-286","status":"publish","type":"post","link":"http:\/\/yuri3.cn\/?p=288","title":{"rendered":"Solution for AtCoder Beginner Contest 286"},"content":{"rendered":"<p>\u4eca\u5e74\u7684\u5e74\u5473\u786e\u5b9e\u4e0d\u6d53\uff0c\u5f88\u65e0\u804a\uff0c\u4e8e\u662f\u6253\u6253AtCoder\u9632\u6b62\u667a\u529b\u4e0b\u964d\u3002<\/p>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/atcoder.jp\/contests\/abc286\">\u9898\u76ee\u94fe\u63a5<\/a><\/p>\n<p><!--more--><\/p>\n<h2>A &#8211; Range Swap<\/h2>\n<p>\u6709\u4e2a\u4e1c\u897f\u53eb<code>std::swap_ranges<\/code>\uff0c\u76f4\u63a5\u7528\u5c31\u884c\u4e86\u3002<\/p>\n<h2>B &#8211; Cat<\/h2>\n<p>\u76f4\u63a5\u6a21\u62df\u5373\u53ef\u3002<\/p>\n<h2>C &#8211; Rotate and Palindrome<\/h2>\n<p>\u679a\u4e3e\u4f4d\u79fb\u8ddd\u79bb\uff0c\u7136\u540e\u66b4\u529b\u7b97\u5c31\u884c\u4e86\u3002<span class=\"katex math inline\">\\mathcal{O}(N^2)<\/span><\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">i64 ans = std::numeric_limits&lt;i64&gt;::max() \/ 2.0;\nfor (int r = 0; r &lt; N; r++) {\n  i64 cur = r * A;\n  for (int l = 0, r = N - 1; l &lt; r; l++, r--) {\n    if (s[l] != s[r]) cur += B;\n  }\n  ans = std::min(ans, cur);\n  std::rotate(s.begin(), s.begin() + 1, s.end());\n}\n\nstd::cout &lt;&lt; ans &lt;&lt; std::endl;\n<\/code><\/pre>\n<\/details>\n<h2>D &#8211; Money in Hand<\/h2>\n<p>\u4f3c\u4e4e\u662f\u4e2a\u88f8\u7684\u80cc\u5305\uff0c<span class=\"katex math inline\">\\mathcal{O}(NXB)<\/span>\u8dd1\u4e00\u904d\u5c31\u884c\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing i64 = std::int64_t;\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n\n    int n, x;\n    std::cin &gt;&gt; n &gt;&gt; x;\n\n    std::vector&lt;std::vector&lt;int&gt;&gt; dp(n + 1, std::vector&lt;int&gt;(x + 1));\n\n    dp[0][0] = 1;\n    for (int i = 1; i &lt;= n; i++) {\n        int a, b;\n\n        std::cin &gt;&gt; a &gt;&gt; b;\n\n        for (int j = 0; j &lt;= x; j++) {\n            for (int t = 0; t &lt;= b; t++) {\n                if (j + a * t &gt; x) continue;\n                dp[i][j + a * t] |= dp[i - 1][j];\n            }\n        }\n    }\n\n    int ans = 0;\n\n    for (int i = 0; i &lt;= n; i++) {\n        ans |= dp[i][x];\n    }\n\n    if (ans) {\n        std::cout &lt;&lt; \"Yes\" &lt;&lt; std::endl;\n    } else {\n        std::cout &lt;&lt; \"No\" &lt;&lt; std::endl;\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n<h2>E &#8211; Souvenir<\/h2>\n<p>\u6570\u636e\u8303\u56f4\u6bd4\u8f83\u5c0f\uff0c\u53ef\u4ee5\u7528<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/cp-algorithms.com\/graph\/all-pair-shortest-path-floyd-warshall.html\">Floyd-Warshall algorithm<\/a>\uff0c\u70b9\u6743\u53ef\u4ee5\u53e0\u52a0\u5230\u8fb9\u6743\u4e0a\uff0c\u5408\u5e76\u65f6\u51cf\u53bb\u91cd\u590d\u8ba1\u7b97\u7684\u5c31\u884c\u3002\u65f6\u95f4\u590d\u6742\u5ea6\uff1a<span class=\"katex math inline\">\\mathcal{O}(N^3)<\/span>\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing i64 = std::int64_t;\nconstexpr i64 INF = std::numeric_limits&lt;i64&gt;::max() \/ 3.0;\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n\n    int n;\n\n    std::cin &gt;&gt; n;\n\n    std::vector&lt;i64&gt; val(n);\n\n    for (int i = 0; i &lt; n; i++) std::cin &gt;&gt; val[i];\n\n    std::vector&lt;std::vector&lt;i64&gt;&gt; mp(n, std::vector&lt;i64&gt;(n, INF));\n    std::vector&lt;std::vector&lt;i64&gt;&gt; cost(n, std::vector&lt;i64&gt;(n, 0));\n\n    for (int i = 0; i &lt; n; i++) {\n        std::string in;\n        std::cin &gt;&gt; in;\n        for (int j = 0; j &lt; n; j++) {\n            if (in[j] == 'Y') mp[i][j] = 1;\n        }\n    }\n    for (int i = 0; i &lt; n; i++) {\n        for (int j = 0; j &lt; n; j++)\n            if (i != j) cost[i][j] = val[i] + val[j];\n    }\n\n    for (int k = 0; k &lt; n; k++) {\n        for (int i = 0; i &lt; n; i++) {\n            for (int j = 0; j &lt; n; j++) {\n                if (mp[i][k] + mp[k][j] &lt; mp[i][j]) {\n                    mp[i][j] = mp[i][k] + mp[k][j];\n                    cost[i][j] = cost[i][k] + cost[k][j] - val[k];\n                } else if (mp[i][k] + mp[k][j] == mp[i][j]) {\n                    cost[i][j] =\n                        std::max(cost[i][j], cost[i][k] + cost[k][j] - val[k]);\n                }\n            }\n        }\n    }\n\n    int q;\n    std::cin &gt;&gt; q;\n    while (q--) {\n        int u, v;\n        std::cin &gt;&gt; u &gt;&gt; v;\n        u--, v--;\n        if (mp[u][v] &gt;= INF)\n            std::cout &lt;&lt; \"Impossible\\n\";\n        else\n            std::cout &lt;&lt; mp[u][v] &lt;&lt; \" \" &lt;&lt; cost[u][v] &lt;&lt; '\\n';\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n<h2>F &#8211; Guess The Number 2<\/h2>\n<p>\u662f\u4e2a\u4e2d\u56fd\u5269\u4f59\u5b9a\u7406\u9898\u3002<\/p>\n<p>\u8003\u8651\u5c06<span class=\"katex math inline\">i\\rightarrow A_i<\/span>\u7684\u51fd\u6570\u5173\u7cfb\u5efa\u9020\u4e00\u4e2a\u6709\u5411\u56fe\uff0c\u6784\u9020\u82e5\u5e72\u4e2a\u73af\uff0c\u73af\u957f\u4e3a<span class=\"katex math inline\">m_1,m_2,&#8230;,m_t<\/span>\uff0c\u5219<span class=\"katex math inline\">\\sum_{i=1}^t m_i =M<\/span>\u3002<\/p>\n<p>\u51fd\u6570\u590d\u5408\u76f8\u5f53\u4e8e\u7ed9\u5b9a\u8d77\u70b9\u5728\u73af\u5185\u5faa\u73af\uff0c\u5219<span class=\"katex math inline\">N<\/span>\u6b21\u540e\u53ef\u4ee5\u5bf9\u6bcf\u4e2a\u73af\u7684\u6bcf\u4e2a\u4f4d\u7f6e\u7b97\u51fa\u76f8\u5bf9\u504f\u79fb\uff0c\u5373<span class=\"katex math inline\">t<\/span>\u4e2a\u540c\u4f59\u65b9\u7a0b<span class=\"katex math inline\">N \\equiv r_i\\mod m_i<\/span>\u3002\u76f4\u63a5CRT\u5373\u53ef\u3002<\/p>\n<p>\u4f46\u662f\u8981\u4fdd\u8bc1<span class=\"katex math inline\">M<\/span>\u4e0d\u80fd\u8d85\u8fc7<span class=\"katex math inline\">110<\/span>\uff0c\u4e14<span class=\"katex math inline\">LCM(&#123;m_i&#125;)\\geq 10^9<\/span>\uff0c\u4e0d\u7136\u53ef\u80fd\u7b54\u6848\u4e0d\u552f\u4e00\u3002<\/p>\n<p>\u7b14\u8005\u9009\u62e9\u4e86\uff1a<span class=\"katex math inline\">4, 5, 7, 9, 11, 13, 17, 19, 23<\/span>\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing i64 = std::int64_t;\n\ntemplate &lt;typename T&gt;\nconstexpr T safe_mod(T x, T m) {\n    x %= m;\n    if (x &lt; 0) x += m;\n    return x;\n}\ntemplate &lt;typename T&gt;\nconstexpr std::pair&lt;T, T&gt; inv_gcd(T a, T b) {\n    a = safe_mod(a, b);\n    if (a == 0) return {b, 0};\n    T s = b, t = a;\n    T m0 = 0, m1 = 1;\n    while (t) {\n        T u = s \/ t;\n        s -= t * u;\n        m0 -= m1 * u;\n        auto tmp = s;\n        s = t;\n        t = tmp;\n        tmp = m0;\n        m0 = m1;\n        m1 = tmp;\n    }\n    if (m0 &lt; 0) m0 += b \/ s;\n    return {s, m0};\n}\n\ntemplate &lt;typename T&gt;\nT inv_mod(T x, T m) {\n    assert(1 &lt;= m);\n    auto z = inv_gcd(x, m);\n    assert(z.first == 1);\n    return z.second;\n}\n\ntemplate &lt;typename T&gt;\nstd::pair&lt;T, T&gt; crt(const std::vector&lt;T&gt;&amp; r, const std::vector&lt;T&gt;&amp; m) {\n    assert(r.size() == m.size());\n    int n = int(r.size());\n    \/\/ Contracts: 0 &lt;= r0 &lt; m0\n    T r0 = 0, m0 = 1;\n    for (int i = 0; i &lt; n; i++) {\n        assert(1 &lt;= m[i]);\n        T r1 = safe_mod(r[i], m[i]), m1 = m[i];\n        if (m0 &lt; m1) {\n            std::swap(r0, r1);\n            std::swap(m0, m1);\n        }\n        if (m0 % m1 == 0) {\n            if (r0 % m1 != r1) return {0, 0};\n            continue;\n        }\n        auto [g, im] = inv_gcd(m0, m1);\n        T u1 = (m1 \/ g);\n        if ((r1 - r0) % g) return {0, 0};\n        T x = (r1 - r0) \/ g % u1 * im % u1;\n        r0 += x * m0;\n        m0 *= u1;\n        if (r0 &lt; 0) r0 += m0;\n    }\n    return {r0, m0};\n}\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n\n    std::vector&lt;int&gt; p = {4, 5, 7, 9, 11, 13, 17, 19, 23};\n\n    int M = 108;\n\n    std::cout &lt;&lt; M &lt;&lt; std::endl;\n    std::cout.flush();\n\n    std::vector&lt;int&gt; to(M + 1);\n    int np = 1;\n    for (int i = 0; i &lt; static_cast&lt;int&gt;(p.size()); i++) {\n        int cur = p[i];\n        int fn = np;\n        for (int j = 1; j &lt;= cur; j++) {\n            if (j != cur)\n                to[np] = j + fn;\n            else\n                to[np] = fn;\n            np++;\n        }\n    }\n\n    for (int i = 1; i &lt;= M; i++) {\n        std::cout &lt;&lt; to[i] &lt;&lt; \" \";\n    }\n    std::cout &lt;&lt; std::endl;\n    std::cout.flush();\n\n    std::vector&lt;int&gt; ans(M + 1);\n    for (int i = 1; i &lt;= M; i++) {\n        std::cin &gt;&gt; ans[i];\n    }\n\n    std::vector&lt;int&gt; res;\n\n    for (int i = 0, fs = 1; i &lt; static_cast&lt;int&gt;(p.size()); i++) {\n        int diff = ((ans[fs] - fs) % p[i] + p[i]) % p[i];\n        res.push_back(diff);\n        fs += p[i];\n    }\n\n    auto [rem, mod] = crt&lt;int&gt;(res, p);\n\n    std::cout &lt;&lt; rem &lt;&lt; std::endl;\n\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n<h2>G &#8211; Unique Walk<\/h2>\n<p>\u8fd9\u4e2a\u9898\u770b\u4e0a\u53bb\u5c31\u5f88\u6b27\u62c9\u56de\u8def\u3002<\/p>\n<p>\u8003\u8651\u5bf9\u4e0d\u5728<span class=\"katex math inline\">S<\/span>\u96c6\u5408\u7684\u8fb9\u6784\u9020\u5b50\u56fe<span class=\"katex math inline\">G<\/span>\uff0c\u8be5\u5b50\u56fe\u80af\u5b9a\u662f\u82e5\u5e72\u4e2a\u8054\u901a\u5757\u3002\u8054\u901a\u5757\u5185\u7684\u5fc5\u7ecf\u4e00\u6b21\u7684\u8fb9\u53ef\u4ee5\u4e0d\u7528\u8003\u8651\uff0c\u56e0\u4e3a\u8054\u901a\u5757\u5185\u4efb\u610f\u4e24\u70b9\u90fd\u53ef\u4ee5\u7ecf\u8fc7\u975e<span class=\"katex math inline\">S<\/span>\u5185\u7684\u8fb9\u5230\u8fbe\uff0c\u56e0\u6b64\u53ef\u4ee5\u8c03\u6574\u4f7f\u5f97\u8054\u901a\u5757\u5185\u7684<span class=\"katex math inline\">S<\/span>\u5185\u7684\u8fb9\u4ec5\u7ecf\u8fc7\u4e00\u6b21\u3002<\/p>\n<p>\u7531\u4e8e\u8054\u901a\u5757\u5185\u90e8\u65e0\u5f71\u54cd\uff0c\u53ef\u4ee5\u7f29\u70b9\u5efa\u7acb\u65b0\u56fe\uff0c\u5e76\u4e14\u65b0\u56fe\u4e4b\u95f4\u7684\u8fb9\u90fd\u5728<span class=\"katex math inline\">S<\/span>\u5185\u3002\u663e\u7136\u5145\u8981\u6761\u4ef6\u4e3a\u65b0\u56fe\u662f\u534a\u6b27\u62c9\u56fe\uff08\u5947\u6570\u5ea6\u6570\u7684\u70b9\u6709\u4e14\u4ec5\u67092\u4e2a\u62160\u4e2a\uff09\u3002<\/p>\n<p>\u65f6\u95f4\u590d\u6742\u5ea6\uff1a<span class=\"katex math inline\">\\mathcal{O}(N)<\/span><\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing i64 = std::int64_t;\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n\n    int n, m;\n\n    std::cin &gt;&gt; n &gt;&gt; m;\n\n    std::vector&lt;std::vector&lt;int&gt;&gt; adj(n);\n\n    std::vector&lt;std::pair&lt;int, int&gt;&gt; E(m);\n\n    for (auto&amp; [u, v] : E) {\n        std::cin &gt;&gt; u &gt;&gt; v;\n        u--, v--;\n    }\n\n    int k;\n    std::cin &gt;&gt; k;\n\n    std::vector&lt;int&gt; sig(m);\n    for (int i = 0; i &lt; k; i++) {\n        int x;\n        std::cin &gt;&gt; x;\n        x--;\n        sig[x] = 1;\n    }\n\n    for (int i = 0; i &lt; m; i++) {\n        if (!sig[i]) {\n            auto [u, v] = E[i];\n            adj[u].push_back(v);\n            adj[v].push_back(u);\n        }\n    }\n    std::vector&lt;int&gt; col(n, -1);\n\n    int p = 0;\n    for (int i = 0; i &lt; n; i++) {\n        if (col[i] == -1) {\n            auto dfs = [&amp;](auto&amp;&amp; self, int u) -&gt; void {\n                col[u] = p;\n                for (const auto&amp; v : adj[u]) {\n                    if (col[v] == -1) self(self, v);\n                }\n            };\n            dfs(dfs, i);\n            p++;\n        }\n    }\n\n    std::vector&lt;int&gt; deg(p);\n    for (int i = 0; i &lt; m; i++) {\n        if (sig[i]) {\n            auto [u, v] = E[i];\n            deg[col[u]]++;\n            deg[col[v]]++;\n        }\n    }\n\n    int h = 0;\n    for (int i = 0; i &lt; p; i++) {\n        h += (deg[i] % 2);\n    }\n\n    if (h == 2 || h == 0)\n        std::cout &lt;&lt; \"Yes\" &lt;&lt; std::endl;\n    else\n        std::cout &lt;&lt; \"No\" &lt;&lt; std::endl;\n\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n<h2>Ex &#8211; Don&#8217;t Swim<\/h2>\n<p>\u795e\u79d8\u8ba1\u7b97\u51e0\u4f55\u3002<\/p>\n<p>\u4f3c\u4e4e\u5c31\u662f\u4e2a\u8ba1\u7b97\u51e0\u4f55\u6a21\u7248+\u6700\u77ed\u8def\u3002<\/p>\n<p>\u8003\u8651\u5efa\u56fe\uff0c\u51f8\u5305\u4e0a\u7684\u70b9\u548cS\uff0cT\u8fde\u8fb9\uff0c\u9700\u8981\u5199\u4e00\u4e2a\u7ebf\u6bb5\u548c\u51f8\u5305\u5224\u4ea4\u6765\u5254\u9664\u4e0d\u5408\u6cd5\u7684\u8fb9\u3002\u7136\u540e\u76f4\u63a5\u8dd1Dijkstra\u7b97\u6cd5\u5373\u53ef\u3002<\/p>\n<p>\u65f6\u95f4\u590d\u6742\u5ea6\uff1a<span class=\"katex math inline\">\\mathcal{O}(N\\log N)<\/span>\u3002<\/p>\n<p>\u5f53\u7136\u6709\u4e00\u4e9b\u7ebf\u6027\u505a\u6cd5\uff0c\u4e0d\u8fc7\u7b14\u8005\u9009\u62e9\u62d2\u7edd\u601d\u8003\uff0c\u6284\u4e86KACTL\u8ba1\u7b97\u51e0\u4f55\u6a21\u7248\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing i64 = std::int64_t;\nconstexpr double INF = std::numeric_limits&lt;double&gt;::max() \/ 3.0;\ntemplate &lt;class T&gt;\nint sgn(T x) {\n    return (x &gt; 0) - (x &lt; 0);\n}\ntemplate &lt;class T = double&gt;\nstruct Point {\n    typedef Point P;\n    T x, y;\n    explicit Point(T x = 0, T y = 0) : x(x), y(y) {}\n    bool operator&lt;(P p) const { return std::tie(x, y) &lt; std::tie(p.x, p.y); }\n    bool operator==(P p) const { return std::tie(x, y) == std::tie(p.x, p.y); }\n    P operator+(P p) const { return P(x + p.x, y + p.y); }\n    P operator-(P p) const { return P(x - p.x, y - p.y); }\n    P operator*(T d) const { return P(x * d, y * d); }\n    P operator\/(T d) const { return P(x \/ d, y \/ d); }\n    T dot(P p) const { return x * p.x + y * p.y; }\n    T cross(P p) const { return x * p.y - y * p.x; }\n    T cross(P a, P b) const { return (a - *this).cross(b - *this); }\n    T dist2() const { return x * x + y * y; }\n    double dist() const { return sqrt((double)dist2()); }\n    \/\/ angle to x-axis in interval [-pi, pi]\n    double angle() const { return atan2(y, x); }\n    P unit() const { return *this \/ dist(); }  \/\/ makes dist()=1\n    P perp() const { return P(-y, x); }        \/\/ rotates +90 degrees\n    P normal() const { return perp().unit(); }\n    \/\/ returns point rotated 'a' radians ccw around the origin\n    P rotate(double a) const {\n        return P(x * cos(a) - y * sin(a), x * sin(a) + y * cos(a));\n    }\n};\n#define cmp(i, j) sgn(dir.perp().cross(poly[(i) % n] - poly[(j) % n]))\n#define extr(i) cmp(i + 1, i) &gt;= 0 &amp;&amp; cmp(i, i - 1 + n) &lt; 0\ntemplate &lt;class P&gt;\nint extrVertex(std::vector&lt;P&gt;&amp; poly, P dir) {\n    int n = size(poly), lo = 0, hi = n;\n    if (extr(0)) return 0;\n    while (lo + 1 &lt; hi) {\n        int m = (lo + hi) \/ 2;\n        if (extr(m)) return m;\n        int ls = cmp(lo + 1, lo), ms = cmp(m + 1, m);\n        (ls &lt; ms || (ls == ms &amp;&amp; ls == cmp(lo, m)) ? hi : lo) = m;\n    }\n    return lo;\n}\ntemplate &lt;class P&gt;\nbool onSegment(P s, P e, P p) {\n    return p.cross(s, e) == 0 &amp;&amp; (s - p).dot(e - p) &lt;= 0;\n}\ntemplate &lt;class P&gt;\nstd::vector&lt;P&gt; segInter(P a, P b, P c, P d) {\n    auto oa = c.cross(d, a), ob = c.cross(d, b), oc = a.cross(b, c),\n         od = a.cross(b, d);\n    \/\/ Checks if intersection is single non-endpoint point.\n    if (sgn(oa) * sgn(ob) &lt; 0 &amp;&amp; sgn(oc) * sgn(od) &lt; 0)\n        return {(a * ob - b * oa) \/ (ob - oa)};\n    std::set&lt;P&gt; s;\n    if (onSegment(c, d, a)) s.insert(a);\n    if (onSegment(c, d, b)) s.insert(b);\n    if (onSegment(a, b, c)) s.insert(c);\n    if (onSegment(a, b, d)) s.insert(d);\n    return {s.begin(), s.end()};\n}\n#define cmpL(i) sgn(a.cross(poly[i], b))\ntemplate &lt;class P&gt;\nbool lineHull(P a, P b, std::vector&lt;P&gt;&amp; poly) {\n    int endA = extrVertex(poly, (a - b).perp());\n    int endB = extrVertex(poly, (b - a).perp());\n    if (cmpL(endA) &lt; 0 || cmpL(endB) &gt; 0) return true;\n    std::array&lt;int, 2&gt; res;\n    for (int i = 0; i &lt; 2; i++) {\n        int lo = endB, hi = endA, n = size(poly);\n        while ((lo + 1) % n != hi) {\n            int m = ((lo + hi + (lo &lt; hi ? 0 : n)) \/ 2) % n;\n            (cmpL(m) == cmpL(endB) ? lo : hi) = m;\n        }\n        res[i] = (lo + !cmpL(hi)) % n;\n        std::swap(endA, endB);\n    }\n    std::array&lt;int, 2&gt; ans = res;\n    if (res[0] == res[1]) return true;\n    if (!cmpL(res[0]) &amp;&amp; !cmpL(res[1]))\n        switch ((res[0] - res[1] + size(poly) + 1) % size(poly)) {\n            case 0:\n                ans = std::array&lt;int, 2&gt;{res[0], res[0]};\n            case 2:\n                ans = std::array&lt;int, 2&gt;{res[1], res[1]};\n        }\n    auto [f1, f2] = res;\n    if (f1 == -1 || f2 == -1) return true;\n    int sz1 = segInter(a, b, poly[f1], poly[(f1 + 1) % poly.size()]).size();\n    int sz2 = segInter(a, b, poly[f2], poly[(f2 + 1) % poly.size()]).size();\n    if (sz1 == 1 &amp;&amp; sz2 == 1) return false;\n    return true;\n}\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n\n    int n;\n\n    std::cin &gt;&gt; n;\n\n    std::vector&lt;Point&lt;double&gt;&gt; hull(n);\n\n    for (auto&amp; [x, y] : hull) std::cin &gt;&gt; x &gt;&gt; y;\n\n    Point s, t;\n    std::cin &gt;&gt; s.x &gt;&gt; s.y &gt;&gt; t.x &gt;&gt; t.y;\n\n    int cnt = n + 2;\n\n    std::vector&lt;std::vector&lt;std::pair&lt;int, double&gt;&gt;&gt; adj(cnt);\n\n    auto Dist = [](const Point&lt;double&gt;&amp; a, const Point&lt;double&gt;&amp; b) -&gt; double {\n        double rx = a.x - b.x;\n        double ry = a.y - b.y;\n        return std::sqrt(rx * rx + ry * ry);\n    };\n\n    for (int i = 0; i &lt; n; i++) {\n        double curDist = Dist(hull[i], hull[(i + 1) % n]);\n        adj[i].emplace_back((i + 1) % n, curDist);\n        adj[(i + 1) % n].emplace_back(i, curDist);\n    }\n\n    for (int i = 0; i &lt; n; i++) {\n        if (!lineHull(s, hull[i], hull)) continue;\n        double curDist = Dist(s, hull[i]);\n        adj[n].emplace_back(i, curDist);\n        adj[i].emplace_back(n, curDist);\n    }\n\n    for (int i = 0; i &lt; n; i++) {\n        if (!lineHull(t, hull[i], hull)) continue;\n        double curDist = Dist(t, hull[i]);\n        adj[n + 1].emplace_back(i, curDist);\n        adj[i].emplace_back(n + 1, curDist);\n    }\n\n    if (lineHull(s, t, hull)) {\n        double curDist = Dist(s, t);\n        adj[n + 1].emplace_back(n, curDist);\n        adj[n].emplace_back(n + 1, curDist);\n    }\n\n    std::vector&lt;double&gt; dis(cnt, INF);\n    std::vector&lt;int&gt; vis(cnt);\n    dis[n] = 0;\n    std::priority_queue&lt;std::pair&lt;double, int&gt;,\n                        std::vector&lt;std::pair&lt;double, int&gt;&gt;,\n                        std::greater&lt;std::pair&lt;double, int&gt;&gt;&gt;\n        Q;\n    Q.push({0, n});\n    while (!Q.empty()) {\n        auto [uw, u] = Q.top();\n        Q.pop();\n        if (vis[u]) continue;\n        vis[u] = 1;\n        for (auto [v, w] : adj[u]) {\n            if (dis[v] &gt; dis[u] + w) {\n                dis[v] = dis[u] + w;\n                Q.push({dis[v], v});\n            }\n        }\n    }\n\n    std::cout &lt;&lt; std::fixed &lt;&lt; std::setprecision(10) &lt;&lt; dis[n + 1];\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u5e74\u7684\u5e74\u5473\u786e\u5b9e\u4e0d\u6d53\uff0c\u5f88\u65e0\u804a\uff0c\u4e8e\u662f\u6253\u6253AtCoder\u9632&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":293,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/288"}],"collection":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=288"}],"version-history":[{"count":2,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/288\/revisions"}],"predecessor-version":[{"id":295,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/288\/revisions\/295"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/media\/293"}],"wp:attachment":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=288"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}