From 7a52098f501a7bc4cc99b608acc70a2869c17ccb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:55:20 +0000 Subject: [PATCH] Deployed 7b21447 with MkDocs version: 1.6.0 --- .nojekyll | 0 404.html | 1410 ++++ archive/2024/index.html | 2721 +++++++ archive/2024/page/2/index.html | 2792 +++++++ archive/2024/page/3/index.html | 2019 +++++ assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.fe8b6f2b.min.js | 29 + assets/javascripts/bundle.fe8b6f2b.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.b8dbb3d2.min.js | 42 + .../workers/search.b8dbb3d2.min.js.map | 7 + assets/stylesheets/main.3cba04c6.min.css | 1 + assets/stylesheets/main.3cba04c6.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + category/codeforces/index.html | 1710 +++++ category/geometry/index.html | 1723 +++++ category/gmoj/index.html | 1809 +++++ category/graph/index.html | 1609 ++++ category/math/index.html | 1849 +++++ category/misc/index.html | 1875 +++++ category/number-theory/index.html | 2098 ++++++ category/poly/index.html | 2166 ++++++ category/record/index.html | 1661 ++++ codeforces/1267h/index.html | 1742 +++++ codeforces/index.html | 1604 ++++ favicon.svg | 1 + geometry/index.html | 1609 ++++ geometry/rotate-point/index.html | 1626 ++++ geometry/sin-cos-exp/index.html | 1623 ++++ gmoj/index.html | 1604 ++++ gmoj/p8081/index.html | 1768 +++++ gmoj/p8113/index.html | 1658 ++++ graph/index.html | 1601 ++++ graph/matrix-tree/index.html | 1600 ++++ index.html | 2635 +++++++ javascripts/katex.js | 10 + math/det/index.html | 1950 +++++ math/index.html | 1618 ++++ misc/index.html | 1609 ++++ misc/vscode-config-01.png | Bin 0 -> 19217 bytes misc/vscode-config/index.html | 1995 +++++ number-theory/index.html | 1609 ++++ number-theory/miller-rabin/index.html | 1682 +++++ number-theory/pollard-rho/index.html | 2010 +++++ page/2/index.html | 2658 +++++++ page/3/index.html | 1948 +++++ poly/fft-ntt/index.html | 1760 +++++ poly/fmt/index.html | 1821 +++++ poly/fwt/index.html | 1885 +++++ poly/index.html | 1612 ++++ record/atcoder/index.html | 1707 +++++ record/index.html | 1604 ++++ search/search_index.json | 1 + sitemap.xml | 193 + sitemap.xml.gz | Bin 0 -> 455 bytes stylesheets/extra.css | 30 + tutorial/CF/cf1267h_1.png | Bin 0 -> 24911 bytes tutorial/GMOJ/p8113-01.png | Bin 0 -> 12879 bytes tutorial/GMOJ/p8113-02.png | Bin 0 -> 16402 bytes tutorial/GMOJ/p8113-03.png | Bin 0 -> 40699 bytes 94 files changed, 79505 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 archive/2024/index.html create mode 100644 archive/2024/page/2/index.html create mode 100644 archive/2024/page/3/index.html create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.fe8b6f2b.min.js create mode 100644 assets/javascripts/bundle.fe8b6f2b.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js.map create mode 100644 assets/stylesheets/main.3cba04c6.min.css create mode 100644 assets/stylesheets/main.3cba04c6.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 category/codeforces/index.html create mode 100644 category/geometry/index.html create mode 100644 category/gmoj/index.html create mode 100644 category/graph/index.html create mode 100644 category/math/index.html create mode 100644 category/misc/index.html create mode 100644 category/number-theory/index.html create mode 100644 category/poly/index.html create mode 100644 category/record/index.html create mode 100644 codeforces/1267h/index.html create mode 100644 codeforces/index.html create mode 100644 favicon.svg create mode 100644 geometry/index.html create mode 100644 geometry/rotate-point/index.html create mode 100644 geometry/sin-cos-exp/index.html create mode 100644 gmoj/index.html create mode 100644 gmoj/p8081/index.html create mode 100644 gmoj/p8113/index.html create mode 100644 graph/index.html create mode 100644 graph/matrix-tree/index.html create mode 100644 index.html create mode 100644 javascripts/katex.js create mode 100644 math/det/index.html create mode 100644 math/index.html create mode 100644 misc/index.html create mode 100644 misc/vscode-config-01.png create mode 100644 misc/vscode-config/index.html create mode 100644 number-theory/index.html create mode 100644 number-theory/miller-rabin/index.html create mode 100644 number-theory/pollard-rho/index.html create mode 100644 page/2/index.html create mode 100644 page/3/index.html create mode 100644 poly/fft-ntt/index.html create mode 100644 poly/fmt/index.html create mode 100644 poly/fwt/index.html create mode 100644 poly/index.html create mode 100644 record/atcoder/index.html create mode 100644 record/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 stylesheets/extra.css create mode 100644 tutorial/CF/cf1267h_1.png create mode 100644 tutorial/GMOJ/p8113-01.png create mode 100644 tutorial/GMOJ/p8113-02.png create mode 100644 tutorial/GMOJ/p8113-03.png diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..bf68e39 --- /dev/null +++ b/404.html @@ -0,0 +1,1410 @@ + + + +
+ + + + + + + + + + + + + + + + +作为 VSCode 资深用户,从第一次下载到如今,踩了一个又一个坑,在这里记录一下我的配置方法以及遇到的一些问题。
+在官网下载后,点开安装程序,建议勾选以下所有选项:
+ +等待安装完毕即可。
+插件是 VSCode 的核心,其强大的插件开发社区是一大亮点。
+打开左侧的扩展管理器,搜索并点击安装便可将插件添加到 VSCode。
+如搜索 chinese
,安装中文语言包。
可以在终端用 code --install-extension <extension-id>
或按 F1 / Ctrl+Shift+P
打开命令面板,搜索 ext install
并选择 Extensions: Install Extension
,输入插件名称或 ID 安装插件。
附录 有一些常用的插件。
+VSCode 默认是不支持编译运行 C++
的,需要安装插件 C/C++
并配置文件。
Ctrl+K Ctrl+O
打开一个工作文件夹,并新建 .vscode
文件夹,并新建两个文件 tasks.json
和 launch.json
。
tasks.json
文件用来配置编译任务,可以配置多个编译任务,每个任务对应一个编译命令。
尝试在 tasks.json
文件中添加以下内容:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 |
|
其中 label
字段是任务的名称,command
字段是编译器,args
字段是编译命令,cwd
字段是编译命令的运行目录,isDefault
字段是是否为默认编译任务。
之所以输出为 a.exe
,是为了兼容源代码文件名中的中文字符,如果不需要,可以改为 ${fileBasenameNoExtension}.exe
。
非必要不要更改 cwd
,type
,problemMatcher
等字段,否则可能导致任务执行失败。
launch.json
文件用来配置调试任务,可以配置多个调试任务,每个任务对应一个调试命令。
尝试在 launch.json
文件中添加以下内容:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 |
|
其中一般只需要配置 preLaunchTask
与 program
字段,前者指定编译任务,后者指定运行程序。
你是否有这样的烦恼:每次新建 VSCode 工作文件夹都要配置 tasks.json
和 launch.json
?每次编译都会自动生成 .vscode
文件夹?
VSCode 的全局 tasks.json
配置位于 %APPDATA%\Code\User\tasks.json
,可以编辑该文件来配置全局编译任务。
而 launch.json
配置位于 %APPDATA%\Code\User\settings.json
,在其中加入以下内容:
1 |
|
这样即可实现一次配置,终身受益(
+给定长度为 \(n\) 的排列 \(p\),定义集合 \(S_i = \{j \mid j \ge i \land \max_{k \in [i,j]} p_k = p_j\}\)。
+给定 \(q\) 次询问 \(l,r\),求 \(\sum_{x,y \in [l,r]} |S_x \cap S_y|\)。
+\(n,q \le 2.5 \times 10^5\)
+考虑钦定 \(x<y\),如下图所示:
+ +发现 \(\forall i \ge y\),\(i \in S_x \Rightarrow i \in S_y\)。
+Proof: 因为 \(i \in S_x\),所以 \(\max_{k \in [x,i]} p_k = p_i\),因此显然 \(\max_{k \in [y,i]} p_k = p_i\),即 \(i \in S_y\)。\(\square\)
+因此 \(|S_x \cap S_y| = |S_x \cap [x,y)| + |S_y|\)。
+考虑把这两个部分分开处理,发现所有 \(|S_y|\) 即为 \(\sum_{i \in [l,r]} (i-l)|S_i|\),可以用前缀和 \(\mathrm O(1)\) 计算。
+考虑计算 \(\sum_{l \le x \lt y \le r} |S_x \cap [x,y)|\),如下图所示:
+ +正难则反,考虑抛弃 \(y\) 的限制,而是计算 \(i \in S_x\) 的贡献。
+发现 \(\forall i \in S_x \cap [x,r]\),对于 \(\forall y \gt i\) 都有 \(1\) 的贡献,即原式等于 \(\sum_{i \in S_x \cap [x,r]} r-i\)。
+发现这个不好维护,于是正难则反,考虑计算 \(\forall i \in [l,r]\) 对 \(x \le i\) 的贡献。
+记 \(\mathrm{pre}_i = \max_{j \lt i} {j \mid p_j \gt p_i}\),即 \(i\) 前第一个大于 \(i\) 的元素的位置,并记 \(p_0 = \infty\)。
+发现 \(\forall i \in [l,r]\),\(i\) 对 \(x \in (\mathrm{pre}_i,i]\) 有 \(r-i\) 的贡献。
+由于我们不清楚 \(r\) 的值,因此我们维护 \(r\) 的系数即可。
+ +如上图,考虑用线段树维护区间加与区间和。
+考虑 \(i \in [l,r]\) 这条限制,容易发现当 \(i \lt l\) 时,\(i\) 对 \([l,r]\) 无贡献;当 \(i \gt r\) 时,如上图的 \(j\),会对 \([l,r]\) 产生多余的贡献。
+因此我们把询问离线并按右端点排序,依次加点即可。
+最后别忘了我们计算的是 \(x \lt y\) 的答案,剩下部分是 naive 的。
+如果强制在线的话,可以用可持久化线段树 + 标记永久化解决,时间复杂度同为 \(\mathrm O((n+q) \log n)\)。
+ +这里是图论相关的算法笔记。
+ +定义 \(n\) 阶方阵 \(A\) 的行列式为:
+其中 \(\{p_1,p_2,\cdots,p_n\}\) 是一个 \(n\) 的排列,\(\tau(p_1,p_2,\cdots,p_n)\) 表示 \(\{p_1,p_2,\cdots,p_n\}\) 的逆序数。
+读者自证不难。
+读者自证不难。
+若矩阵有相同的两行,则行列式为零。
+Proof: 交换相同的两行后矩阵不变,且由 Lemma 2 得行列式变号,即 \(|A|=-|A|\),所以 \(|A|=0\)。\(\square\)
+若矩阵某一行是另一行的倍数,则行列式为零。
+Proof: 由 Lemma 1 & Lemma 3 易证。
+若 \(\forall j,a_{i,j} = b_j + c_j\),则
+读者自证不难。
+Proof: 设
+由 Lemma 4 得 \(|B|=0\),由 Lemma 5 得 \(|C| = |A| + |B| = |A|\)。\(\square\)
+即上三角矩阵的行列式为主对角线元素的乘积。
+Proof: 由行列式的定义得若 \(\exists i, a_{i,p_i} = 0\),那么整个排列对行列式无贡献。
+因此要想对行列式有贡献,\(p_n\) 必等于 \(n\),同理得 \(\forall i, p_i = i\)。\(\square\)
+显然有 \(\mathrm O(n! n)\) 的 naive 方法,但如果这样上面的 \(\LaTeX\) 就白写了(
+考虑把矩阵转化为上三角矩阵并由 Lemma 7 \(\mathrm O(n)\) 计算行列式。
+这个过程形如高斯消元,于是考虑用高斯消元法来求解行列式。
+假设目前处理到第 \(i\) 行,要使得 \(\forall j > i, a_{j,i} = 0\)。
+显然可以让第 \(j\) 行加上第 \(i\) 行乘 \(- \frac{a_{i,j}}{a_{i,i}}\),但对于任意模数情况下 \(a_{i,i}\) 不一定有逆元。
+因此,我们考虑用辗转相除法。
+每次使得 \(a_{j,i} \gets a_{j,i} \bmod a_{i,i}\),并交换第 \(i\) 行与第 \(j\) 行,直到 \(a_{i,i}\) 为 \(0\)。
+即让第 \(j\) 行加上第 \(i\) 行乘 \(- \lfloor \frac{a_{i,j}}{a_{i,i}} \rfloor\)。
+时间复杂度看似是 \(\mathrm O(n^3 \log P)\),但可以证明是 \(\mathrm O(n^3)\),其中 \(P\) 是模数。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 |
|
给定长度为 \(N\) 的数组 \(A\),定义 \(S_0 = 0\),\(S_i = \sum_{j=1}^i A_j(i \in [1,N])\)。
+对 \(K \in [0,N]\),求解:
+暴力枚举 \(K\),并枚举 \(i \in [0,N]\),假定 \(S_i = \max_{j \in [0,N]} {S_j}\),显然最优方案为反转前 \(i\) 个元素中绝对值最大的 \(K\) 个元素。
+设 \(B_i = \max(0,-A_i)\),那么第 \(i\) 段前缀对 \(K\) 的贡献为 \(C(i,K) = S_i + 2 W(i,K)\),其中 \(W(i,K)\) 为 \(\{B_1,B_2,\dots,B_i\}\) 中的前 \(K\) 大元素的和。
+答案即为 \(\max{C(i,K)}\)。
+注意当 \(i \lt K\) 时,\(W(i,K) = \sum_{j=1}^i B_j\)。
+\(W(i,K)\) 可以用主席树在 \(O(\log N)\) 时间内求得。
+总时间复杂度 \(O(N ^ 2 \log N)\),期望得分 30。
+设 \(f_K\) 表示 \(\min \{i | \forall j,C(i,K) \ge C(j,K)\}\),即使得 \(C(i,K)\) 最大的最小的 \(i\) 值。
+容易发现 \(f\) 非严格单调递增。
+于是便如 ABC348G 一样,用分治 + 主席树解决。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 |
|
考虑使用反证法,假设 \(\exists i,f_i > f_{i+1}\),设 \(f_i = x,f_{i+1} = y\)。
+因为 \(f_i = x\),于是有
+因为 \(f_{i+1} = y\),于是有
+这显然是矛盾的,因为 \(y<x\),\(W(y,i+1) - W(y,i)\) 相当于 \(\{B_1,B_2,\dots,B_x\}\) 中的第 \(i+1\) 大的元素,但是 \(\{B_1,B_2,\dots,B_y\} \subset \{B_1,B_2,\dots,B_x\}\),于是必有 \(W(y,i+1) - W(y,i) \le W(x,i+1) - W(x,i)\),矛盾。
+因此,\(f\) 是非严格单调递增的。
+\(\forall p \in \mathbb P, 0 \le a \lt p, a^{p-1} \equiv 1 \pmod{p}\)
+证明略。
+\(\forall p \in \mathbb P, 0 \le x \lt p\),方程 \(x ^ 2 \equiv 1 \pmod p\) 的解为 \(x \equiv \pm 1 \pmod p\)。
+证明略。
+设我们要检测的数为 \(n > 2\)。显然 \(n\) 为奇数,设 \(n - 1 = 2^s t\),其中 \(t\) 为奇数。
+若 \(n\) 为素数,我们希望 \(\forall a \in [1,n)\),满足以下任意条件:
+\(a^t \equiv 1 \pmod n\)。
+\(\exists r \in [0,s), a ^ {2 ^ r t} \equiv -1 \pmod n\)。
+若以上两项都不满足,显然有 \(a^t \not \equiv 1 \pmod n\),这时分两类讨论:
+\(a ^ {n-1} \not \equiv 1 \pmod n\),根据费马小定理,显然 \(n\) 不是素数。
+\(a ^ {n-1} \equiv 1 \pmod n\),又因为 \(\forall i \in [0,s), a ^ {2 ^ i t} \not \equiv -1 \pmod n\),显然有 \(\exists i \in [0,s), a ^ {2 ^ i t} \not \equiv -1 \pmod n\) 且 \(a ^ {2 ^ {i + 1} t} \equiv 1 \pmod n\)。 +即 \(\exists x \in [2,n-1), x ^ 2 \equiv 1 \pmod n\),根据二次探测定理,\(n\) 不是素数。
+当 \(n\) 为合数,若 \(a\) 仍满足上述两项之一,则称 \(a\) 为 \(n\) 的强伪证;若 \(a\) 不满足上述两项,则称 \(a\) 为 \(n\) 不是素数的凭证。
+每个奇合数都有许多凭证,但是要找到他们不容易。于是考虑多随机几个 \(a\),以验证 \(n\) 的素性。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 |
|
对于一个已知的合数 \(n>3\),我们的目标是快速找到它的一个非平凡因子(除 \(1\) 和 \(n\) 外)。
+显然问题可以转化为找到一个 \(k\) 使得 \(1 \lt \gcd(k,n) \lt n\)。
+考虑一个序列 \(f\),满足 \(f_0=0\) 且 \(f_i = (f_{i-1}^2 + c) \bmod n\),其中 \(c\) 是常数。由生日悖论1得 \(f\) 中不同的数量的期望为 \(O(\sqrt n)\)。
+设 \(m\) 是 \(n\) 的最小质因子,显然有 \(m \le \sqrt n\)。
+设 \(g_i = f_i \bmod m\),则 \(g\) 中不同的数量的期望为 \(O(\sqrt m)\)。
+于是我们可以在期望 \(O(\sqrt m) \le O(n ^ {\frac 1 4})\) 的时间内找到两个位置 \(i,j\) 使得 \(f_i \not = f_j \land g_i = g_j\),即 \(n \nmid (f_i - f_j) \land m \mid (f_i - f_j)\),于是有 \(1 \lt m \le \gcd(|f_i - f_j|, n) \lt n\)
+于是我们可以在期望 \(O(n ^ {\frac 1 4})\) 的时间内找到 \(k\) 满足 \(1 \lt gcd(k,n) \lt n\),也就找到了一个 \(n\) 的非平凡因子。
+我们随机 \(c \in [1,n)\)。
+由于 \(f\) 的值域在 \([0,n)\) 之间,于是其必定有循环节,因为其值的排列图像形似 \(\rho\),于是这个算法被称为 Pollard-Rho
。
我们考虑枚举 \(i\),判断是否 \(1 \lt \gcd(|f_i - f_{2i}|,n) \lt n\),并在当 \(f_i = f_{2i}\) 时终止。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 |
|
考虑设两个变量 \(s,t\),我们让 \(t\) 记下 \(s\) 的目前值,并让 \(s\) 跑一定距离,在这过程中检验 \(|s-t|\),并每次都把距离翻倍,显然当 \(s\) 跑到 \(t\),即出现环时,\(s\) 并没有多跑多远。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 |
|
我们发现上面两种做法时间复杂度都不是单纯的 \(O(n ^ {\frac 1 4})\),而是 \(O(n ^ {\frac 1 4} \log n)\),因为还要调用 \(\gcd\)。
+为了减小调用 \(gcd\) 的次数,我们考虑若 \(\gcd(a,b) \gt 1\),显然也有 \(\gcd(ac \bmod b,b) \gt 1\),于是我们把一段路程放到一起检验。
+根据前人的智慧,取段长为 \(127\) 效果最好。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 |
|
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 |
|
已知有 \(n \le 8500\) 个基地,以及开启它们的顺序排列 \(p\),初始所有基地都关闭。
+求一个整数序列 \(f\) 使得在任意时刻,已开启的基地的 \(f\) 值按顺序排成的序列满足:
+任意子段都有一个只出现在其中过一次的值(以下记为合法)
+\(\forall i, f_i \in [1,24]\)
+发现 \(\lceil \log _{\frac 3 2} 8500 \rceil = 23\),于是考虑缩小问题规模递归求解。
+考虑用一种颜色 \(c\) 尽可能多且合法地填。
+首先合法的必要条件显然是任意时刻序列中相邻的值都不同。
+发现如果填 \(c\) 的位置在任意时刻都不相邻,且剩下的位置提取出来后任意时刻合法,那么必有当前序列任意时刻合法。
+形式化地,设 \(S \subseteq \{1,2,\dots,n\}\) 为填 \(c\) 的位置集合,即 \(\forall i \in [1,n], f_i = c \iff i \in S\)。
+那么如果任意时刻均有 \(\forall i,j \in S \land i \not = j, i,j\) 不相邻,便可递归解决剩下的位置集合 \(\{1,2,\dots,n\} \setminus S\)。
+感性理解:对于任意时刻,显然任意值为 \(c\) 的位置不相邻,那么便如下图:
+ +显然任意子段都属于上面三种之一,且都合法。
+于是我们便可以尽可能地在满足任意时刻填 \(c\) 的位置都不相邻的前提下,填尽可能多的 \(c\)。
+于是问题就简单了,任意时刻填 \(c\) 的位置都不相邻可以转化为当它刚好被加入序列的时刻它的前驱后继都不为 \(c\),于是从后往前扫一遍就可以了。
+且显然有一个点填 \(c\) 最多使得两个点无法填 \(c\),于是可以把问题规模减小 \(\lceil \frac n 3 \rceil\),可以通过本题。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 |
|
这个做法十分的不直观,因为考虑 \(p = \{1,2,3,4\}\),若 \(f = \{1,2,1,2\}\),虽然符合任意时刻相邻两个都不相同,但却是非法的。
+这是因为当我们把 \(\{1,3\}\) 两个位置的 \(f\) 标为 \(1\) 时,缩小了问题规模,删除了他们,这时 \(p = \{2,4\}\),因此 \(2\) 与 \(4\) 相邻,我们就不能使 \(f = \{2,2\}\),而是 \(f = \{3,2\}\),合并得到 \(f = \{1,3,1,2\}\)。
+ +++默认文中的形如 \([l,r)\) 的区间为其与整数集的交集。
+
设原多项式为 \(F(x) = \sum_{i \in [0,n)} a_i x ^ i\),其中 \(n = 2 ^ k, k \in \mathbb Z ^ +\)。
+我们要求 \(\forall i \in [0,n),\hat a_i = F(t_i)\),其中 \(t\) 是一个长度为 \(n\) 且两两互不相同的序列。
+显然 \(F\) 可以被一组 \(\hat a,t\) 唯一确定,即点值表示法。
+另设两个多项式
+则有
+考虑构造单位根 \(\omega _n ^k\) 满足 \(\omega _n ^{\frac n 2} = -1, \omega _{2n} ^ {2k} = \omega _n ^k\)。
+显然也有 \(\omega _n ^n = \omega _n ^0 = 1\)。
+设 \(\forall i \in [0,n), t_i = \omega _n ^i\)。
+当 \(x = \omega _n ^k, k \in [0,\frac n 2)\) 时显然有
+当 \(x = \omega _n ^{k + \frac n 2}, k \in [0,\frac n 2)\) 时有
+由于两者只有一个符号的差异,于是 \(F\) 的点值可以直接 \(\mathrm O(n)\) 从 \(G_0, G_1\) 的点值得到。
+递归解决,时间复杂度 \(\mathrm O(n \log n)\)。
+设变换后的点值序列为 \(\hat a\),即
+设多项式 \(\hat F(x) = \sum _{i \in [0,n)} \hat a_i x^i\)。
+对 \(\hat F\) 进行点值变换(\(\forall i \in [0,n),t_i = \omega _n ^{-i}\)),设点值序列为 \(s\)。
+则有
+显然第二个求和是一个等比数列,由等比数列求和公式 \(\sum _{i \in [m,n)} p^i = \frac {p^m - p^n} {1 - p}\) 得:
+因此
+于是我们有
+在复数域下,有 \(\omega _n = \cos \frac {2 \pi} n + \mathrm i \sin \frac {2 \pi} {n}\)。
+其中 \(\mathrm i = \sqrt {-1}\) 是 虚数单位,可以用 C++
中的 complex
库中的 std::complex<double/long double>
存储复数。
对于模数 \(P \in \mathbb P, \exists n,k \in \mathbb Z^+, P=2^nk+1\),在模 \(P\) 意义下有 \(\omega _n \equiv g ^ {\frac {P-1} n}\),其中 \(g\) 是原根。
+\(g\) 是模 \(P\) 意义下的原根当且仅当 \(g ^i \not \equiv 1 \pmod P,\forall i \in [1,\phi(P))\) 且 \(g ^{\phi(P)} \equiv 1 \pmod P\)。
+specially,\(\forall P \in \mathbb P\),其原根 \(g\) 满足 \(\forall i \in [1,P-1), g ^i \not \equiv 1 \pmod P\) 且 \(g^{P-1} \equiv 1 \pmod P\)。
+于是对 \(n = 2 ^m, m \in \mathbb Z ^+\),我们有 \(\omega _n ^n \equiv g ^{\frac {P - 1} {n} \cdot n} \equiv g ^{P - 1} \equiv 1, \pmod P\),且 \(\omega _n ^{\frac n 2} \equiv g ^{\frac {P - 1} 2} \equiv \pm \sqrt {g ^ {P - 1}} \equiv \pm 1 \pmod P\),又 \(g ^ {\frac {P-1} 2} \not \equiv 1 \pmod P\),所以 \(\omega _n ^{\frac n 2} \equiv -1 \pmod P\)。
+还有 \(\omega _{2n} ^{2k} \equiv g ^{\frac {2k(P-1)} {2n}} \equiv g ^{\frac{k(P-1)} n} \equiv \omega _n ^k \pmod P\)
+由于原根的特殊性,模数 \(P \in \mathbb P\) 有特殊的限制,一般有 \(P = k 2 ^m + 1, k,m\in \mathbb Z ^+\)。
+常见的模数有
+设点 \(A(x,y)\) 绕原点 \(O(0,0)\) 逆时针旋转 \(\beta\),则设在极坐标系下 \(A\) 的坐标为 \((r,\alpha)\)
+++这意味着 \(x=r \cos \alpha, y=r \sin \alpha\)
+
目标点 \(A'(x',y')\) 的极坐标即为 \((r,\alpha + \beta)\)
+展开(其中 \(\sin\) 和 \(\cos\) 的展开参考 here):
+结论:点 \((x,y)\) 绕原点逆时针旋转 \(\theta\) 后坐标为 \((x \cos \theta - y \sin \theta, x \sin \theta + y \cos \theta)\)。
+ +++本文中使用 \(\cap\) 表示按位与,用 \(\cup\) 表示按位或
+
给定长度为 \(2^n\) 的数列 \(A,B\),求 \(C_i = \sum_{j \cup k = i} A_j \times B_k\)
+显然有 \(O(4^n)\) 的暴力
+这一部分可以参考 FMT 中的 Zeta 变换 ,即定义 \(\hat A_i\) 为序列 \(A\) 中 \(i\) 的子集和
+考虑分治
+对于长度为 \(2^n\) 的待求解的 \(\hat A\),我们把它分成独立的两部分,即 \([0,2^{n-1})\) 和 \([2^{n-1},2^n)\) 两个区间分别求解
+然后考虑这两个区间之间的贡献,发现只有 \([0,2^{n-1})\) 对 \([2^{n-1},2^n)\) 有贡献,于是对于 \(i \in [0,2^{n-1})\),将 \(\hat A_{i}\) 加到 \(\hat A_{i+2^{n-1}}\) 中即可
+时间复杂度 \(O(n 2^n)\)
+我们只需要对照正变换中的操作步骤,一步一步撤销变换即可
+即对于 \(i \in [0,2^{n-1})\),将 \(\hat A_{i+2^{n-1}}\) 减去 \(\hat A_{i}\) 的贡献,然后再递归地求解
+当然还有另外的做法,即我们要将长度为 \(2^n\) 的 \(\hat A_i\) 在全集为 \(2^n-1\) 的情况下(即不考虑目前的长度外的子集)只包括自己的 \(A_i\),那么我们递归地求解完左右两个区间后,肯定有 \(\forall i\in [0,2^{n-1}),\hat A_{i+2^{n-1}}=\hat A_i+A_{i+2^{n-1}}\),因此减去贡献即可
+in brief,可以先递归再减贡献,这样逆变换与正变换只有一个 +/-
的变化
对于 \(\cap\) 的情况,与 \(\cup\) 十分相似,请读者尽量自己构造变换,推一下式子,可以加深理解
+如果没有思路,here
+给定长度为 \(2^n\) 的数列 \(A,B\),求 \(C_i = \sum_{j \oplus k = i} A_j \times B_k\)
+设 \(\operatorname{popcnt}(i)\) 表示 \(i\) 在二进制下 1
的个数,则有
++证明:显然 \(k\) 为 \(0\) 的位上,\(i,j\) 的取值不影响结果,那么设 \(i'=i\cap k,j'=j\cap k\),那么问题转化为 +$$ +\operatorname{popcnt}(i') + \operatorname{popcnt}(j') \equiv \operatorname{popcnt}(i'\oplus j') \pmod 2 +$$ +对于 \(i',j'\) 每一位分开讨论,原命题易证
+
即异或不会改变 \(1\) 的总数的奇偶性
+我们尝试构造一个变换 +$$ +\hat A_i = \sum_j g(i,j) A_j +$$ +例如对于 \(\cup\) 卷积 ,\(g(i,j)=[i\cup j=i]\)
+这个 \(g\) 函数满足以下性质:
+即我们要使得 \(g(i,j)\times g(i,k) = g(i,j \oplus k)\)
+因为 \(\operatorname{popcnt}(i \cap k) + \operatorname{popcnt}(j \cap k) \equiv \operatorname{popcnt}((i\oplus j)\cap k) \pmod 2\),我们发现 \(g(i,j) = (-1)^{\operatorname{popcnt}(i \cap j)}\) 满足这个性质
+手动推一下式子:
+有点抽象,画个 \(n=3\) 的图来模拟一下
+ +假设现在我们要考虑从 \(n=2\) 到 \(n=3\) 的变换,我们发现左边是 0??
,右边是 1??
,分别多出一个最高位
设原变换为 \(F_i\) ,目标变换为 \(G_i\)
+我们发现左边内部之间的 \(\cup\) 结果不变,因此 \(\forall i<4, G_i \gets F_i\)
+我们发现 0??
\(\cup\) 1??
= 0??
,因此其 1
的个数不变,因此 \(\forall i<4,G_i \gets F_{i+4}, G_{i+4} \gets F_i\)。
我们发现之前是 ??
\(\cup\) ??
= ??
,但是现在在前面加了一个 1
,因此 \(-1\) 的指数加一,所以 \(\forall i<4,G_{i+4} \gets -F_{i+4}\)
综上,我们有 \(\forall i<4,G_i=F_i+F_{i+4}, G_{i+4}=F_i-F_{i+4}\)
+generally,对于从 \(n-1\) 到 \(n\) 的变换,我们有
+时间复杂度 \(O(n2^n)\)。
+对照上面式子易得 (留给读者思考)
核心代码如下
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 |
|
++小 Tips:在计算机语言中 \(\cap\) =
+&
/and
, \(\cup\) =|
/or
定义长度为 \(2^n\) 的序列的 and
卷积 \(A = B * C\) 为 \(A_i=\sum_{j \cap k = i}{B_j \times C_k}\)
考虑快速计算
+定义长度为 \(2^n\) 的序列的 Zeta 变换
为
即子集和
+它具有一下性质:
+相当于 FFT
中的点值表示法,用以加速卷积过程
暴力求解 \(\hat A\) 最优时间复杂度为 \(3^n\),考虑加速
+考虑 子集DP
,有一篇很好的博客1,这里大概讲解一下。
其实 \(\hat A\) 本质上是一个高维(\(n\) 维)前缀和
+如果我们要求二维前缀和,显然可以通过一下代码实现:
+1 +2 +3 +4 +5 +6 +7 +8 |
|
我们发现 1st
完成后 a[i][j]
表示的是 \(\sum_{k \le i} a_{k,j}\),即 \((i,j)\) 上方的元素和
那么 2nd
便是将 \((i,j)\) 左边操作后的 \(\sum_{k \le j} a_{i,k}\) 累加到 a[i][j]
中,即完成二维前缀和
下面拓展到三维前缀和
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 |
|
类似地,1st,2nd
中处理除了第 k
平面中的二维前缀和,3rd
在立体空间中把他们加起来,成为三维前缀和
回到 Zeta 变换
:
如果我们用二进制 \((x_{n-1}x_{n-2}x_{n-3}\ ...\ x_2x_1x_0)_2\) 表示集合 \(i\),二进制 \((y_{n-1}y_{n-2}y_{n-3}\ ...\ y_2y_1y_0)_2\) 表示集合 \(j\)
+那么 \(\hat A_i\) 可以被视为 \(n\) 维前缀和,即 +$$ +\hat A_i = \sum_{y_{n-1}\le x_{n-1},y_{n-2}\le x_{n-2}, ..., y_1\le x_1,y_0\le x_0} A_j +$$
+当然,下标都为 0/1
因此,我们有如下 Code:
+1 +2 +3 +4 |
|
以上 Code 的 naive 形式为:
+1 +2 +3 +4 |
|
不要质疑我代码编译不通过
因此,我们用 \(O(n2^n)\) 的时间复杂度解决了 Zeta 变换
++warning:此处不是
+莫比乌斯反演
!
众所周知,前缀和的逆运算即为差分
+我们发现,只需要先将最后一维差分,即可将序列处理为 \(n-1\) 维前缀和
+即
+1 +2 +3 +4 |
|
但实际上因为前缀和都是无序的,因此我们直接正着做就可以啦
+只需要把正变换的 +=
改为 -=
就可以了
有时候,题目给的不是 \(\cap\) ,而是 \(\cup\) 怎么办?
+那我们重定义 Zeta 变换
为:
+$$
+\hat A_i = \sum_{i \supseteq j} A_j
+$$
+再推一下式子:
+$$
+\hat B_i \times \hat C_i
+=\sum_{i\supseteq j} B_j \times \sum_{i\supseteq k} C_k
+=\sum_{i\supseteq j,i\supseteq k} B_j \times C_k
+=\sum_{i\supseteq p} \sum_{j \cup k=p} B_j \times C_k
+=\sum_{i\supseteq p} A_p
+=\hat A_i
+$$
+变换即超集和,高维后缀和
求法也很简单,只用将源代码中的 if(j&(1<<i))
该为 if(!(j&(1<<i)))
即可
是 \(\oplus\) 怎么办?
+快去学 FWT 吧
++再送你一个并/交集的小口诀:下并或,上交与
+
\(\Delta=\color{red}{-24}\)
+蓝名保卫战,极限 1600
C 题还是有些思维难度的,最后才做出来,但是不够简洁
+E 题忘开 %lld
喜提罚时
D 题最难评,又 WA 又 RE,最后如果输出不符合条件就输出 -1
才过
F 题原题,但是不会(
+赛后发现就是一个二维前缀和 + 二位前缀max,还是挺简单的
+G 题不会
赛时打的太急了,罚时太多,速度也被拖慢了,同分的最高 performance
有 2000+,还是代码实现不够快和准
\(\Delta=\color{red}{-21}\)
+E 题原题,还抓了一个抄题解的
A 题还是挺水的,只是没想到从奇偶性的角度来想,题解给的是 \(O(N ^ 2 D)\) 的做法,但是有更优且更简单的做法 \(O(N ^ 2)\),但是没想到,还是考思维。
+B 题有点愚人节,python
语言优势很大(自带高精度),用几个 \(5 ^ x\) 拼起来多随机几次就完了,难绷(
蓝名没了 /ll
\(\Delta=\color{green}{114}\)
+performance
2300+ 祭
0罚时切 A ~ F,让我又想起了那场似的 rating
F 题听说比较水,暴力 + O3 可过,但是我用 bitset
\(O(\frac{N ^ 2 M}{\omega})\) 也过了(
G 题决策单调性优化板题,原题两道:here & here (但我不会)
upd on 2024.4.14 : G 题改出来了,应用单调性还是比较简单的,但是难在证明
+\(\Delta=\color{green}{67}\)
+A ~ D 都比较顺畅,D 题盲猜 \(\text{lowbit}\) 喜提机房一血,E 题没开 long long
喜提一发罚时与机房一血
然后就坐着与 F & G 干瞪眼,F 先是用 cdq 尝试水分,后来将不是 \(M\) 因数的删掉了,还是不行
+最后发现 \(M\) 最多有 \(13\) 个因数,直接 \(O(2^{13}N) \approx 1.638 \times 10^9\) 过了,AtCoder 神机
但是打得太急,F 题 7 发罚时,最后 4 发最离谱,一发没取模,一发取模太慢 TLE,一发将取模改成减法写错了,最后一发两处取模是 copy 的都错了,漏了一处没改(
+\(\color{green}{525} \color{red}{(7)}\) !!
+G 题直接并查集开水,快 T 了就 No,过了一半的数据点
+实际上还可以开随机化,因为对于 \(\forall i\),有些连边是不需要的,有概率连到与目标解答案相同的状态,但比赛后才想到(
+\(\Delta=\color{red}{-6}\)
+之前的总结写的太笼统了,更像是提要。刚好今天实在是打 emo 了,犯了很多离谱的错误,想写一篇个人直观的反思,从 rating
和 performance
中跳出来,慢慢地审视整个过程。
A 题其实没有问题,可以直接A的,但是把 %03d
写成了 %02d
样例中也没有 ABC001
,于是就挂了。
后来几道题一直很慌,越慌,越是想打快。越是快,就越出错。这很严重拖慢了整个切题的速度。C 题本来是没什么问题的,但是急着想过掉它,核心的代码几乎一半是错的,第一发直接罚时,这时心情也是很差了,很焦躁。后来逼迫自己冷静下来,又在草稿纸上画了几下,思路便逐渐清晰,于是便改对了。
+到了赛点的后三题后,我其实刚刚松一口气,看到 E 题又自闭了,毕竟概率题上次就栽过,是ABC342F,这次又看到,心里一紧,只好先尝试 F 题。
+F 题读完题后没多久就想到了 dfs,然而实现中还是有一些小错误,如 for
循环里更新 i
的话,它实际上还会 ++i/--i
一次,会跳过一个位置。好在没罚时。
切完 F 题后看了一下 G 题,一开始读错题了以为那个在线是假的,高高兴兴拿样例试水发现是错的。没办法,于是看 E 题,结果旁边的人 看我蓝名快没了 好心旁敲侧击,于是想到 DP,中途还有一个自己转移到自己的,想到了之前的一道题目 虽然我没改出来 ,于是移项解方程即可。
一开始 \(10^{18}\) 我认为计搜是过不了的,因此打得不够坚定,还有一个变量重名调了很久,实现不够稳和准。开始是想着拿去水分的,但是直接过了,而且时间也很充裕(7ms)。赛后看题解,计搜时间复杂度实际上是 \(O(\log^3 n)\),但是主要问题是不会证明,对自己没有信心,于是犹豫了很久。
+到了最后的 G 题,此时还剩下 20 分钟,已经机房内有人切了 G 题。出于对 G 题的潜意识压力以及前面比赛的表现,我此时已经基本失去思考能力了,脑子一片嗡嗡的根本想不到正解,打了一个根本就没概率的随机化过了一半,最后遗憾收场。
+机房内同年级的有 4 个人过了 G 题,其中 3 人都是水过的,还包括两个代码相似的人。第四个大佬用了 splay
。
到这里,你可能认为 G 题还是有点难度的。但是,实际上,这也是我在比赛中犯的最后一个,也是最大的一个错误。
+读完 G 题,其实不难想到如果维护好了森林中的每棵树有确定的根(具体是哪个节点与答案无关),并且维护好了每个点在其所在连通块中的朝向这个根的父亲,那么求解答案是 \(O(1)\) 的。比赛时这个念头在我脑海里一闪而过,但是很快就被否决了——原因很简单,这个维护过程直观上看是非常不可行的。后来,我转而去想 bitset
时间换空间,但一无所获。
然而,这就是问题所在——用暴力维护这些信息实际上的时间复杂度是正确的!因为每次连边的两个点都是在不同的连通块中,做完这次操作以后它们就会被合并,因此如果我们遍历一遍较小的连通块,总时间复杂度是 \(O(n\log n)\)!因此,这道 G 题出乎意料地短,甚至比我的随机化代码还要少。
+写在最后:这次 ABC 可以看到除了少部分人,大多数人都没有取得很理想,甚至可以说糟糕的成绩。比赛结束后,我听到有人在机房里咒骂自己、题目和出题人的。还有人为了 rating
而闷闷不乐,诸如此类。但是有一点他们都错了,我们打比赛不是为了 rating
去打,不是为了成绩去打。以我为例,这次比赛我的 delta
是 -6
,相对于之前 2200+
的 performance
,可谓是相当的差。但是,在这背后,是我被打乱的做题节奏,被扰乱的心态,是我过于激动的心情。这次比赛,暴露了我很多问题:代码实现不准不细心,读题不仔细,对时间复杂度的不敏感,对时间复杂度证明的不熟练,而这些,都为我提供了宝贵的经验,这远远不是几点 rating
所能给我的。之前还看到旁边的人比赛时一起讨论题目,其实也是十分不应该——如果人人都只在乎 rating
以至于无人在乎算法背后的玄妙,在乎它们的出处与归宿,那么 rating
早已失去它本来的意义了。希望各位在天涯海角的 OIer
都能保住自己的初心,守住心中的一寸净土,为了 OI
,ACM
,乃至 CS
的明天而砥砺前行。