{"id":262,"date":"2022-10-21T18:48:01","date_gmt":"2022-10-21T10:48:01","guid":{"rendered":"http:\/\/yuri3.cn\/?p=262"},"modified":"2022-10-21T18:48:20","modified_gmt":"2022-10-21T10:48:20","slug":"solution-for-educational-codeforces-round-138","status":"publish","type":"post","link":"http:\/\/yuri3.cn\/?p=262","title":{"rendered":"Solution For Educational Codeforces Round 138"},"content":{"rendered":"<p>\u7761\u89c9\u4e86\uff0c\u67d0\u4e9b\u4eba\u53ef\u80fd\u6839\u672c\u4e0d\u4f1a\u5199\u7ebf\u6bb5\u6811\u3002<\/p>\n<p><!--more--><\/p>\n<p>Link\uff1a<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/codeforces.com\/contest\/1749\">Educational Codeforces Round 138<\/a><\/p>\n<h2>Problem E Cactus Wall<\/h2>\n<p>\u505a\u6cd5\uff1a\u8003\u8651\u5230\u7b54\u6848\u8fd9\u5c31\u662f\u5efa\u56fe\u7684\u6700\u5c0f\u5272\u3002\u4e00\u822c\u6765\u8bb2\uff0c\u8fd9\u79cd\u9898\u90fd\u53ef\u4ee5\u8f6c\u6362\u6210\u6c42\u67d0\u79cd\u6700\u77ed\u8def\u3002\u4e8b\u5b9e\u4e0a\u8fd9\u4e2a\u9898\u5c31\u662f\u5728\u7b2c<span class=\"katex math inline\">0<\/span>\u5217\u5efa\u548c\u7b2c<span class=\"katex math inline\">m+1<\/span>\u5217\u5efa\u7acb\u4e24\u4e2a\u865a\u70b9\uff0c\u7136\u540e\u6709<span class=\"katex math inline\">&#92;#<\/span>\u7684\u8f6c\u79fb\u8fb9\u6743\u4e3a0\uff0c\u5426\u5219\u4e3a1\u7684\u56fe\u7684\u6700\u77ed\u8def\u3002\u6ce8\u610f\u5230\u8fd9\u5f20\u56fe\u8fb9\u6743\u4e3a<span class=\"katex math inline\">0<\/span>\u6216<span class=\"katex math inline\">1<\/span>\uff0c\u56e0\u6b64\u76f4\u63a5\u505a01BFS\u5373\u53ef\u3002<\/p>\n<p>\u65f6\u95f4\u590d\u6742\u5ea6\uff1a<span class=\"katex math inline\">\\mathcal{O}(nm)<\/span><\/p>\n<p>\u987a\u5e26\u4e00\u63d0\uff0c\u8fd9\u4e2a\u9898\u548c<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/codeforces.com\/contest\/1627\/problem\/F\">F. Not Splitting<\/a>\u6709\u4e00\u70b9\u7c7b\u4f3c\uff0c\u4f46\u662f\u90a3\u4e2a\u9898\u663e\u7136\u56f0\u96be\u5f88\u591a\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing namespace std;\nusing i64 = long long;\n\nvoid solve() {\n    int n, m;\n    cin &gt;&gt; n &gt;&gt; m;\n\n    vector&lt;vector&lt;char&gt;&gt; mp(n + 1);\n\n    for (int i = 1; i &lt;= n; i++) {\n        string x;\n        cin &gt;&gt; x;\n        x = \" \" + x;\n        mp[i] = {x.begin(), x.end()};\n    }\n\n    deque&lt;pair&lt;int, int&gt;&gt; Q;\n\n    static vector&lt;pair&lt;int, int&gt;&gt; d = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};\n    auto check = [&amp;](int x, int y) {\n        if (x &lt; 1 || x &gt; n || y &lt; 1 || y &gt; m) return false;\n        if (x &gt;= 2 &amp;&amp; mp[x - 1][y] == '#') return false;\n        if (x &lt;= n - 1 &amp;&amp; mp[x + 1][y] == '#') return false;\n        if (y &gt;= 2 &amp;&amp; mp[x][y - 1] == '#') return false;\n        if (y &lt;= m - 1 &amp;&amp; mp[x][y + 1] == '#') return false;\n        return true;\n    };\n    vector&lt;vector&lt;int&gt;&gt; dis(n + 1, vector&lt;int&gt;(m + 1, n * m + 1));\n    vector&lt;vector&lt;int&gt;&gt; vis(n + 1, vector&lt;int&gt;(m + 1, 0));\n    vector&lt;vector&lt;pair&lt;int, int&gt;&gt;&gt; last(n + 1, vector&lt;pair&lt;int, int&gt;&gt;(m + 1));\n    for (int i = 1; i &lt;= n; i++) {\n        if (!check(i, 1)) continue;\n        if (mp[i][1] == '#') {\n            Q.emplace_front(i, 1);\n            dis[i][1] = 0;\n        } else {\n            Q.emplace_back(i, 1);\n            dis[i][1] = 1;\n        }\n        vis[i][1] = 1;\n        last[i][1] = {-1, -1};\n    }\n    while (!Q.empty()) {\n        auto [x, y] = Q.front();\n        Q.pop_front();\n        for (auto [dx, dy] : d) {\n            if (!check(x + dx, y + dy) || vis[x + dx][y + dy]) continue;\n            if (mp[x + dx][y + dy] == '#') {\n                dis[x + dx][y + dy] = dis[x][y];\n                Q.emplace_front(x + dx, y + dy);\n            } else {\n                dis[x + dx][y + dy] = dis[x][y] + 1;\n                Q.emplace_back(x + dx, y + dy);\n            }\n            last[x + dx][y + dy] = {x, y};\n            vis[x + dx][y + dy] = 1;\n        }\n    }\n\n    int BestEnd = 1;\n    for (int i = 1; i &lt;= n; i++) {\n        if (dis[i][m] &lt; dis[BestEnd][m]) BestEnd = i;\n    }\n\n    if (dis[BestEnd][m] == n * m + 1) {\n        cout &lt;&lt; \"No\\n\";\n        return;\n    }\n\n    int nowx = BestEnd, nowy = m;\n    while (pair&lt;int, int&gt;(nowx, nowy) != pair&lt;int, int&gt;{-1, -1}) {\n        mp[nowx][nowy] = '#';\n        auto [x, y] = last[nowx][nowy];\n        swap(x, nowx), swap(y, nowy);\n    }\n    cout &lt;&lt; \"Yes\\n\";\n    for (int i = 1; i &lt;= n; i++) {\n        for (int j = 1; j &lt;= m; j++) cout &lt;&lt; mp[i][j];\n        cout &lt;&lt; '\\n';\n    }\n\n    return;\n}\nint main() {\n    std::ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    int T;\n    cin &gt;&gt; T;\n\n    while (T--) {\n        solve();\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n<h2>Problem F Distance to the Path<\/h2>\n<p>\u505a\u6cd5\uff1a\u5982\u679c\u5c06\u64cd\u4f5c\u5206\u89e3\uff0c\u6bcf\u4e2a\u70b9\u7ef4\u62a4\u4e00\u4e2a\u5411\u91cf<span class=\"katex math inline\">&#92;{x_i&#92;},i\\in[0,20]<\/span>\uff0c\u8868\u793a\u8fd9\u4e2a\u70b9\u8ddd\u79bb\u6070\u597d\u4e3a<span class=\"katex math inline\">i<\/span>\u7684\u513f\u5b50\u90fd\u52a0\u4e0a<span class=\"katex math inline\">x_i<\/span>\uff0c\u5219\u67e5\u8be2\u65f6\u53ea\u9700\u8981\u68c0\u67e5\u5176<span class=\"katex math inline\">20<\/span>\u4e2a\u7236\u4eb2\u7684\u8d21\u732e\u5373\u53ef\u3002\u6bcf\u6b21\u4fee\u6539\u4e2d\uff0c\u5f71\u54cd\u7684\u70b9\u4e3a<span class=\"katex math inline\">u\\rightarrow v<\/span>\u7684\u8def\u5f84\u4e0a\u7684\u70b9\u548c\u5176LCA\u7684\u81f3\u591a20\u4e2a\u7236\u4eb2\uff0c\u663e\u7136\u5bf9\u4e8e\u8def\u5f84\u4e0a\u7684\u70b9\uff0c\u53ea\u9700\u8981\u4fee\u6539<span class=\"katex math inline\">x_d<\/span>\u5373\u53ef\uff0c\u4f46\u662f\u5bf9\u4e8eLCA\u53ca\u5176\u7236\u4eb2\uff0c\u5f71\u54cd\u4e3a\u7b49\u5dee\u6570\u5217\uff0c\u4e5f\u5c31\u662f\u9700\u8981\u4fee\u6539\u7684\u4e3a<span class=\"katex math inline\">x_{d-t},x_{d-t-1}<\/span>\uff08<span class=\"katex math inline\">t<\/span>\u4e3aLCA\u7684\u7b2c<span class=\"katex math inline\">t<\/span>\u4e2a\u7236\u4eb2\uff09\u3002<\/p>\n<p>\u7136\u540e\u5c31\u662f\u505aHLD\u540e\u752821\u4e2a\u7ebf\u6bb5\u6811\/\u6811\u72b6\u6570\u7ec4\u53d6\u7ef4\u62a4\u8fd9\u4e9b\u5411\u91cf\uff0c\u67e5\u8be2\u65f6\u66b4\u529b\u5411\u4e0a\u8df3\u540c\u65f6\u7d2f\u8ba1\u8d21\u732e\u5373\u53ef\u3002<\/p>\n<p>\u65f6\u95f4\u590d\u6742\u5ea6\uff1a<span class=\"katex math inline\">\\mathcal{O}(md\\log n+m\\log^2 n)<\/span><\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u6811\u72b6\u6570\u7ec4\u4f1a\u5feb\u5f88\u591a\uff0c\u7b14\u8005\u4e00\u5f00\u59cb\u5199\u4e86\u7ebf\u6bb5\u6811\uff0c\u4e0d\u4ec5\u5199\u9519\u4e86\uff0c\u800c\u4e14\u9669\u4e9b\u83b7\u5f97TLE\u7684\u597d\u7ed3\u679c\u3002<\/p>\n<details>\n<summary>Code<\/summary>\n<pre><code class=\"language-cpp line-numbers\">#include &lt;bits\/stdc++.h&gt;\n\nusing namespace std;\nusing i64 = long long;\n\ntemplate &lt;class T&gt;\nstruct BIT {\n    int N;\n    vector&lt;T&gt; data;\n    BIT() = default;\n    BIT(int size) { init(size); }\n    void init(int size) {\n        N = size + 2;\n        data.assign(N + 1, {});\n    }\n    \/\/ get sum of [0,k]\n    T sum(int k) const {\n        if (k &lt; 0) return T{};  \/\/ return 0 if k &lt; 0\n        T ret{};\n        for (++k; k &gt; 0; k -= k &amp; -k) ret += data[k];\n        return ret;\n    }\n    \/\/ getsum of [l,r]\n    inline T sum(int l, int r) const { return sum(r) - sum(l - 1); }\n    \/\/ get value of k\n    inline T operator[](int k) const { return sum(k) - sum(k - 1); }\n    \/\/ data[k] += x\n    void add(int k, T x) {\n        for (++k; k &lt; N; k += k &amp; -k) data[k] += x;\n    }\n    \/\/ range add x to [l,r]\n    void imos(int l, int r, T x) {\n        add(l, x);\n        add(r + 1, -x);\n    }\n};\n\nint main() {\n    std::ios::sync_with_stdio(false);\n    cin.tie(nullptr);\n\n    int n;\n    cin &gt;&gt; n;\n    vector&lt;vector&lt;int&gt;&gt; t(n + 1);\n    for (int i = 1; i &lt; n; i++) {\n        int u, v;\n        cin &gt;&gt; u &gt;&gt; v;\n        t[u].push_back(v);\n        t[v].push_back(u);\n    }\n    vector&lt;int&gt; siz(n + 1), son(n + 1), f(n + 1), dep(n + 1);\n    auto dfs1 = [&amp;](auto self, int u, int fa) -&gt; void {\n        siz[u] = 1;\n        f[u] = fa;\n        dep[u] = dep[fa] + 1;\n        for (auto v : t[u]) {\n            if (v == fa) continue;\n            self(self, v, u);\n            siz[u] += siz[v];\n            if (siz[v] &gt; siz[son[u]]) son[u] = v;\n        }\n    };\n    dfs1(dfs1, 1, 0);\n    vector&lt;int&gt; dfn(n + 1), top(n + 1);\n    int cnt = 0;\n    auto dfs2 = [&amp;](auto self, int u, int tp) -&gt; void {\n        dfn[u] = cnt++;\n        top[u] = tp;\n        if (!son[u]) return;\n        self(self, son[u], tp);\n        for (auto v : t[u]) {\n            if (v == f[u] || v == son[u]) continue;\n            self(self, v, v);\n        }\n    };\n    dfs2(dfs2, 1, 0);\n\n    int m;\n    cin &gt;&gt; m;\n\n    vector&lt;BIT&lt;i64&gt;&gt; bit(21, BIT&lt;i64&gt;(cnt));\n    while (m--) {\n        int op;\n        cin &gt;&gt; op;\n        if (op == 1) {\n            int x;\n            cin &gt;&gt; x;\n            int step = 0;\n            i64 ans = 0;\n            while (step &lt;= 20 &amp;&amp; x) {\n                ans += bit[step].sum(dfn[x]);\n                x = f[x];\n                step++;\n            }\n            cout &lt;&lt; ans &lt;&lt; '\\n';\n        }\n        if (op == 2) {\n            int u, v, k, d;\n            cin &gt;&gt; u &gt;&gt; v &gt;&gt; k &gt;&gt; d;\n\n            while (top[u] != top[v]) {\n                if (dep[top[u]] &lt; dep[top[v]]) swap(u, v);\n                bit[d].imos(dfn[top[u]], dfn[u], k);\n                u = f[top[u]];\n            }\n            if (dep[u] &gt; dep[v]) swap(u, v);\n            if (u != v) bit[d].imos(dfn[u] + 1, dfn[v], k);\n            int step = d;\n            while (step &gt;= 0) {\n                if (u == 1) {\n                    for (int i = 0; i &lt;= step; i++)\n                        bit[i].imos(dfn[u], dfn[u], k);\n                    break;\n                }\n                bit[step].imos(dfn[u], dfn[u], k);\n                if (step == 0) break;\n                step--;\n                bit[step].imos(dfn[u], dfn[u], k);\n                u = f[u];\n            }\n        }\n    }\n    return 0;\n}\n<\/code><\/pre>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>\u7761\u89c9\u4e86\uff0c\u67d0\u4e9b\u4eba\u53ef\u80fd\u6839\u672c\u4e0d\u4f1a\u5199\u7ebf\u6bb5\u6811\u3002<\/p>\n","protected":false},"author":1,"featured_media":265,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/262"}],"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=262"}],"version-history":[{"count":2,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/262\/revisions"}],"predecessor-version":[{"id":267,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/posts\/262\/revisions\/267"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=\/wp\/v2\/media\/265"}],"wp:attachment":[{"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=262"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yuri3.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}