From cf07a0b78a443e15e9eea605f2933a498f0278ba Mon Sep 17 00:00:00 2001 From: GoodCoder666 Date: Sat, 27 Jan 2024 10:09:04 +0800 Subject: [PATCH] update from gridea: 2024-01-27 10:09:04 --- 404.html | 89 + archives/index.html | 664 +++ archives/page/2/index.html | 504 +++ atom.xml | 3880 +++++++++++++++++ favicon.ico | Bin 0 -> 51612 bytes images/avatar.png | Bin 0 -> 51612 bytes index.html | 441 ++ media/css/prism-github.css | 131 + media/css/prism-synthwave84.css | 146 + media/css/tailwind.css | 1612 +++++++ media/gridea.png | Bin 0 -> 40435 bytes media/images/custom-wechat.png | Bin 0 -> 442791 bytes media/prism.js | 206 + media/scripts/main.js | 57 + page/2/index.html | 379 ++ page/3/index.html | 391 ++ page/4/index.html | 389 ++ page/5/index.html | 412 ++ page/6/index.html | 396 ++ page/7/index.html | 386 ++ page/8/index.html | 434 ++ page/9/index.html | 272 ++ post/2048plus-privacy/index.html | 373 ++ post/abc161/index.html | 403 ++ post/abc168/index.html | 498 +++ post/abc171/index.html | 707 +++ post/abc173/index.html | 736 ++++ post/abc177/index.html | 714 +++ post/abc187/index.html | 735 ++++ post/abc188/index.html | 786 ++++ post/abc189/index.html | 666 +++ post/abc190/index.html | 784 ++++ post/abc191/index.html | 755 ++++ post/abc192/index.html | 695 +++ post/abc193/index.html | 700 +++ post/abc194/index.html | 703 +++ post/abc195/index.html | 714 +++ post/abc196/index.html | 780 ++++ post/abc198/index.html | 829 ++++ post/abc199/index.html | 872 ++++ post/abc200/index.html | 814 ++++ post/abc201/index.html | 773 ++++ post/abc202/index.html | 771 ++++ post/abc203/index.html | 842 ++++ post/abc204/index.html | 795 ++++ post/abc205/index.html | 778 ++++ post/abc239/index.html | 669 +++ post/abc241/index.html | 571 +++ post/abc242/index.html | 657 +++ post/abc244/index.html | 604 +++ post/abc245/index.html | 687 +++ post/abc248/index.html | 493 +++ post/abc250/index.html | 649 +++ post/abc252/index.html | 920 ++++ post/abc253/index.html | 713 +++ post/abc254/index.html | 933 ++++ post/abc258/index.html | 644 +++ post/abc260/index.html | 950 ++++ post/abc263/index.html | 670 +++ post/abc274/index.html | 658 +++ post/abc298/index.html | 908 ++++ post/abc318/index.html | 674 +++ post/abc334/index.html | 833 ++++ post/about/index.html | 376 ++ post/accountbook-readme/index.html | 467 ++ post/algonotes-bwop/index.html | 1006 +++++ post/algonotes-dijkstra/index.html | 576 +++ post/algonotes-fenwick-tree/index.html | 649 +++ post/algonotes-floyd/index.html | 505 +++ post/algonotes-knapsack-dp/index.html | 637 +++ post/algonotes-lca/index.html | 639 +++ post/algonotes-mst/index.html | 677 +++ post/algonotes-rmq/index.html | 974 +++++ post/algonotes-tree-dp/index.html | 675 +++ post/arc138_b/index.html | 390 ++ post/atcoder-all/index.html | 345 ++ post/cf1307/index.html | 666 +++ post/csps2023-t3/index.html | 939 ++++ post/eclipseinstmirrors/index.html | 365 ++ post/eclipseupdmirror/index.html | 361 ++ post/happy2024/index.html | 356 ++ post/java-binmove/index.html | 383 ++ post/java-final-syntax/index.html | 419 ++ post/java-image-iaein-solve/index.html | 364 ++ post/js-random/index.html | 374 ++ post/js-utc/index.html | 342 ++ post/license-gplv3/index.html | 953 ++++ post/license/index.html | 356 ++ post/mathematica-intro/index.html | 656 +++ post/panasonic2020-c/index.html | 547 +++ post/pws-tencent-us-19ncov/index.html | 529 +++ post/py_codelinescounter/index.html | 769 ++++ post/pypi-tsmirror/index.html | 358 ++ post/pyside6-accountbook/index.html | 855 ++++ post/python-def-functions/index.html | 516 +++ post/python-functions-argpack/index.html | 559 +++ post/python-lambda-functions/index.html | 394 ++ post/python-naming-standards/index.html | 399 ++ post/speed-up-github-access/index.html | 638 +++ post/spyderfix/index.html | 371 ++ post/tkinter-text-undo-redo/index.html | 378 ++ post/wmp-cloud-enable/index.html | 396 ++ post/wmp-cloud-errcode-401003/index.html | 390 ++ post/wmp-cloud-getopenid/index.html | 425 ++ post/wmp-cloud-invalidkey-openid/index.html | 388 ++ post/wmp-cloud-orderby/index.html | 370 ++ post/wmp-component-not-found/index.html | 380 ++ post/wmp-diy-nkeyboard/index.html | 465 ++ post/wmp-enable-onpulldownrefresh/index.html | 374 ++ post/wx-showtoast-problem/index.html | 394 ++ styles/main.css | 163 + tag/2048plus/index.html | 130 + tag/AccountBook/index.html | 129 + tag/algonotes/index.html | 331 ++ tag/bugfix/index.html | 311 ++ tag/cpp/index.html | 392 ++ tag/cpp/page/2/index.html | 386 ++ tag/cpp/page/3/index.html | 392 ++ tag/cpp/page/4/index.html | 405 ++ tag/cpp/page/5/index.html | 260 ++ tag/github/index.html | 162 + tag/ide/index.html | 184 + tag/java/index.html | 177 + tag/js/index.html | 155 + .../index.html | 128 + tag/oi/index.html | 383 ++ tag/oi/page/2/index.html | 385 ++ tag/oi/page/3/index.html | 383 ++ tag/oi/page/4/index.html | 391 ++ tag/oi/page/5/index.html | 416 ++ tag/oi/page/6/index.html | 222 + tag/opensource-projects/index.html | 179 + tag/python-functions/index.html | 195 + tag/python/index.html | 363 ++ tag/pywebscraping/index.html | 130 + tag/qt-tutorial/index.html | 135 + tag/syntax/index.html | 273 ++ tag/wmp/index.html | 390 ++ tags/index.html | 249 ++ 139 files changed, 72389 insertions(+) create mode 100644 404.html create mode 100644 archives/index.html create mode 100644 archives/page/2/index.html create mode 100644 atom.xml create mode 100644 favicon.ico create mode 100644 images/avatar.png create mode 100644 index.html create mode 100644 media/css/prism-github.css create mode 100644 media/css/prism-synthwave84.css create mode 100644 media/css/tailwind.css create mode 100644 media/gridea.png create mode 100644 media/images/custom-wechat.png create mode 100644 media/prism.js create mode 100644 media/scripts/main.js create mode 100644 page/2/index.html create mode 100644 page/3/index.html create mode 100644 page/4/index.html create mode 100644 page/5/index.html create mode 100644 page/6/index.html create mode 100644 page/7/index.html create mode 100644 page/8/index.html create mode 100644 page/9/index.html create mode 100644 post/2048plus-privacy/index.html create mode 100644 post/abc161/index.html create mode 100644 post/abc168/index.html create mode 100644 post/abc171/index.html create mode 100644 post/abc173/index.html create mode 100644 post/abc177/index.html create mode 100644 post/abc187/index.html create mode 100644 post/abc188/index.html create mode 100644 post/abc189/index.html create mode 100644 post/abc190/index.html create mode 100644 post/abc191/index.html create mode 100644 post/abc192/index.html create mode 100644 post/abc193/index.html create mode 100644 post/abc194/index.html create mode 100644 post/abc195/index.html create mode 100644 post/abc196/index.html create mode 100644 post/abc198/index.html create mode 100644 post/abc199/index.html create mode 100644 post/abc200/index.html create mode 100644 post/abc201/index.html create mode 100644 post/abc202/index.html create mode 100644 post/abc203/index.html create mode 100644 post/abc204/index.html create mode 100644 post/abc205/index.html create mode 100644 post/abc239/index.html create mode 100644 post/abc241/index.html create mode 100644 post/abc242/index.html create mode 100644 post/abc244/index.html create mode 100644 post/abc245/index.html create mode 100644 post/abc248/index.html create mode 100644 post/abc250/index.html create mode 100644 post/abc252/index.html create mode 100644 post/abc253/index.html create mode 100644 post/abc254/index.html create mode 100644 post/abc258/index.html create mode 100644 post/abc260/index.html create mode 100644 post/abc263/index.html create mode 100644 post/abc274/index.html create mode 100644 post/abc298/index.html create mode 100644 post/abc318/index.html create mode 100644 post/abc334/index.html create mode 100644 post/about/index.html create mode 100644 post/accountbook-readme/index.html create mode 100644 post/algonotes-bwop/index.html create mode 100644 post/algonotes-dijkstra/index.html create mode 100644 post/algonotes-fenwick-tree/index.html create mode 100644 post/algonotes-floyd/index.html create mode 100644 post/algonotes-knapsack-dp/index.html create mode 100644 post/algonotes-lca/index.html create mode 100644 post/algonotes-mst/index.html create mode 100644 post/algonotes-rmq/index.html create mode 100644 post/algonotes-tree-dp/index.html create mode 100644 post/arc138_b/index.html create mode 100644 post/atcoder-all/index.html create mode 100644 post/cf1307/index.html create mode 100644 post/csps2023-t3/index.html create mode 100644 post/eclipseinstmirrors/index.html create mode 100644 post/eclipseupdmirror/index.html create mode 100644 post/happy2024/index.html create mode 100644 post/java-binmove/index.html create mode 100644 post/java-final-syntax/index.html create mode 100644 post/java-image-iaein-solve/index.html create mode 100644 post/js-random/index.html create mode 100644 post/js-utc/index.html create mode 100644 post/license-gplv3/index.html create mode 100644 post/license/index.html create mode 100644 post/mathematica-intro/index.html create mode 100644 post/panasonic2020-c/index.html create mode 100644 post/pws-tencent-us-19ncov/index.html create mode 100644 post/py_codelinescounter/index.html create mode 100644 post/pypi-tsmirror/index.html create mode 100644 post/pyside6-accountbook/index.html create mode 100644 post/python-def-functions/index.html create mode 100644 post/python-functions-argpack/index.html create mode 100644 post/python-lambda-functions/index.html create mode 100644 post/python-naming-standards/index.html create mode 100644 post/speed-up-github-access/index.html create mode 100644 post/spyderfix/index.html create mode 100644 post/tkinter-text-undo-redo/index.html create mode 100644 post/wmp-cloud-enable/index.html create mode 100644 post/wmp-cloud-errcode-401003/index.html create mode 100644 post/wmp-cloud-getopenid/index.html create mode 100644 post/wmp-cloud-invalidkey-openid/index.html create mode 100644 post/wmp-cloud-orderby/index.html create mode 100644 post/wmp-component-not-found/index.html create mode 100644 post/wmp-diy-nkeyboard/index.html create mode 100644 post/wmp-enable-onpulldownrefresh/index.html create mode 100644 post/wx-showtoast-problem/index.html create mode 100644 styles/main.css create mode 100644 tag/2048plus/index.html create mode 100644 tag/AccountBook/index.html create mode 100644 tag/algonotes/index.html create mode 100644 tag/bugfix/index.html create mode 100644 tag/cpp/index.html create mode 100644 tag/cpp/page/2/index.html create mode 100644 tag/cpp/page/3/index.html create mode 100644 tag/cpp/page/4/index.html create mode 100644 tag/cpp/page/5/index.html create mode 100644 tag/github/index.html create mode 100644 tag/ide/index.html create mode 100644 tag/java/index.html create mode 100644 tag/js/index.html create mode 100644 tag/mathematica-and-wolfram-language/index.html create mode 100644 tag/oi/index.html create mode 100644 tag/oi/page/2/index.html create mode 100644 tag/oi/page/3/index.html create mode 100644 tag/oi/page/4/index.html create mode 100644 tag/oi/page/5/index.html create mode 100644 tag/oi/page/6/index.html create mode 100644 tag/opensource-projects/index.html create mode 100644 tag/python-functions/index.html create mode 100644 tag/python/index.html create mode 100644 tag/pywebscraping/index.html create mode 100644 tag/qt-tutorial/index.html create mode 100644 tag/syntax/index.html create mode 100644 tag/wmp/index.html create mode 100644 tags/index.html diff --git a/404.html b/404.html new file mode 100644 index 00000000..58bcadfd --- /dev/null +++ b/404.html @@ -0,0 +1,89 @@ + + + + + + + Page Not Found + + + +
+
4 0 4
+
+ Page not found +
+ +
+ + + + \ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 00000000..04e11f23 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,664 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 00000000..be5fa48d --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,504 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000..e5c892d3 --- /dev/null +++ b/atom.xml @@ -0,0 +1,3880 @@ + + + https://goodcoder666.github.io + GoodCoder666的个人博客 + 2024-01-27T02:09:03.723Z + https://github.com/jpmonette/feed + + + 天生我材必有用,千金散尽还复来。 + https://goodcoder666.github.io/images/avatar.png + https://goodcoder666.github.io/favicon.ico + All rights reserved 2024, GoodCoder666的个人博客 + + <![CDATA[Mathematica 入门]]> + https://goodcoder666.github.io/post/mathematica-intro/ + + + 2024-01-25T10:55:00.000Z + 前言 +

Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLABMaple 等。

+

MMA 官网:https://www.wolfram.com/mathematica/

+

MMA 的安装及激活:Mathematica安装激活极简教程 - 科研小飞 (知乎)

+

本文适合有一定编程基础的读者。当然,如果你不了解编程也没关系,直接跳过相关部分即可。屏幕截图全部来自 Windows 11,Mathematica 13.3。(最新版本 14.0 已经在 2023 年 12 月发布,语法向下兼容)

+演示使用的 MMA 版本 +
演示使用的 MMA 版本
+

1. 界面

+

安装并正确激活 MMA 后,新建笔记本,应该能看到如下的界面:

+MMA 基本界面 +

一张图带你快速熟悉 MMA 的界面:

+MMA 界面简介 +

几个需要注意的点:

+
    +
  • Enter 默认换行,执行代码需要用 Shift+Enter
  • +
  • 指令面板左侧的红三角形也可执行代码,灰色的正方形用于终止正在进行的运算。
  • +
  • MMA 带有 Notebook(笔记本)功能,由于其主要用于计算而不是笔记,本文不详细介绍,若需要使用可自行查阅相关资料。
  • +
+

对于任意输入或输出,按下Ctrl+Shift+I即可显示输入(代码)形式,按下Ctrl+Shift+N即可显示数学形式。后面会对两种显示形式进行详细讲解。

+

2. 语法

+

Mathematica 实质是一个 Wolfram Language 的解释器,所以使用它之前必须学习 WL 的语法。
+这里介绍基本语法和常用的指令。

+

2.1 帮助文档

+

首先来了解帮助文档的使用。输入 ? Solve 来获取 Solve 函数的说明:

+help-solve +

? 后面可以跟任何函数名,MMA 会直接在笔记本中输出简化版的帮助文档。可以选择输出右上角的 i 来获取更详细的文档(优先打开离线文档,不存在则默认打开在线文档)。菜单栏中的 “帮助 -> Wolfram 参考资料” 可以打开完整版文档。

+

2.2 注释

+
(* 注释 *)
+
+

如上,MMA 的注释使用 (**) 来标注,用法类似于 C/C++ 中的 /**/。注释可以添加在代码的任何位置,它们会被自动忽略。例如:

+
1 + 1 (*Hello*)
+1 + (*World*)1 
+
+

这两行代码在实际执行中与 1 + 1 无区别:

+comment-test +

2.3 括号

+

在学习 MMA 的函数之前,一定要先学会括号的使用!!
+官方参考文档:正确使用括号和大括号

+

MMA 中共有四种括号,分别为 ()[]{}[[]],具体作用如下:

+

圆括号 ()

+

用作对表达式编组和确定运算的优先次序:

+圆括号的使用 +

方括号 []

+

表示函数的调用和传参:

+方括号的使用 +

大括号 {}

+

表示列表:

+大括号的使用 +

列表的具体使用后续会介绍。

+

双方括号 [[]]

+

表示对列表元素的访问,实质是函数 Part 的简写形式:

+双方括号的使用 +

同样会在后面具体介绍。

+

2.4 运算与表达式

+

MMA 支持基本的数学运算,见下表:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称符号形式函数形式数学形式
加法a + bPlus[a, b]a+ba+b
减法a - bSubtract[a, b]aba-b
乘法a * b[1]Times[a, b]a×ba\times b
除法a / bDivide[a, b]ab\frac ab
a ^ bPower[a, b]aba^b
模余-Mod[a, b]amodba\bmod b
+

数字和符号都可以参与运算:

+数字和符号的运算 +

表达式是一个或多个运算/函数调用的组合,使用()指定优先级。上图中 4*5a+a3 x y/y 都是合法的表达式。

+

需要注意的是,MMA 只会对输入的表达式进行约分、合并同类项,而不会自动执行需要展开的化简。必要时可以使用 SimplifyFullSimplify 函数:

+化简示例 +

关于函数的使用,后面会详解。

+

布尔表达式

+

表达式也可以是等式或不等式:

+等式和不等式 +
+

注意等式用两个等号 == 连接,单个等号表示变量赋值。
+不等式可以用 !=(不等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)连接。!=>=<= 在输入时会自动转换为相应的数学符号。

+
+

这类返回值为 True(真)或 False(假)的表达式,我们统称为布尔表达式。可以用 &&|| 运算符来连接两个布尔表达式,分别表示“与”“或”,所得结果仍为布尔表达式。

+

绝大部分布尔表达式都不能自动化简,但可以通过 SimplifyFullSimplifySolveReduce 来化简或求解:

+布尔表达式的化简与求解 +

2.5 变量与常数

+

MMA 中,使用 变量名 = 值 的形式来声明或赋值变量:

+创建变量 +

由上方 10a + 3 的计算结果可知,表达式中所有已声明的变量都会被替换成变量值。变量的声明也可以包含其他变量和符号,此时仍符合变量替换法则:

+替换 +

用于解方程的 Solve 函数没有返回 aa 的解,而是返回 xx 的解,说明表达式在解析时 aa 被自动替换为了 xx

+
+

除此之外,还可以用类似于 Python 的语法,同时赋值多个变量

+
{a, b, c} = {1, 2, 3}
+
+

这行代码可以把变量 a,b,ca,b,c 分别赋值为 1,2,31,2,3

+
+

若要取消声明一个变量,可以使用 Clear[变量名]

+Clear的使用 +

在使用 MMA 的过程中,我们会发现某些特定符号不能声明为变量,且有一个固定不变的值。这些是内置常量

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
常量名称近似值数学形式
Pi圆周率3.1415926543.141592654π\pi
E自然常数2.7182818282.718281828e\mathrm e
I虚数单位-ii
Infinity无穷大-\infty
Degree-°\degree
+

2.6 函数

+

在前面的讲解中,我们多次提到函数。现在,让我们详细解读函数的使用。

+

调用

+

要调用一个函数,只需输入 函数名[参数1, 参数2, ...] 即可:

+函数的调用1 +

对于只有一个参数的函数,可以用 参数 // 函数名 的形式调用。这种形式常用于 Simplify(化简)、FullSimplify(完全简化)和 N(数值运算)的调用:

+函数调用2 +

这种写法的最大优点在于可以链式调用:

+链式调用 +

定义

+

说完了函数的调用,再来说说新函数的定义。

+

MMA 中,定义新函数的语法为 函数名[参数1_, 参数2_, ...] := 返回值。注意每个参数名后面都要加一个下划线_)。

+
+

定义新函数推荐用 :=,但使用 = 也可行。

+
+定义新函数 +
+

拓展 - 定义递归函数
+参考下面定义斐波那契数列的格式:
+斐波那契数列

+
+

3. 内置函数

+

MMA 中有将近 60006000 个内置函数[2],它们都以大写字母开头。下面介绍几种常用的内置函数:

+

3.1 数值运算 N

+

数值运算函数 N

+
    +
  • N[expr] 给出 expr\mathrm{expr} 的数值值
  • +
  • N[expr, n] 尝试给出具有 nn 位精度的结果
  • +
+

使用示例:

+N示例 +

3.2 三角函数

+

MMA 内置了各类三角函数,它们全部使用习惯名称且首字母大写(SinSinhArcSin),这里不一一阐释。
+只说一个注意点,MMA 中三角函数的参数默认是弧度,若要使用角度必须加上 Degree 单位:

+三角函数 +

3.3 解方程和不等式 Solve/Reduce

+

解方程 Solve

+Solve解方程 +

解不等式用 Reduce

+Reduce解不等式 +

Reduce 还有更高级的使用,可以约化各种表达式:

+Reduce的高级应用 +

这句话说的是:求解 a,ba,b 的范围,使得存在 xx 满足等式 ax=bax=b。实际上就是在求解使一元一次方程有解的参数值。注意 SolveReduce 不一定总返回最简形式的表达式,很多情况下需要手动调用 SimplifyFullSimplify 进行化简。感兴趣的读者可以自行测试上面的例子中不使用 Simplify 的返回结果。

+

3.4 解方程的其他方法 NSolve/FindInstance

+

NSolve 用法同 Solve,但会返回数值解而不是精确解。相当于 Solve[...] // N
+FindInstance 用法同 Solve,但添加了一个参数表示至多返回解的个数(默认为 11):

+FindInstance的使用 +

3.5 极点值 Maximize/Minimize

+

Minimize 返回函数(在限制条件下)的最小值以及取到最小值的(一种)变量值:

+Minimize的使用 +

如上图中的示例,Minimize 支持多个变量,可以指定条件,也可指定求解域。
+Maximize 用法完全相同,返回最大值,此处略过。

+

3.6 偏导 D

+

偏导 D 的两种最常用用法:

+
    +
  • D[f, x] 给出 ff 关于 xx 的偏导。
  • +
  • D[f, {x, n}] 给出 ff 关于 xxnn 阶偏导。
  • +
+

示例略。注意 f'[x] 可以直接求出 f[x] 的导数:

+符号求导 +

3.7 积分 Integrate

+

积分 Integrate

+
    +
  • Integrate[f, x] 给出不定积分 f dx\int f~\mathrm{d}x
  • +
  • Integrate[f, {x, x_min, x_max}] 给出定积分 xminxmaxf dx\int_{x_{min}}^{x_{max}} f~\mathrm{d}x
  • +
  • Integrate[f, {x, x_min, x_max}, {y, y_min, y_max}, ...] 给出多重积分 xminxmaxdxyminymaxdyf\int_{x_{min}}^{x_{max}} \mathrm{d}x \int_{y_{min}}^{y_{max}} \mathrm{d}y\dots f
  • +
+

一个简单的定积分示例:

+Integrate求定积分 +

3.8 展开 Expand/ExpandAll

+

Expand 很好理解,Expand[expr] 会展开表达式 expr\mathrm{expr} 中的乘积和正整数幂。限于篇幅,这里不提供使用范例,可参考官方文档
+ExpandAllExpand 的基础上,会展开表达式中任意位置的乘积和整数幂。如表达式 Sin[(1 + x)^3]Expand 不会展开其中的 (1+x)^3,而 ExpandAll 会。

+

3.9 因式分解 Factor

+

Factor[poly]:在整数上对一个多项式分解因式。使用示例参考官方文档

+

3.10 绘图 Plot/Plot3D

+

PlotPlot3D 的用法较为复杂,这里只介绍最基本的函数绘图:

+Plot和Plot3D +

两个语句分别绘制:

+
    +
  • sin(x)\sin(x) 的图像,其中 2πx2π-2\pi\le x\le 2\pi
  • +
  • sin(x+y2)\sin(x+y^2) 的图像,其中 3x3-3\le x\le 32y2-2\le y\le 2
  • +
+

4. 总结

+

我自己当初学习 MMA 时,被网上杂乱的教程搞得混乱不堪。因此就想写一篇教程,涵盖所有常用语法知识点,并让初学者避开我自己踩的一些坑。
+初衷是写个简明的教程,结果一写就是八千多字…… 也感谢认真读到这里的读者们!
+后续可能还会更一些用 Mathematica 解决数学和实际问题的文章,敬请期待!

+
+
+
    +
  1. 乘法也可简写为 a b(中间必须有空格)。MMA 中,大部分空格可省略,但是乘法的空格不能省略(若写作没有空格的 ab 会被认为是一个变量)。 ↩︎

    +
  2. +
  3. https://www.wolfram.com/language/fast-introduction-for-programmers/en/built-in-functions/ ↩︎

    +
  4. +
+
+]]>
+
+ + <![CDATA[元旦快乐 & 新年目标]]> + https://goodcoder666.github.io/post/happy2024/ + + + 2023-12-31T16:00:00.000Z + 🌟 祝大家 20242024 元旦快乐!🌟

+

🎉 愿你们在新的一年里,万事尽可期待,眼里有光,脸上带笑,心中常怀温暖与爱!🎉

+

2023 年的小目标:

+
    +
  • +
  • +
  • +
  • +
+

2024 年:

+
    +
  • +
  • +
  • +
+]]>
+
+ + <![CDATA[UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解]]> + https://goodcoder666.github.io/post/abc334/ + + + 2023-12-24T04:05:04.000Z + A - Christmas Present +

题目大意

+

给定两个正整数 B,GB,G1B,G10001\le B,G\le 1000BGB\ne G),判断哪个更大。

+

分析

+

模拟即可。

+

代码

+
#include <cstdio>
+using namespace std;
+
+int main()
+{
+	int b, g;
+	scanf("%d%d", &b, &g);
+	puts(b > g? "Bat": "Glove");
+	return 0;
+}
+
+
+

B - Christmas Trees

+

题目大意

+

给定 A,M,L,RA,M,L,R
+对于任意整数 kk,Snuke 都会在数轴上的 A+kMA+kM 处放置一棵圣诞树。
+试问区间 [L,R][L,R] 中共有多少棵圣诞树?

+

1018A1018-10^{18}\le A\le 10^{18}
+1M1091\le M\le 10^9
+1018LR1018-10^{18}\le L\le R\le 10^{18}

+

分析

+

不难发现,对于任意整数 xx,数轴上 xx 处有圣诞树当且仅当 xA (mod M)x \equiv A \ (\bmod \ M)。变形可得 xA0 (mod M)x-A \equiv 0 \ (\bmod \ M),即 (xA)M(x-A) \mid M。故只需考虑相对于 AA 的坐标,所以统计 [LA,RA][L-A,R-A]MM 的倍数数量即可。

+

代码

+

使用 C++ 语言时,注意正确处理负数的情况。

+
#include <cstdio>
+using namespace std;
+
+using LL = long long;
+
+int main()
+{
+	LL a, l, r;
+	int m;
+	scanf("%lld%d%lld%lld", &a, &m, &l, &r);
+	l -= a, r -= a;
+	if(l < 0) l = -((-l) / m * m);
+	else l = (l + m - 1) / m * m;
+	if(r < 0) r = -((-r + m - 1) / m * m);
+	else r = r / m * m;
+	printf("%lld\n", (r - l) / m + 1);
+	return 0;
+}
+
+
+

C - Socks 2

+

题目大意

+

有长为 2N2N 的序列 S=(1,1,2,2,,N,N)S=(1,1,2,2,\dots,N,N)
+给定 A=(A1,,AK)A=(A_1,\dots,A_K),将 SS 中数字 A1,,AKA_1,\dots,A_K 各拿掉一个,剩余 2NK2N-K 个。
+对这 2NK2N-K 个数进行两两组合(可能剩余 11 个),使得每对数之差的绝对值之和最小。输出这个最小和。

+

1KN2×1051\le K\le N\le 2\times 10^5
+1A1<A2<<AKN1\le A_1<A_2<\dots<A_K\le N

+

分析

+

首先,可以证明我们一定会将 NKN-K 个成双的数字进行自我组合。

+
+

简要证明
+采用 反证法。假设有两个 aa,我们将它们分别与 b,cb,c 组合。显然:

+

ab+acaa+bc|a-b|+|a-c| \ge |a-a|+|b-c| +

+

于是,将 a,aa,a 组合、b,cb,c 组合的方案一定不比原方案差。因此直接组合 a,aa,a,一定能得到最优解。

+
+

由于 aa=0|a-a|=0,所以这部分可以直接忽略,将单个的数字,即 A1,,AKA_1,\dots,A_K 进行组合即可。

+

分两种情况讨论。

+
    +
  1. +

    KK 为偶数:此时组合没有剩余。不难发现,相邻两两组合即为最优解,所以答案为:

    +

    ans=i=1k/2A2iA2i1\mathrm{ans}=\sum_{i=1}^{k/2} A_{2i}-A_{2i-1} +

    +

    直接计算即可。注意 AA 已排序,故无需取绝对值。

    +
  2. +
  3. +

    KK 为奇数:此时组合剩余一个。枚举此剩余的数,从 AA 中删去就转换成了偶数的情况。但是暴力计算的时间复杂度为 O(K2)\mathcal O(K^2),维护前缀后缀和即可优化到 O(K)\mathcal O(K)

    +
  4. +
+

综上,我们在 O(K)\mathcal O(K) 的时间内解决了此问题。

+

代码

+
#include <cstdio>
+#define maxn 200005
+using namespace std;
+
+inline void setmin(int& x, int y)
+{
+	if(y < x) x = y;
+}
+
+int a[maxn], pre[maxn], suf[maxn];
+
+int main()
+{
+	int n, k;
+	scanf("%d%d", &n, &k);
+	for(int i=1; i<=k; i++)
+		scanf("%d", a + i);
+	if(!(k & 1))
+	{
+		int ans = 0;
+		for(int i=1; i<=k; i+=2)
+			ans += a[i + 1] - a[i];
+		printf("%d\n", ans);
+		return 0;
+	}
+	for(int i=1; i<k; i+=2)
+		pre[i] = pre[i + 1] = pre[i - 1] + a[i + 1] - a[i];
+	for(int i=k-1; i>0; i-=2)
+		suf[i] = suf[i + 1] = suf[i + 2] + a[i + 1] - a[i];
+	int ans = 1e9;
+	for(int i=1; i<=k; i++)
+	{
+		int cur = i & 1? pre[i - 1] + suf[i + 1]
+					: a[i + 1] - a[i - 1] + pre[i - 2] + suf[i + 2];
+		setmin(ans, cur);
+	}
+	printf("%d\n", ans);
+	return 0;
+}
+
+
+

D - Reindeer and Sleigh

+

题目大意

+

NN 个雪橇,编号为 1,2,,N1,2,\dots,N。拉动第 ii 个雪橇需要 RiR_i 只驯鹿。

+

给定 QQ 次询问,每次给定正整数 XX

+
    +
  • XX 只驯鹿最多能拉动多少个雪橇?
  • +
+

注意:雪橇可以任选,每只驯鹿最多只能拉一个雪橇。

+

1N,Q2×1051\le N,Q\le 2\times 10^5
+1Ri1091\le R_i\le 10^9
+1X2×10141\le X\le 2\times 10^{14}

+

分析

+

首先,为了拉到最多的雪橇,我们考虑贪心的策略:从 RiR_i 最小的雪橇开始拉,从小到大直到驯鹿不够用为止。

+

因此我们先对 RiR_i 进行排序,很明显这不影响结果。此时令前缀和 Si=j=1iRjS_i=\sum_{j=1}^i R_j,则当 SiXS_i \le X 时,可以拉动前 ii 个雪橇。故只需找到最大的 ii 使得 SiXS_i\le X 即为所求。此时注意到前缀和已经有序,所以直接在 SS 上使用二分查找即可。

+

总时间复杂度为 O(NlogN)\mathcal O(N\log N)

+

代码

+
#include <cstdio>
+#include <algorithm>
+#define maxn 200005
+using namespace std;
+
+using LL = long long;
+LL s[maxn];
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=0; i<n; i++)
+		scanf("%lld", s + i);
+	sort(s, s + n);
+	for(int i=1; i<n; i++)
+		s[i] += s[i - 1];
+	while(q--)
+	{
+		LL x;
+		scanf("%lld", &x);
+		printf("%d\n", int(upper_bound(s, s + n, x) - s));
+	}
+	return 0;
+}
+
+
+

E - Christmas Color Grid 1

+

题目大意

+

有一个 H×WH\times W 的网格,其中.代表红色#代表绿色

+

随机选一个红色方块,将其涂成绿色。将网格抽象成一张简单无向图,边连接相邻(上下左右)的绿色节点。
+图中连通分量个数的期望值是多少?对 998244353998244353 取模。

+

1H,W10001\le H,W\le 1000

+

分析

+

暴力算法的时间复杂度是 O(H2W2)\mathcal O(H^2W^2),显然不满足要求。

+

考虑将一个红色方块涂成绿色绿色连通分量数的贡献。令它周围属于不同连通分量的绿色方块个数为 nn,则此次操作会将答案减去 n1n-1。这样,我们先预处理出连通分量,就可以 O(1)\mathcal O(1) 的计算答案。

+

此问题可以用 DFS、BFS 或并查集解决。示例代码使用并查集,时间复杂度约为 O(HW)\mathcal O(HW)(忽略小函数)。

+

代码

+
#include <cstdio>
+#include <unordered_map>
+#include <set>
+#include <atcoder/modint>
+#define maxn 1005
+using namespace std;
+
+using modint = atcoder::modint998244353;
+
+int n, m, fa[maxn * maxn];
+char s[maxn][maxn];
+
+int find(int x) { return fa[x] == x? fa[x]: fa[x] = find(fa[x]); }
+inline int calc(int x, int y) { return x * m + y; }
+inline int fc(int x, int y) { return find(calc(x, y)); }
+inline void merge(int x, int y) { fa[find(x)] = find(y); }
+
+int main()
+{
+	scanf("%d%d", &n, &m);
+	for(int i=0; i<n; i++)
+		scanf("%s", s[i]);
+	int k = n * m;
+	for(int i=0; i<k; i++)
+		fa[i] = i;
+	for(int i=0; i<n; i++)
+		for(int j=0; j<m; j++)
+		{
+			if(s[i][j] != '#') continue;
+			if(i && s[i - 1][j] == '#') merge(calc(i, j), calc(i - 1, j));
+			if(j && s[i][j - 1] == '#') merge(calc(i, j), calc(i, j - 1));
+		}
+	int cnt = 0, tot = 0;
+	for(int i=0; i<n; i++)
+		for(int j=0; j<m; j++)
+			if(s[i][j] == '#' && fc(i, j) == calc(i, j))
+				cnt ++;
+	modint ans = 0;
+	for(int i=0; i<n; i++)
+		for(int j=0; j<m; j++)
+			if(s[i][j] == '.')
+			{
+				set<int> S;
+				if(i && s[i - 1][j] == '#') S.insert(fc(i - 1, j));
+				if(s[i + 1][j] == '#') S.insert(fc(i + 1, j));
+				if(j && s[i][j - 1] == '#') S.insert(fc(i, j - 1));
+				if(s[i][j + 1] == '#') S.insert(fc(i, j + 1));
+				int cur = cnt - (int)S.size() + 1;
+				ans += cur, tot ++;
+			}
+	printf("%d\n", (ans / tot).val());
+	return 0;
+}
+
+
+

F - Christmas Present 2

+

题目大意

+

圣诞老人 Santa 要在平面直角坐标系中给孩子们送礼物啦!

+

他的家在 (SX,SY)(S_X,S_Y) 处。他要按照数字顺序给 NN 个孩子送出礼物。第 ii 个孩子的家在 (Xi,Yi)(X_i,Y_i) 处。

+

Santa 手上最多只能一次性拿 KK 个礼物。他想用最短的路程送完所有礼物,再回到自己家,求最短的总路程是多少?

+

1KN2×1051\le K\le N\le 2\times 10^5
+109SX,SY,Xi,Yi109-10^9\le S_X,S_Y,X_i,Y_i \le 10^9
+(SX,SY)(Xi,Yi)(S_X,S_Y)\ne (X_i,Y_i)
+(Xi,Yi)(Xj,Yj) (ij)(X_i,Y_i)\ne (X_j,Y_j)\ (i\ne j)

+

分析

+

这里介绍我自己的独具特(chōu)色(xiàng)的解法,常规解法请参考官方题解

+

考虑 dp,令 fi,jf_{i,j} 表示走到第 ii 个房子并送完前 ii 个礼物时,手上剩余 jj 个礼品的最短路程。很显然,我们每次回家都一定拿满 KK 个礼品,则 j=k1j=k-1 一定是拿了礼品之后送出一个。故:

+

fi,j={d(i1,i)+fi1,j+1(j<k1)minfi1+d(i1,0)+d(0,i)(j=k1)f_{i,j}=\begin{cases} +d(i-1,i)+f_{i-1,j+1} & (j < k-1)\\ +\min f_{i-1}+d(i-1,0)+d(0,i) & (j=k-1) +\end{cases} +

+

其中 d(a,b)d(a,b) 表示房子 aabb 的路程。特别规定 00 号房子为 (SX,SY)(S_X,S_Y),即圣诞老人的住处。这样,答案即为 minfn+d(n,0)\min f_n+d(n,0)

+

直接计算的复杂度为 O(NK)\mathcal O(NK),时间和空间上都不能接受。

+

然而,仔细观察递推式可以发现,fif_i 这一行实际上就是由前一行 fi1f_{i-1} 删去第一个元素,再整体加 d(i1,i)d(i-1,i),并在最后添上 fi,k1f_{i,k-1} 得到的。

+

因此,我们可以用一个deque(双端队列)动态维护状态。对于整体加的操作,用一个变量维护整体的变化值即可。这样空间的问题就得到了解决。再进一步考虑,用一个multiset(可重集合,基于红黑树)或者二叉堆维护队列内元素,求 min\min 的操作时间就减小到了 O(logK)\mathcal O(\log K),可以接受。

+

于是,我们就成功地在 O(NlogK)\mathcal O(N\log K) 的时间和 O(N+K)\mathcal O(N+K) 的空间内解决了此问题。另外,我们还可以把deque同时充当单调队列,这样时间也优化到了 O(N+K)\mathcal O(N+K)。两种实现的示例代码都会给出。

+

代码

+

实现 1:deque + multiset

+
#include <cstdio>
+#include <deque>
+#include <set>
+#define maxn 200005
+using namespace std;
+
+using ld = long double;
+const ld INF = 2e18l;
+
+int x[maxn], y[maxn];
+
+inline ld dis(int i, int j)
+{
+	return __builtin_hypotl(x[i] - x[j], y[i] - y[j]);
+}
+
+int main()
+{
+	int n, k;
+	scanf("%d%d", &n, &k);
+	for(int i=0; i<=n; i++)
+		scanf("%d%d", x + i, y + i);
+	deque<ld> f;
+	multiset<ld> s;
+	k --;
+	for(int i=0; i<k; i++)
+		f.push_back(INF), s.insert(INF);
+	f.push_back(dis(0, 1)), s.insert(dis(0, 1));
+	ld dt = 0;
+	for(int i=2; i<=n; i++)
+	{
+		ld lt = *s.begin() + dis(i - 1, 0) + dis(0, i) + dt;
+		s.erase(s.find(f.front())), f.pop_front();
+		dt += dis(i - 1, i), lt -= dt;
+		f.push_back(lt), s.insert(lt);
+	}
+	printf("%.15Lf\n", dt + *s.begin() + dis(n, 0));
+	return 0;
+}
+
+

实现 2:单调队列

+
#include <cstdio>
+#include <deque>
+#define maxn 200005
+using namespace std;
+
+int x[maxn], y[maxn];
+
+inline double dis(int i, int j)
+{
+	return __builtin_hypotl(x[i] - x[j], y[i] - y[j]);
+}
+
+int main()
+{
+	int n, k;
+	scanf("%d%d", &n, &k);
+	for(int i=0; i<=n; i++)
+		scanf("%d%d", x + i, y + i);
+	deque<pair<double, int>> f;
+	f.emplace_back(dis(0, 1), 1);
+	double dt = 0;
+	for(int i=2; i<=n; i++)
+	{
+		double lt = f.front().first + dis(i - 1, 0) + dis(0, i) + dt;
+		if(f.front().second == i - k) f.pop_front();
+		dt += dis(i - 1, i), lt -= dt;
+		while(!f.empty() && f.back().first >= lt) f.pop_back();
+		f.emplace_back(lt, i);
+	}
+	printf("%.15lf\n", dt + f.front().first + dis(n, 0));
+	return 0;
+}
+
+
+

G - Christmas Color Grid 2

+

题目大意

+

有一个 H×WH\times W 的网格,其中.代表红色#代表绿色

+

随机选一个绿色方块,将其涂成红色。将网格抽象成一张简单无向图,边连接相邻(上下左右)的绿色节点。
+图中连通分量个数的期望值是多少?对 998244353998244353 取模。

+

1H,W10001\le H,W\le 1000

+
+

E 与 G 的区别

+
    +
  • E:将红色涂成绿色。求绿色连通块个数。
  • +
  • G:将绿色涂成红色。求绿色连通块个数。
  • +
+
+

分析

+

注意到本题中红色方块没有任何实质意义,于是先将绿色方块建成一张图。此时题目变为:

+
    +
  • 从简单无向图中随机选取一个结点,将此结点和与其相连的边全部删除。求连通分量个数的期望值,对 998244353998244353 取模。
  • +
+

根据“删去无向图中一个点导致连通分量个数改变”,很容易联想到割点。对求割点的 Tarjan 算法稍加改编,就可以计算删去一个点能把图分割成的连通块个数。详见代码。

+

代码

+
#include <cstdio>
+#include <vector>
+#include <atcoder/modint>
+#define maxn 1000005
+using namespace std;
+
+using modint = atcoder::modint998244353;
+
+inline void setmin(int& x, int y)
+{
+	if(y < x) x = y;
+}
+
+vector<int> G[maxn];
+
+inline void add(int x, int y)
+{
+	G[x].push_back(y);
+	G[y].push_back(x);
+}
+
+int root, low[maxn], cnt, dfn[maxn], ncut[maxn];
+
+void tarjan(int v)
+{
+	low[v] = dfn[v] = ++cnt;
+	ncut[v] = v != root;
+	for(int u: G[v])
+		if(!dfn[u])
+		{
+			tarjan(u);
+			if(low[u] >= dfn[v])
+				ncut[v] ++;
+			setmin(low[v], low[u]);
+		}
+		else setmin(low[v], dfn[u]);
+}
+
+char s[1005][1005];
+int id[1005][1005];
+
+int main()
+{
+	int n, m;
+	scanf("%d%d", &n, &m);
+	for(int i=1; i<=n; i++)
+		scanf("%s", s[i] + 1);
+	int num = 0;
+	for(int i=1; i<=n; i++)
+		for(int j=1; j<=m; j++)
+			if(s[i][j] == '#')
+			{
+				id[i][j] = ++num;
+				if(s[i - 1][j] == '#') add(num, id[i - 1][j]);
+				if(s[i][j - 1] == '#') add(num, id[i][j - 1]);
+			}
+	int cc = -1;
+	for(int i=1; i<=num; i++)
+		if(!dfn[i])
+			tarjan(root = i), cc ++;
+	modint ans = 0;
+	for(int i=1; i<=num; i++)
+		ans += cc + ncut[i];
+	printf("%d\n", (ans / num).val());
+	return 0;
+}
+
+
+

后记

+

首先预祝大家圣诞节快乐 🎉!这场比赛从标题到题目设定,无不与圣诞节有关,AtCoder 官方算是精心准备了这场圣诞庆祝赛 💝。

+

遗憾的是我在比赛中先做了 A~E 和 G,F 题比赛结束后 51s 提交,AC。挺可惜的,难得 G 能做出来一次,差点 AK,结果差的就是不到一分钟 😂。希望下次能比得更好,也希望大家能再接再厉。加油!😚

+]]>
+
+ + <![CDATA[洛谷 P9754 [CSP-S 2023] 结构体 题解]]> + https://goodcoder666.github.io/post/csps2023-t3/ + + + 2023-10-29T11:28:42.000Z + 题目传送门
+洛谷博客 CSDN

+

CSP-S 2023 T3 结构体 题解

+

基本思路

+

本题主要考查编码能力,所以直接给出基本思路:

+
    +
  • 由于可以递归式的创建元素,最多可以同时存在 100100100^{100} 个不同的基础类型的元素。即使算上最大地址的限制,元素的数量也能达到 101810^{18}。显然,依次构造每个元素,在空间和时间上都是无法接受的。
  • +
  • 然而,由于询问数量有限,真正能在查询时用到的元素数量相对很少。因此,我们只需维护一个顶层元素(不隶属于任何其他元素的元素)列表,再根据查询的地址或名称逐层向下找到需要的元素即可。以下是四种操作的具体做法: +
      +
    • 对于 op=1op=1:储存当前类型信息,计算大小和对齐要求并输出。
    • +
    • 对于 op=2op=2:用一个变量记录当前第一个可分配内存的地址,操作时先对齐后计算、输出。
    • +
    • 对于 op=3op=3:从顶层开始,逐层向下寻找,计算地址并输出。
    • +
    • 对于 op=4op=4:从顶层开始,维护当前考查的元素地址,并与给定地址比对,最终输出底层元素名称。
    • +
    +
  • +
+

由以上思路,很容易想到下面三种类型的存储方式:

+
    +
  1. 类型名称作为类型的唯一的标识符。这是最直观的做法,但是效率低下且使用起来较为繁琐,pass。
  2. +
  3. 用 map 将类型名称映射到序号,来代表一种数据类型。相比第一种做法,效率高了很多,但是写起来仍然很麻烦,pass。
  4. +
  5. 用结构体存储类型信息,并使用指针来处理类型之间的关联。这种做法不仅高效,而且编码时也很直观,所以我们将采用这种存储方式。
  6. +
+

分步详解

+

准备

+

LL 表示 long longsetmax(x, y) 等同于 x = max(x, y)

+
inline void setmax(int& x, int y)
+{
+    if(x < y) x = y;
+}
+
+using LL = long long;
+
+

数据类型的存储

+

定义 struct DataType,表示一种数据类型:

+
struct DataType
+{
+    const string name; // 类型名
+    LL size, actual_size; // 对齐后的大小和实际大小(有数据的部分的长度)
+    int indent; // 对齐要求
+    vector<pair<DataType*, string>> members; // 类型成员,<成员类型指针,成员名称> 方式存储
+};
+
+

对齐操作,依照如下公式:

+

=×{对齐后的地址} = \lceil \frac {对齐前的地址} {对齐要求} \rceil \times {对齐要求} +

+
inline LL shift(LL addr)
+{
+    return addr % indent? (addr / indent + 1) * indent: addr;
+}
+
+

维护操作,用于操作 11 后计算大小:

+
inline void maintain()
+{
+    size = indent = 0;
+    for(const auto& m: members)
+    {
+        setmax(indent, m.first->indent);
+        size = m.first->shift(size) + m.first->size;
+    }
+    actual_size = size;
+    size = shift(size);
+}
+
+

注意 shiftmaintain 都是 DataType 的成员函数。

+

主函数中,用一个 unordered_map 记录类型名到数据类型的映射关系

+
unordered_map<string, DataType*> types;
+
+

添加基本类型

+
auto add_base_type = [&](string name, int size) -> void {
+    DataType* t = new DataType(name);
+    t->size = t->indent = t->actual_size = size;
+    types[name] = t;
+};
+add_base_type("byte", 1);
+add_base_type("short", 2);
+add_base_type("int", 4);
+add_base_type("long", 8);
+
+

操作 1:定义类型

+

由于 DataType 中已经实现维护操作,简单处理一下输入即可:

+
string s;
+int k;
+cin >> s >> k;
+DataType* type = new DataType(s);
+types[s] = type;
+type->members.resize(k);
+for(auto& m: type->members)
+{
+    string t;
+    cin >> t >> m.second;
+    m.first = types[t];
+}
+type->maintain();
+cout << type->size << ' ' << type->indent << '\n';
+
+

操作 2:定义元素

+

根据「基本思路」中给出的做法,维护当前第一个可分配的地址和顶层元素列表

+
LL cur_addr = 0LL;
+vector<Object> toplevel_objects;
+
+

Object 的定义:

+
struct Object
+{
+    DataType* type; // 类型
+    string name; // 名称
+    LL addr; // 地址
+};
+
+

计算地址并保存元素

+
Object obj;
+string t;
+cin >> t >> obj.name; // 输入
+obj.type = types[t]; // 找到类型指针
+obj.addr = obj.type->shift(cur_addr); // 对齐
+cur_addr = obj.addr + obj.type->size; // 更新可分配的地址
+toplevel_objects.push_back(obj); // 保存元素
+
+

输出元素地址

+
cout << obj.addr << '\n';
+
+

操作 3:访问元素

+

定义一个辅助函数,类似于 Python 中的 split(),将一个字符串根据指定分隔符分成若干段:

+
inline void split(const string& s, char sep, vector<string>& res)
+{
+    string t;
+    for(char c: s)
+        if(c == sep)
+            res.push_back(t), t.clear();
+        else t += c;
+    res.push_back(t);
+}
+
+

处理字符串并找到顶层元素

+
// 读入
+string s;
+cin >> s;
+// 分割
+vector<string> ord;
+split(s, '.', ord);
+// 根据名称匹配顶层元素
+LL addr;
+DataType* type;
+for(auto& obj: toplevel_objects)
+    if(obj.name == ord[0])
+    {
+        addr = obj.addr;
+        type = obj.type;
+        break;
+    }
+
+

逐层向下,计算地址

+
// ord[0] 对应顶层元素名称,删掉
+ord.erase(ord.begin());
+// 逐层向下遍历
+for(string& s: ord)
+    for(auto& m: type->members)
+    {
+        addr = m.first->shift(addr); // 地址对齐
+        if(m.second == s) // 名称匹配
+        {
+            type = m.first; // 找到下一层,向下遍历
+            break;
+        }
+        addr += m.first->size; // 地址移到下一个元素
+    }
+
+

输出最终地址

+
cout << addr << '\n';
+
+

操作 4:访问地址

+

同操作 3,先找到顶层元素

+
LL addr;
+cin >> addr;
+if(addr >= cur_addr) // 大于最高有效地址,直接挂掉
+{
+    cout << "ERR\n";
+    continue;
+}
+DataType* type = nullptr;
+LL f_addr = 0LL; // 当前考察的地址
+string res; // 结果字符串
+for(auto& obj: toplevel_objects)
+{
+    if(addr < obj.addr) goto bad; // 特判由于对齐导致的地址无效
+    if(addr < obj.addr + obj.type->size) // 地址在当前范围内,记录结果
+    {
+        type = obj.type;
+        res = obj.name;
+        f_addr = obj.addr;
+        break;
+    }
+}
+
+

向下寻找并输出

+
// 循环条件:(1) 地址有效 (2) 不是基本类型(类型有成员)
+while(addr < f_addr + type->actual_size && !type->members.empty())
+    for(auto& m: type->members)
+    {
+        f_addr = m.first->shift(f_addr); // 对齐
+        if(addr < f_addr) goto bad; // 特判,同上
+        if(addr < f_addr + m.first->size)
+        {
+            type = m.first;
+            res.push_back('.');
+            res += m.second;
+            break;
+        }
+        f_addr += m.first->size;
+    }
+if(addr < f_addr + type->actual_size) cout << res << '\n'; // 地址有效则输出结果
+else cout << "ERR\n"; // 地址无效
+continue;
+bad: cout << "ERR\n"; // 前面使用的 bad 标签
+
+

完整代码

+

下面是赛时代码,也是前面讲解中使用的:

+
#include <iostream>
+#include <vector>
+#include <string>
+#include <unordered_map>
+#include <algorithm>
+using namespace std;
+
+inline void setmax(int& x, int y)
+{
+    if(x < y) x = y;
+}
+
+using LL = long long;
+
+struct DataType
+{
+    const string name;
+    LL size, actual_size;
+    int indent;
+    vector<pair<DataType*, string>> members;
+    inline DataType(const string& n): name(n) {}
+    inline LL shift(LL addr)
+    {
+        return addr % indent? (addr / indent + 1) * indent: addr;
+    }
+    inline void maintain()
+    {
+        size = indent = 0;
+        for(const auto& m: members)
+        {
+            setmax(indent, m.first->indent);
+            size = m.first->shift(size) + m.first->size;
+        }
+        actual_size = size;
+        size = shift(size);
+    }
+};
+
+struct Object
+{
+    DataType* type;
+    string name;
+    LL addr;
+};
+
+inline void split(const string& s, char sep, vector<string>& res)
+{
+    string t;
+    for(char c: s)
+        if(c == sep)
+            res.push_back(t), t.clear();
+        else t += c;
+    res.push_back(t);
+}
+
+int main()
+{
+    ios::sync_with_stdio(false); cin.tie(nullptr);
+    unordered_map<string, DataType*> types;
+    auto add_base_type = [&](string name, int size) -> void {
+        DataType* t = new DataType(name);
+        t->size = t->indent = t->actual_size = size;
+        types[name] = t;
+    };
+    add_base_type("byte", 1);
+    add_base_type("short", 2);
+    add_base_type("int", 4);
+    add_base_type("long", 8);
+    int q;
+    cin >> q;
+    vector<Object> toplevel_objects;
+    LL cur_addr = 0LL;
+    while(q--)
+    {
+        int op;
+        cin >> op;
+        if(op == 1)
+        {
+            string s;
+            int k;
+            cin >> s >> k;
+            DataType* type = new DataType(s);
+            types[s] = type;
+            type->members.resize(k);
+            for(auto& m: type->members)
+            {
+                string t;
+                cin >> t >> m.second;
+                m.first = types[t];
+            }
+            type->maintain();
+            cout << type->size << ' ' << type->indent << '\n';
+        }
+        else if(op == 2)
+        {
+            Object obj;
+            string t;
+            cin >> t >> obj.name;
+            obj.type = types[t];
+            obj.addr = obj.type->shift(cur_addr);
+            cur_addr = obj.addr + obj.type->size;
+            toplevel_objects.push_back(obj);
+            cout << obj.addr << '\n';
+        }
+        else if(op == 3)
+        {
+            string s;
+            cin >> s;
+            vector<string> ord;
+            split(s, '.', ord);
+            LL addr;
+            DataType* type;
+            for(auto& obj: toplevel_objects)
+                if(obj.name == ord[0])
+                {
+                    addr = obj.addr;
+                    type = obj.type;
+                    break;
+                }
+            ord.erase(ord.begin());
+            for(string& s: ord)
+                for(auto& m: type->members)
+                {
+                    addr = m.first->shift(addr);
+                    if(m.second == s)
+                    {
+                        type = m.first;
+                        break;
+                    }
+                    addr += m.first->size;
+                }
+            cout << addr << '\n';
+        }
+        else // op == 4
+        {
+            LL addr;
+            cin >> addr;
+            if(addr >= cur_addr)
+            {
+                cout << "ERR\n";
+                continue;
+            }
+            DataType* type = nullptr;
+            LL f_addr = 0LL;
+            string res;
+            for(auto& obj: toplevel_objects)
+            {
+                if(addr < obj.addr) goto bad;
+                if(addr < obj.addr + obj.type->size)
+                {
+                    type = obj.type;
+                    res = obj.name;
+                    f_addr = obj.addr;
+                    break;
+                }
+            }
+            while(addr < f_addr + type->actual_size && !type->members.empty())
+                for(auto& m: type->members)
+                {
+                    f_addr = m.first->shift(f_addr);
+                    if(addr < f_addr) goto bad;
+                    if(addr < f_addr + m.first->size)
+                    {
+                        type = m.first;
+                        res.push_back('.');
+                        res += m.second;
+                        break;
+                    }
+                    f_addr += m.first->size;
+                }
+            if(addr < f_addr + type->actual_size) cout << res << '\n';
+            else cout << "ERR\n";
+            continue;
+            bad: cout << "ERR\n";
+        }
+    }
+    for(auto it=types.begin(); it!=types.end(); it++)
+        delete it->second;
+    return 0;
+}
+
+

程序共计 180180 行,长度 4.64KB4.64\mathrm{KB},运行用时 73ms73\mathrm{ms}

+

实际上 Object 的定义没有必要,也不需要存储每个顶层元素的地址,同时还可以稍加压行:

+
#include <bits/stdc++.h>
+using namespace std;
+
+using LL = long long;
+
+struct DataType {
+    const string name;
+    LL size, actual_size;
+    int indent;
+    vector<pair<DataType*, string>> members;
+    inline DataType(const string& n): name(n) {}
+    inline LL shift(LL addr) {
+        return addr % indent? (addr / indent + 1) * indent: addr;
+    }
+    inline void maintain() {
+        size = indent = 0;
+        for(const auto& m: members)
+        {
+            indent = max(indent, m.first->indent);
+            size = m.first->shift(size) + m.first->size;
+        }
+        actual_size = size;
+        size = shift(size);
+    }
+};
+
+inline void split(const string& s, char sep, vector<string>& res) {
+    string t;
+    for(char c: s)
+        if(c == sep) res.push_back(t), t.clear();
+        else t += c;
+    res.push_back(t);
+}
+
+int main() {
+    ios::sync_with_stdio(false); cin.tie(nullptr);
+    unordered_map<string, DataType*> types;
+    auto add_base_type = [&](string name, int size) -> void {
+        DataType* t = new DataType(name);
+        t->size = t->indent = t->actual_size = size;
+        types[name] = t;
+    };
+    add_base_type("byte", 1);
+    add_base_type("short", 2);
+    add_base_type("int", 4);
+    add_base_type("long", 8);
+    int q;
+    cin >> q;
+    vector<pair<DataType*, string>> toplevel_objects;
+    LL cur_addr = 0LL;
+    while(q--) {
+        int op;
+        cin >> op;
+        if(op == 1) {
+            string s;
+            int k;
+            cin >> s >> k;
+            DataType* type = new DataType(s);
+            types[s] = type;
+            type->members.resize(k);
+            for(auto& m: type->members) {
+                string t;
+                cin >> t >> m.second;
+                m.first = types[t];
+            }
+            type->maintain();
+            cout << type->size << ' ' << type->indent << '\n';
+        }
+        else if(op == 2) {
+            string t, name;
+            cin >> t >> name;
+            DataType* type = types[t];
+            cur_addr = type->shift(cur_addr);
+            cout << cur_addr << '\n';
+            cur_addr += type->size;
+            toplevel_objects.emplace_back(type, name);
+        }
+        else if(op == 3) {
+            string s;
+            cin >> s;
+            vector<string> ord;
+            split(s, '.', ord);
+            LL addr = 0LL;
+            DataType* type;
+            for(auto& obj: toplevel_objects) {
+                addr = obj.first->shift(addr);
+                if(obj.second == ord[0]) {
+                    type = obj.first;
+                    break;
+                }
+                addr += obj.first->size;
+            }
+            ord.erase(ord.begin());
+            for(string& s: ord)
+                for(auto& m: type->members) {
+                    addr = m.first->shift(addr);
+                    if(m.second == s) {
+                        type = m.first;
+                        break;
+                    }
+                    addr += m.first->size;
+                }
+            cout << addr << '\n';
+        }
+        else {
+            LL addr;
+            cin >> addr;
+            if(addr >= cur_addr) {
+                cout << "ERR\n";
+                continue;
+            }
+            DataType* type = nullptr;
+            LL f_addr = 0LL;
+            string res;
+            for(auto& obj: toplevel_objects) {
+                f_addr = obj.first->shift(f_addr);
+                if(addr < f_addr) goto bad;
+                if(addr < f_addr + obj.first->size) {
+                    type = obj.first;
+                    res = obj.second;
+                    break;
+                }
+                f_addr += obj.first->size;
+            }
+            while(addr < f_addr + type->actual_size && !type->members.empty())
+                for(auto& m: type->members) {
+                    f_addr = m.first->shift(f_addr);
+                    if(addr < f_addr) goto bad;
+                    if(addr < f_addr + m.first->size) {
+                        type = m.first;
+                        res.push_back('.');
+                        res += m.second;
+                        break;
+                    }
+                    f_addr += m.first->size;
+                }
+            if(addr < f_addr + type->actual_size) cout << res << '\n';
+            else cout << "ERR\n";
+            continue;
+            bad: cout << "ERR\n";
+        }
+    }
+    for(auto it=types.begin(); it!=types.end(); it++)
+        delete it->second;
+    return 0;
+}
+
+

这样只有 146146 行,4.51KB4.51\mathrm{KB}

+

不过个人觉得写个 Object 更清楚,所以讲解的时候就没改啦~

+

后记

+

算法固然重要,但是编码能力也很重要!强烈建议各位 OIer 重视大模拟,不在这种题上挂分~

+

写大模拟需要注意的几个点:

+
    +
  • 变量名写清楚,全写 abcd 到后面自己都不知道是啥,没法调试
  • +
  • 该用指针就用指针,不要害怕,用多了会发现真的很好用
  • +
  • 适当使用类和结构体,尽量不要全部使用 int 数组
  • +
  • 时间复杂度允许的情况下,可读性比性能重要!!(比如本题没有使用二分查找)
  • +
+

祝大家在 NOIP 2023 取得好成绩!求赞qwq

+]]>
+
+ + <![CDATA[AtCoder Beginner Contest 318 G - Typical Path Problem 题解]]> + https://goodcoder666.github.io/post/abc318/ + + + 2023-09-03T05:27:38.000Z + G - Typical Path Problem +

题目大意

+

给定一张 NN 个点、MM 条边的简单无向图 GG 和三个整数 A,B,CA,B,C

+

是否存在一条从顶点 AACC,且经过 BB 的简单路径?

+

数据范围:

+
    +
  • 3N2×1053\le N\le 2\times 10^5
  • +
  • N1Mmin(N(N1)2,2×105)N-1\le M\le \min(\frac{N(N-1)}2,2\times 10^5)
  • +
  • 1A,B,CN1\le A,B,C\le NA,B,CA,B,C 互不相同)
  • +
+
+

什么是 简单路径
+简单路径 是不重复经过同一个点的路径。例如,1231\to 2\to 3 是简单路径,但 1211\to 2\to 1 不是简单路径。

+
+

解法1:最大流

+

不难发现,存在一条 ABCA\to B\to C 的简单路径,当且仅当存在一条 BAB\to A 和一条 BCB\to C 的路径,使得这两条路径不经过同一个点(BB 除外)。因此,我们可以构建网络流模型来解决此问题。

+

考虑由 (2N+2)(2N+2) 个点组成的有向图 GG'

+
    +
  • 源点:ss
  • +
  • 汇点:tt
  • +
  • GG 中每个点对应的入点:x1,,xNx_1,\dots,x_N
  • +
  • GG 中每个点对应的出点:y1,,yNy_1,\dots,y_N
  • +
+

然后进行连边:

+
    +
  • 对于每个 1iN1\le i\le N,从入点 xix_i 向出点 yiy_i 连接一条流量为 11 的边;
  • +
  • 从源点 ss 到中转点的入点 xBx_B 连接一条流量为 22 的边;
  • +
  • AACC 的出点 yA,yCy_A,y_C 向汇点 tt 分别连接一条流量为 11 的边;
  • +
  • 最后,(u,v)EG\forall (u,v)\in E_G,连接 yuxvy_u \to x_vyvxuy_v \to x_u,流量为 11
  • +
+

计算 sstt 的最大流,如果最大流为 22 则必定有存在不经过同一个顶点的 BA,BCB\to A,B\to C 的路径。

+
+

证明
+显然,如果最大流为 22,必然通过了 yAy_AyCy_C 向汇点连接的边,则一定分别有 BAB\to ABCB\to C 的路径。
+假设选择的这两条路径经过了同一顶点 vv,则两流都必须经过 xvyvx_v\to y_v 这一条流量为 11 的边,此时最大流不可能超过 11。而最大流为 22,说明假设不成立,故没有经过同一顶点。

+
+

若使用 Dinic\text{Dinic} 算法,由于最大流不超过 22,网络流的时间复杂度为 O(N+M)\mathcal O(N+M)

+

代码实现

+

在以下的两种实现中,我们规定

+
    +
  • 源点:s=0s=0
  • +
  • 汇点:t=2n+1t=2n+1
  • +
  • ii 的入点:xi=ix_i=i
  • +
  • ii 的出点:yi=n+iy_i=n+i
  • +
+

AC Library 实现

+

AtCoder Library 内置最大流的 Dinic\text{Dinic} 实现。

+
#include <cstdio>
+#include <atcoder/maxflow>
+using namespace std;
+
+int main()
+{
+	int n, m, a, b, c;
+	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
+	int s = 0, t = (n << 1) + 1;
+	atcoder::mf_graph<int> G(t + 1);
+	G.add_edge(s, b + n, 2);
+	G.add_edge(a + n, t, 1);
+	G.add_edge(c + n, t, 1);
+	for(int i=1; i<=n; i++)
+		G.add_edge(i, i + n, 1);
+	while(m--)
+	{
+		int x, y;
+		scanf("%d%d", &x, &y);
+		G.add_edge(x + n, y, 1);
+		G.add_edge(y + n, x, 1);
+	}
+	puts(G.flow(s, t, 2) == 2? "Yes": "No");
+	return 0;
+}
+
+

Dinic 手写实现

+

Dinic\text{Dinic} 算法对于此图的时间复杂度为 O(N+M)\mathcal O(N+M)。如果不清楚算法原理可以参考 OI Wiki

+
+

关于空间分配问题
+由于新图 GG' 包含 (N+2M+3)(N+2M+3) 条边,若使用静态链式前向星存图,数组大小需要开到 2(N+2M+3)2(N+2M+3),其理论最大值为 1.2×106+61.2\times 10^6+6。此处建议使用 1.25×1061.25\times 10^6 大小的数组。

+
+
#include <cstdio>
+#include <cstring>
+#include <queue>
+#include <algorithm>
+#define maxn 400005
+#define maxm 1250005
+using namespace std;
+
+int n, s, t, head[maxn], cur[maxn], dis[maxn],
+	cnt, w[maxm], to[maxm], nxt[maxm];
+
+inline void add(int u, int v, int flow)
+{
+	nxt[cnt] = head[u];
+	head[u] = cnt;
+	to[cnt] = v;
+	w[cnt++] = flow;
+}
+
+inline void add_flow(int u, int v, int f)
+{
+	add(u, v, f);
+	add(v, u, 0);
+}
+
+inline bool bfs()
+{
+	memset(dis, -1, sizeof(int) * n);
+	dis[s] = 0, cur[s] = head[s];
+	queue<int> q;
+	q.push(s);
+	while(!q.empty())
+	{
+		int v = q.front(); q.pop();
+		for(int i=head[v]; ~i; i=nxt[i])
+			if(w[i])
+			{
+				int u = to[i];
+				if(dis[u] == -1)
+				{
+					dis[u] = dis[v] + 1, cur[u] = head[u];
+					if(u == t) return true;
+					q.push(u);
+				}
+			}
+	}
+	return false;
+}
+
+int dfs(int v, int flow)
+{
+	if(v == t) return flow;
+	int res = 0;
+	for(int i=cur[v]; ~i && flow; i=nxt[i])
+	{
+		cur[v] = i;
+		int u = to[i];
+		if(w[i] && dis[u] == dis[v] + 1)
+		{
+			int k = dfs(u, min(flow, w[i]));
+			w[i] -= k;
+			w[i ^ 1] += k;
+			flow -= k;
+			res += k;
+		}
+	}
+	return res;
+}
+
+int main()
+{
+	int n, m, a, b, c;
+	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
+	s = 0, t = (n << 1) + 1, ::n = t + 1;
+	memset(head, -1, sizeof(int) * ::n);
+	add_flow(s, b + n, 2);
+	add_flow(a + n, t, 1);
+	add_flow(c + n, t, 1);
+	for(int i=1; i<=n; i++)
+		add_flow(i, i + n, 1);
+	while(m--)
+	{
+		int x, y;
+		scanf("%d%d", &x, &y);
+		add_flow(x + n, y, 1);
+		add_flow(y + n, x, 1);
+	}
+	int mf = 0;
+	while(bfs()) mf += dfs(s, 2);
+	puts(mf == 2? "Yes": "No");
+	return 0;
+}
+
+

解法2:圆方树

+

注意到以下算法的正确性:

+
    +
  • 找到 ACA\to C 的任意简单路径。对于经过的每一个点双连通分量,如果 BB 在此点双内,则必然存在 ABCA\to B\to C 的简单路径;如果 BB 不属于任一经过的点双,则不可能存在 ABCA\to B\to C 的简单路径。
  • +
+

因此,可以使用 Tarjan\text{Tarjan} 算法构造原图的圆方树 TT 来解决此问题。将上述算法转换到圆方树上如下:

+
    +
  • TT 上找到 ACA\to C 的唯一简单路径。对于经过的每一个方点,如果 BB 是与其相邻的圆点,则必然存在 ABCA\to B\to C 的简单路径;如果 BB 不与任一经过的方点相邻,则不可能存在 ABCA\to B\to C 的简单路径。
  • +
+

总时间复杂度为 O(N+M)\mathcal O(N+M),实际运行时间优于网络流解法。

+

代码实现

+

小贴士:圆方树相关的数组要开到两倍大小,不然会 RE 哦~

+
#include <cstdio>
+#include <cstdlib>
+#include <vector>
+#define maxn 200005
+using namespace std;
+
+inline void setmin(int& x, int y)
+{
+	if(y < x) x = y;
+}
+
+vector<int> G[maxn], T[maxn << 1];
+
+inline void add_edge(vector<int>* G, int x, int y)
+{
+	G[x].push_back(y);
+	G[y].push_back(x);
+}
+
+int dfc, dfn[maxn], low[maxn], top, st[maxn], cnt;
+
+void tarjan(int v)
+{
+	low[v] = dfn[v] = ++dfc;
+	st[++top] = v;
+	for(int u: G[v])
+		if(!dfn[u])
+		{
+			tarjan(u);
+			setmin(low[v], low[u]);
+			if(low[u] == dfn[v])
+			{
+				add_edge(T, v, ++cnt);
+				do add_edge(T, st[top], cnt);
+				while(st[top--] != u);
+			}
+		}
+		else setmin(low[v], dfn[u]);
+}
+
+int n, m, a, b, c, ct[maxn << 1];
+void dfs(int v, int par)
+{
+	if(v > n)
+		for(int u: T[v])
+			ct[u] ++;
+	if(v == c)
+	{
+		puts(ct[b]? "Yes": "No");
+		exit(0);
+	}
+	for(int u: T[v])
+		if(u != par)
+			dfs(u, v);
+	if(v > n)
+		for(int u: T[v])
+			ct[u] --;
+}
+
+int main()
+{
+	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
+	while(m--)
+	{
+		int x, y;
+		scanf("%d%d", &x, &y);
+		add_edge(G, x, y);
+	}
+	cnt = n;
+	tarjan(1);
+	dfs(a, -1);
+	return 0;
+}
+
+

总结

+

三种解法的对比参见下表:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
解法代码长度运行时间内存占用
最大流(AC Library)[1]523 B523~\mathrm{B}337 ms337~\mathrm{ms}106480 KB106480~\mathrm{KB}
最大流(Dinic)[2]1650 B1650~\mathrm{B}334 ms334~\mathrm{ms}46980 KB46980~\mathrm{KB}
圆方树[3]1142 B1142~\mathrm{B}162 ms162~\mathrm{ms}57824 KB57824~\mathrm{KB}
+

可见,圆方树算法的运行速度最快,最大流(AC Library)的代码最短,最大流(Dinic)的内存占用最小。

+
+

个人评价
+这道题出得很好,题意简单而内涵丰富。
+我赛时甚至没想到还可以网络流

+
+
+
+
    +
  1. https://atcoder.jp/contests/abc318/submissions/45209577 ↩︎

    +
  2. +
  3. https://atcoder.jp/contests/abc318/submissions/45212257 ↩︎

    +
  4. +
  5. https://atcoder.jp/contests/abc318/submissions/45210151 ↩︎

    +
  6. +
+
+]]>
+
+ + <![CDATA[TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解]]> + https://goodcoder666.github.io/post/abc298/ + + + 2023-04-19T10:34:10.000Z + 好久没写题解了,这就来水一篇。

+

A - Job Interview

+

题目大意

+

给定一个长为 NN 的字符串 SS,由 o-x 组成。

+

判断 SS 是否符合下列条件:

+
    +
  • SS 中至少有一个 o
  • +
  • SS 中没有 x
  • +
+

1N1001\le N\le 100

+

分析

+

签到题。直接按题意模拟即可。

+

代码

+
#include <cstdio>
+using namespace std;
+
+int main()
+{
+	while(getchar() != '\n');
+	char c;
+	bool ok = false;
+	while((c = getchar()) != '\n')
+	{
+		if(c == 'x')
+		{
+			puts("No");
+			return 0;
+		}
+		if(c == 'o')
+			ok = true;
+	}
+	puts(ok? "Yes": "No");
+	return 0;
+}
+
+
+

Python 水题大法 速通大法

+
input()
+s = input()
+print('Yes' if 'o' in s and 'x' not in s else 'No')
+
+

成功省掉208208个字符(

+
+
+

B - Coloring Matrix

+

题目大意

+

给定两个 N×NN\times N 的矩阵 AABB,都由 0011 组成。

+

你可以将 AA 顺时针旋转 0°,90°,180°0\degree,90\degree,180\degree270°270\degree(任选其一)。

+

判断旋转后的 AA 能否满足:

+
    +
  • 对于每个 Ai,j=1A_{i,j}=1(i,j)(i,j)Bi,j=1B_{i,j}=1
  • +
+

1N1001\le N\le 100

+

分析

+

原题中还贴心的给出了如何将一个矩阵旋转90°90\degree,照题意模拟,旋转44次并逐个判断即可。

+

代码

+
#include <cstdio>
+#define maxn 105
+using namespace std;
+
+int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	for(int i=0; i<n; i++)
+		for(int j=0; j<n; j++)
+			scanf("%d", a[i] + j);
+	for(int i=0; i<n; i++)
+		for(int j=0; j<n; j++)
+			scanf("%d", b[i] + j);
+	for(int x=0; x<4; x++)
+	{
+		for(int i=0; i<n; i++)
+			for(int j=0; j<n; j++)
+				c[i][j] = a[i][j];
+		for(int i=0; i<n; i++)
+			for(int j=0; j<n; j++)
+				a[i][j] = c[n - 1 - j][i];
+		for(int i=0; i<n; i++)
+			for(int j=0; j<n; j++)
+				if(a[i][j] && !b[i][j])
+					goto bad; // goto 不是好习惯(改不掉了),千万不要学
+		puts("Yes");
+		return 0;
+		bad:;
+	}
+	puts("No");
+	return 0;
+}
+
+
+

C - Cards Query Problem

+

题目大意

+

NN 个盒子,编号 1N1\sim N,初始均为空。依次处理 QQ 次询问:

+
    +
  • 1 i j:将数字 ii 写在一张空卡牌上,放入盒子 jj
  • +
  • 2 i:按升序输出盒子 ii 中的所有卡牌(允许重复)。
  • +
  • 3 i:按升序输出包含卡牌 ii 的所有盒子的编号。若一个盒子里有多张卡牌 ii,则这个盒子的编号仅输出一次。
  • +
+

1N,Q2×1051\le N,Q\le 2\times 10^5

+

对于查询中所有卡牌上的数字 xx,均有 1x2×1051\le x\le 2\times 10^5
+对于查询中所有的盒子编号 yy,均有 1yN1\le y\le N

+

题目保证输出不超过 2×1052\times 10^5 个整数。

+

分析

+

我们分别考虑两种输出操作的做法。

+
    +
  • 2 i:很容易想到,既然要按升序输出,并且允许重复,我们可以使用 NNmultiset 来依次存储每个盒子中的卡牌,处理操作 11 时更新。
  • +
  • 3 i:首先不能从 NN 个盒子中依次查找,这样明显会 TLE。正确的做法是,使用 2×1052\times 10^5set(注意不能重复,所以不用 multiset)分别存储每张卡牌所在的箱子编号,处理操作 11 时更新。
  • +
+

此外,本题也可以使用 priority_queuemap,甚至直接输出时排序并去重,不过使用 set 的方式是最简单、代码量最少的。几种方法的总时间复杂度都是 O(QlogN)\mathcal O(Q\log N)

+

代码

+
#include <cstdio>
+#include <set>
+#define maxn 200005
+using namespace std;
+
+multiset<int> box[maxn];
+set<int> has[maxn];
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	while(q--)
+	{
+		int op, i;
+		scanf("%d%d", &op, &i);
+		if(op == 1)
+		{
+			int j;
+			scanf("%d", &j);
+			box[j].insert(i);
+			has[i].insert(j);
+		}
+		else if(op == 2)
+		{
+			for(int x: box[i])
+				printf("%d ", x);
+			putchar('\n');
+		}
+		else if(op == 3)
+		{
+			for(int x: has[i])
+				printf("%d ", x);
+			putchar('\n');
+		}
+	}
+	return 0;
+}
+
+
+

D - Writing a Numeral

+

题目大意

+

我们有一个字符串 SS。初始时,S=S= 1

+

处理如下 QQ 次询问:

+
    +
  • 1 x:将数字 xx 追加至 SS 的最后面。保证 x{1,2,3,4,5,6,7,8,9}x \in \{1,2,3,4,5,6,7,8,9\}
  • +
  • 2:删除 SS 的第一个字符。保证此时 S>1|S|>1
  • +
  • 3:输出 SS 在十进制中对应的数字,对 998244353998244353 取模。
  • +
+

1Q6×1051\le Q\le 6\times 10^5

+

分析

+

首先,我们必须使用一个 queuedeque 来存储字符串 SS。然后,为了在 O(1)\mathcal O(1) 的时间内处理第三种操作,我们必须维护 Smod(P=998244353)S \bmod (P=998244353) 的值,记为 AA。下面考虑前两种操作对 AA 的影响:

+
    +
  • 1 x:只需在十进制中腾出一位 00 再加上 xx 即可,可表示为 A(10A+x)modPA \leftarrow (10A+x)\bmod P
  • +
  • 2:先从队列中取出 SS 的第一位,记为 xx。我们需要从 AA 中减掉最高位乘上其在十进制中的权值,即 A(A10Sx)modPA \leftarrow (A-10^{|S|}x)\bmod P(此时 S|S| 表示队列取出前一位后的长度,等同于取出前的 S1|S|-1
  • +
+

对于 10n10^n 的计算,我们可以用一个变量实时维护 10SmodP10^{|S|}\bmod P 的值,也可以预处理出所有 10nmodP10^n \bmod P,或者直接使用快速幂。

+

总时间复杂度为 O(QlogQ)\mathcal O(Q\log Q)(快速幂)或 O(Q)\mathcal O(Q)(预处理)。

+

代码

+

实现 11:使用 AtCoder Library + 快速幂,队列使用 deque

+
#include <cstdio>
+#include <deque>
+#include <atcoder/modint>
+using namespace std;
+
+using modint = atcoder::modint998244353;
+
+int main()
+{
+	deque<int> s;
+	s.push_back(1);
+	int q;
+	scanf("%d", &q);
+	modint ans = 1;
+	while(q--)
+	{
+		int op;
+		scanf("%d", &op);
+		if(op == 1)
+		{
+			int x;
+			scanf("%d", &x);
+			s.push_back(x);
+			ans = ans * 10 + x;
+		}
+		else if(op == 2)
+		{
+			int x = s.front(); s.pop_front();
+			ans -= x * modint(10).pow((int)s.size());
+		}
+		else printf("%d\n", ans.val());
+	}
+	return 0;
+}
+
+

实现 22:用变量维护 10SmodP10^{|S|} \bmod P 的值,队列使用 queue

+
#include <cstdio>
+#include <queue>
+#define MOD 998244353
+using namespace std;
+
+int main()
+{
+	int Q;
+	scanf("%d", &Q);
+	queue<int> q;
+	q.push(1);
+	int ans = 1, p = 1;
+	while(Q--)
+	{
+		int op;
+		scanf("%d", &op);
+		if(op == 1)
+		{
+			int x;
+			scanf("%d", &x);
+			q.push(x);
+			ans = (ans * 10LL + x) % MOD;
+			p = p * 10LL % MOD;
+		}
+		else if(op == 2)
+		{
+			ans -= (long long) q.front() * p % MOD; q.pop();
+			p = p * 299473306LL % MOD; // 299473306 是 10 对于 MOD 的逆元,这句话相当于把 p 除以 10 
+			if(ans < 0) ans += MOD;
+		}
+		else printf("%d\n", ans);
+	}
+	return 0;
+}
+
+
+

E - Unfair Sugoroku

+

题目大意

+

Takahashi 和 Aoki 将玩一个游戏。游戏规则如下:

+
    +
  • 游戏棋盘有 NN 个点(编号 1N1\sim N),两玩家轮流投骰子并前进。
  • +
  • Takahashi 初始在点 AA,Aoki 初始在点 BB
  • +
  • Takahashi 的骰子等概率出现 1,2,,P1,2,\dots,P,Aoki 的骰子等概率出现 1,2,,Q1,2,\dots,Q
  • +
  • 当一个玩家当前在点 xx 且骰子出现 ii 时,他移动到点 min(x+i,N)\min(x+i,N)
  • +
  • 先到达点 NN 的玩家胜利。
  • +
+

假定 Takahashi 先行,求他赢的概率,对 998244353998244353 取模。

+

2N1002\le N\le 100
+1A,BN1\le A,B\le N
+1P,Q101\le P,Q\le 10

+

分析

+

自己的赛时解法太复杂了,这里介绍官方题解的做法。

+

考虑概率 DP(下面用 Ta 表示 Takahashi,Ao 表示 Aoki):

+
    +
  • fi,jf_{i,j} 表示 Ta 在点 ii,Ao 在点 jj,下一轮 Ta 移动时 Ta 获胜的概率。
  • +
  • gi,jg_{i,j} 表示 Ta 在点 ii,Ao 在点 jj,下一轮 Ao 移动时 Ta 获胜的概率。
  • +
+

首先考虑初始状态。根据游戏规则,对于任意 1i<n1\le i<nfn,i=gn,i=1,fi,n=gi,n=0f_{n,i}=g_{n,i}=1,f_{i,n}=g_{i,n}=0

+

转移也很显然:

+
    +
  • 对于 Ta 当前走的每种可能的步数 k=1,2,,Pk=1,2,\dots,P,有 fi,j:=fi,j+1Pgmin(i+k,N),jf_{i,j}:=f_{i,j}+\frac1Pg_{\min(i+k,N),j}
  • +
  • 对于 Ao 当前走的每种可能的步数 k=1,2,,Qk=1,2,\dots,Q,有 gi,j:=gi,j+1Qfi,min(j+k,N)g_{i,j}:=g_{i,j}+\frac1Qf_{i,\min(j+k,N)}
  • +
+

整理上面的式子,得到:

+

fi,j={0(j=N)1(i=N)1Pk=1Pgmin(i+k,N),j(i,jN) gi,j={0(j=N)1(i=N)1Qk=1Qfi,min(j+k,N)(i,jN)f_{i,j}=\begin{cases} +0 & (j=N)\\ +1 & (i=N)\\ +\frac1P\sum\limits_{k=1}^Pg_{\min(i+k,N),j} & (i,j\ne N) +\end{cases}\\ +~\\ +g_{i,j}=\begin{cases} +0 & (j=N)\\ +1 & (i=N)\\ +\frac1Q\sum\limits_{k=1}^Qf_{i,\min(j+k,N)} & (i,j\ne N) +\end{cases}\\ +

+

这里注意,由于 i=j=Ni=j=N 的情况无意义(不可能达到),所以无需特殊考虑。

+

最终输出结果即为 fp,qf_{p,q}。总时间复杂度为 O(N2(P+Q))\mathcal O(N^2(P+Q))。使用前缀和可以优化到 O(N2)\mathcal O(N^2),有兴趣的可以自己尝试,这里不详细解释了。

+

代码

+
#include <cstdio>
+#include <algorithm>
+#define MOD 998244353
+#define maxn 105
+using namespace std;
+
+using LL = long long;
+inline LL inv(LL x) // x ^ (MOD - 2) % MOD
+{
+	int y = MOD - 2;
+	LL res = 1LL;
+	while(y)
+	{
+		if(y & 1) (res *= x) %= MOD;
+		(x *= x) %= MOD, y >>= 1;
+	}
+	return res;
+}
+
+inline void add(int& x, int y)
+{
+	if((x += y) >= MOD)
+		x -= MOD;
+}
+
+int f[maxn][maxn], g[maxn][maxn];
+
+int main()
+{
+	int n, a, b, p, q;
+	scanf("%d%d%d%d%d", &n, &a, &b, &p, &q);
+	for(int i=0; i<n; i++)
+		f[n][i] = g[n][i] = 1, f[i][n] = g[i][n] = 0;
+	LL prob_p = inv(p), prob_q = inv(q);
+	for(int i=n-1; i>=a; i--)
+		for(int j=n-1; j>=b; j--)
+		{
+			for(int k=1; k<=p; k++)
+				add(f[i][j], g[min(i + k, n)][j]);
+			f[i][j] = f[i][j] * prob_p % MOD;
+			for(int k=1; k<=q; k++)
+				add(g[i][j], f[i][min(j + k, n)]);
+			g[i][j] = g[i][j] * prob_q % MOD;
+		}
+	printf("%d\n", f[a][b]);
+	return 0;
+}
+
+
+

F - Rook Score

+

题目大意

+

有一个 109×10910^9\times 10^9 的网格。令 (i,j)(i,j) 表示第 iijj 列的格子(1i,j1091\le i,j\le 10^9)。

+

对于 i=1,2,,Ni=1,2,\dots,N,整数 xix_i 被写在 (ri,ci)(r_i,c_i) 上。在剩余的 1018N10^{18}-N 个格子里只有数字 00

+

你可以选择一个格子 (R,C)(R,C) 并计算与其同行或同列的 2×10912\times 10^9-1 个整数之和 SS

+

求最大可能的 SS

+

1N2×1051\le N\le 2\times 10^5
+1ri,ci,xi1091\le r_i,c_i,x_i\le 10^9
+(ri,ci)(rj,cj)      (ij)(r_i,c_i)\ne (r_j,c_j)~~~~~~(i\ne j)

+

分析

+

我们令 f(R,C)f(R,C) 表示对于 (R,C)(R,C)SS,令 rsR\mathrm{rs}_R 表示第 RR 行的整数之和,csC\mathrm{cs}_C表示第 CC 列的整数之和,AR,CA_{R,C} 表示 (R,C)(R,C) 上的整数。

+

容易发现,f(R,C)=rsR+csCAR,Cf(R,C)=\mathrm{rs}_R+\mathrm{cs}_C-A_{R,C}

+

然后证明当 f(R,C)f(R,C) 最大时,rsR,csC0\mathrm{rs}_R,\mathrm{cs}_C\ne0

+
    +
  • rsR=csC=0\mathrm{rs}_R=\mathrm{cs}_C=0,则 f(r0,c0)=x0>0=f(R,C)f(r_0,c_0)=x_0>0=f(R,C),所以 (R,C)(R,C) 不是最优解;
  • +
  • rsR0,csC=0\mathrm{rs}_R\ne0,\mathrm{cs}_C=0,则 f(R,c0)=rsR+csc0AR,c0f(R,C)=rsRf(R,c_0)=\mathrm{rs}_R+\mathrm{cs}_{c_0}-A_{R,c_0}\ge f(R,C)=\mathrm{rs}_R,所以 (R,C)(R,C) 不是最优解(或有多个最优解,但其中至少有一个解 (x,y)(x,y) 使得 rsx,csy0\mathrm{rs}_x,\mathrm{cs}_y\ne0
  • +
  • rsR=0,csC0\mathrm{rs}_R=0,\mathrm{cs}_C\ne0 同理。
  • +
+

所以,我们可以依次考虑每一行 RRrsR0\mathrm{rs}_R\ne 0),相当于固定了 rsR\mathrm{rs}_R。这时,我们只需找到一列 CCcsC0\mathrm{cs}_C\ne 0),使得 csCAR,C\mathrm{cs}_C-A_{R,C} 最大,就可以解决此问题。

+

但如果依次考虑所有包含点的列,则最坏情况下时间复杂度为 O(N2)\mathcal O(N^2),无法通过此题。这时,我们可以使用一个 multisetmap 来维护当前每列对答案的贡献(csCAR,C\mathrm{cs}_C-A_{R,C})。对于每一行 RR,仅需更新这一行上有非 00 数字的点 (R,C)(R,C) 的贡献(减去 AR,CA_{R,C})即可。

+

这样,由于每个点会被更新正好一次,所以总时间复杂度为 O(NlogN)\mathcal O(N\log N)

+

代码

+

注意更新完成,求得当前答案后需要复原 mapmultiset

+
#include <cstdio>
+#include <vector>
+#include <set>
+#include <unordered_map>
+using namespace std;
+
+using LL = long long;
+using pii = pair<int, int>;
+
+unordered_map<int, vector<pii>> rows;
+unordered_map<int, LL> col_sum;
+
+template <typename T>
+class MaxSet {
+private:
+	multiset<T> s;
+public:
+	inline void insert(const T& x) { s.insert(x); }
+	inline void update(const T& old, const T& New) {
+		s.erase(s.find(old));
+		s.insert(New);
+	}
+	inline T max() { return *s.rbegin(); }
+};
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	while(n--)
+	{
+		int x, y, v;
+		scanf("%d%d%d", &x, &y, &v);
+		rows[x].emplace_back(y, v);
+		col_sum[y] += v;
+	}
+	MaxSet<LL> s;
+	for(auto [_, sum]: col_sum)
+		s.insert(sum);
+	LL ans = 0LL;
+	for(auto& [x, v]: rows)
+	{
+		for(auto [y, val]: v)
+			s.update(col_sum[y], col_sum[y] - val);
+		LL cur = s.max();
+		for(auto [y, val]: v)
+			s.update(col_sum[y] - val, col_sum[y]), cur += val;
+		if(cur > ans) ans = cur;
+	}
+	printf("%lld\n", ans);
+	return 0;
+}
+
+
+

G - Strawberry War

+

题目大意

+

注意本题时间限制为 6s6\mathrm s

+

我们有一块长方形的蛋糕。它可被看作一个 H×WH\times W 的网格,第 iijj 列上有 si,js_{i,j} 个草莓。

+

我们对蛋糕进行 TT 次切分,切成 T+1T+1 块。每次切蛋糕可以选择当前的一块,并将其从中间横切或竖切成两块:
+切分方式

+

你想把蛋糕切的尽可能均匀。意思是,令 MM 表示切分完成后每一块上的草莓数量的最大值,mm 表示最小值,求出 MmM-m 的最小值。

+

1H,W61\le H,W\le 6
+1THW11\le T\le HW-1
+0si,j10160\le s_{i,j}\le 10^{16}

+

分析

+

本题解参考官方题解

+

操作完成后得到的蛋糕一定是蛋糕的子矩形,所以最多只有 (H+12)×(W+12)=H(H+1)W(W+1)4441\binom {H+1}2\times\binom {W+1}2=\frac{H(H+1)W(W+1)}4\le 441 种数字在剩下的块中。令这些可能的数分别为 a1,a2,,aXa_1,a_2,\dots,a_X。可知 XH(H+1)W(W+1)4441X\le \frac{H(H+1)W(W+1)}4\le 441

+

根据上面的 aa,我们只需先确定 m{a1,a2,,aX}m\in \{a_1,a_2,\dots,a_X\},再找到与其对应的最小 MM,算出 MmM-m 的最小值即可。

+

定义 fi,j,k,l,mf_{i,j,k,l,m} 表示将 x[i,j),y[k,l)x\in[i,j),y\in[k,l) 的子矩形切成 mm 片时最小可能的每片上草莓数的最大值。

+

详见代码。

+

代码

+
#include <bits/stdc++.h>
+using namespace std;
+const long long INF = 1000000000000000000;
+int main(){
+  int H, W, T;
+  cin >> H >> W >> T;
+  vector<vector<long long>> s(H, vector<long long>(W));
+  for (int i = 0; i < H; i++){
+    for (int j = 0; j < W; j++){
+      cin >> s[i][j];
+    }
+  }
+  vector<vector<vector<vector<long long>>>> sum(H, vector<vector<vector<long long>>>(H + 1, vector<vector<long long>>(W, vector<long long>(W + 1, 0))));
+  vector<long long> x;
+  for (int i = 0; i < H; i++){
+    for (int j = i + 1; j <= H; j++){
+      for (int k = 0; k < W; k++){
+        for (int l = k + 1; l <= W; l++){
+          for (int m = i; m < j; m++){
+            for (int n = k; n < l; n++){
+              sum[i][j][k][l] += s[m][n];
+            }
+          }
+          x.push_back(sum[i][j][k][l]);
+        }
+      }
+    }
+  }
+  int cnt = x.size();
+  long long ans = INF;
+  for (int i = 0; i < cnt; i++){
+    vector<vector<vector<vector<vector<long long>>>>> dp(T + 1, vector<vector<vector<vector<long long>>>>(H, vector<vector<vector<long long>>>(H + 1, vector<vector<long long>>(W, vector<long long>(W + 1, INF)))));
+    for (int j = H - 1; j >= 0; j--){
+      for (int k = j + 1; k <= H; k++){
+        for (int l = W - 1; l >= 0; l--){
+          for (int m = l + 1; m <= W; m++){
+            if (sum[j][k][l][m] >= x[i]){
+              dp[0][j][k][l][m] = sum[j][k][l][m];
+            }
+            for (int n = j + 1; n < k; n++){
+              for (int o = 0; o < (n - j) * (m - l); o++){
+                for (int p = 0; p < (k - n) * (m - l) && o + p < T; p++){
+                  dp[o + p + 1][j][k][l][m] = min(dp[o + p + 1][j][k][l][m], max(dp[o][j][n][l][m], dp[p][n][k][l][m]));
+                }
+              }
+            }
+            for (int n = l + 1; n < m; n++){
+              for (int o = 0; o < (k - j) * (n - l); o++){
+                for (int p = 0; p < (k - j) * (m - n) && o + p < T; p++){
+                  dp[o + p + 1][j][k][l][m] = min(dp[o + p + 1][j][k][l][m], max(dp[o][j][k][l][n], dp[p][j][k][n][m]));
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    ans = min(ans, dp[T][0][H][0][W] - x[i]);
+  }
+  cout << ans << endl;
+}
+
+]]>
+
+ + <![CDATA[【算法笔记】最近公共祖先(LCA)问题求解——倍增算法]]> + https://goodcoder666.github.io/post/algonotes-lca/ + + + 2023-01-06T15:03:23.000Z + 0. 前言 +

最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。

+

这种算法应用很广泛,可以很容易解决树上最短路等问题。

+

为了方便,我们记某点集 S={v1,v2,,vn}S=\{v_1,v_2,\ldots,v_n\} 的最近公共祖先为 LCA(v1,v2,,vn)\text{LCA}(v_1,v_2,\ldots,v_n)LCA(S)\text{LCA}(S)

+
+

部分内容参考 OI Wiki,文章中所有算法均使用C++实现。

+
+

例题:洛谷 P3379 【模板】最近公共祖先(LCA)

+

1. 性质

+
    +
  1. LCA({u})=u\text{LCA}(\{u\})=u
  2. +
  3. uuvv 的祖先,当且仅当 LCA(u,v)=u\text{LCA}(u,v)=u
  4. +
  5. 如果 uu 不为 vv 的祖先并且 vv 不为 uu 的祖先,那么 u,vu,v 分别处于 LCA(u,v)\text{LCA}(u,v) 的两棵不同子树中;
  6. +
  7. 前序遍历中,LCA(S)\text{LCA}(S) 出现在所有 SS 中元素之前,后序遍历中 LCA(S)\text{LCA}(S) 则出现在所有 SS 中元素之后;
  8. +
  9. 两点集并的最近公共祖先为两点集分别的最近公共祖先的最近公共祖先,即 LCA(AB)=LCA(LCA(A),LCA(B))\text{LCA}(A\cup B)=\text{LCA}(\text{LCA}(A), \text{LCA}(B))
  10. +
  11. 两点的最近公共祖先必定处在树上两点间的最短路上;
  12. +
  13. d(u,v)=h(u)+h(v)2h(LCA(u,v))d(u,v)=h(u)+h(v)-2h(\text{LCA}(u,v)),其中 dd 是树上两点间的距离,hh 代表某点到树根的距离。
  14. +
+

2. 求解算法

+

2.0 前置知识1:树的邻接表存储

+

简单来说,树的邻接表存储就是对于每个结点,存储其能通过一条有向或无向边,直接到达的所有结点。
+传统的存储方式是使用链表(或模拟链表),这样实现比较麻烦,也容易写错。
+此处为了更好的可读性我们使用STL中的可变长度顺序表vector

+
#include <vector> // 需要使用STL中的vector
+#define maxn 100005 // 最大结点个数
+
+std::vector<int> G[maxn];
+
+

此时,若要添加一条无向边uvu\leftrightarrow v,可使用:

+
G[u].push_back(v);
+G[v].push_back(u);
+
+

若要添加uvu\to v的有向边:

+
G[u].push_back(v);
+
+

遍历vv能直接到达的所有结点:

+
for(int u: G[v])
+	cout << u << endl;
+
+

2.1 前置知识2:DFS 遍历 & 结点的深度计算

+

对于两种算法,都需要预处理出每个结点的深度。
+一个结点的深度定义为这个结点到树根的距离。

+

要预处理出所有结点的深度,很简单:
+运用树形dp的方法,令 huh_u 表示结点 uu 的深度,逐层向下推进:

+
#include <cstdio>
+#include <vector>
+#define maxn 100005
+using namespace std;
+
+vector<int> G[maxn]; // 邻接表存储
+int depth[maxn]; // 每个结点的深度
+
+void dfs(int v, int par) // dfs(当前结点,父亲结点)
+{
+	int d = depth[v] + 1; // 子结点的深度=当前结点的深度+1
+	for(int u: G[v])
+		if(u != par) // 不加这条判断会无限递归
+		{
+			depth[u] = d; // dp更新子结点深度
+			dfs(u, v); // 往下dfs
+		}
+}
+
+int main()
+{
+	// 构建一张图
+	// ...
+	// 假定图已存入邻接表G:
+	int root = 0; // 默认树根为0号结点,根据实际情况设置
+	dfs(root, -1); // 对于根结点,父亲结点为-1即为无父亲结点
+	return 0;
+}
+
+

2.2 朴素算法

+

u,vu,v 表示两个待求 LCA 的结点。需提前预处理出每个结点的父亲(记结点 vv 的父亲为 fvf_v)。

+

算法步骤:

+
    +
  1. 使 u,vu,v 的深度相同:可以让深度大的结点往上走,直到与深度小的结点深度相同。
  2. +
  3. uvu\ne v时:ufu,vfvu\gets f_u,v\gets f_v
  4. +
  5. 循环直到 u=vu=v,此条件成立后 uuvv 的值即为我们要求的 LCA。
  6. +
+

时间复杂度分析:

+
    +
  • 预处理:DFS 遍历整棵树,O(N)\mathcal O(N)
  • +
  • 单次查询:最坏 O(N)\mathcal O(N),平均 O(logN)\mathcal O(\log N)(随机树的高为 logN\lceil\log N\rceil
  • +
+

参考代码:

+
#include <cstdio>
+#include <vector>
+#include <algorithm>
+#define maxn 500005
+using namespace std;
+
+vector<int> G[maxn];
+int depth[maxn], par[maxn];
+
+void dfs(int v)
+{
+	int d = depth[v] + 1;
+	for(int u: G[v])
+		if(u != par[v])
+		{
+			par[u] = v, depth[u] = d;
+			dfs(u);
+		}
+}
+
+int lca(int u, int v)
+{
+	if(depth[u] < depth[v])
+		swap(u, v);
+	while(depth[u] > depth[v])
+		u = par[u];
+	while(u != v)
+		u = par[u], v = par[v];
+	return u;
+}
+
+int main()
+{
+	int n, q, root;
+	scanf("%d%d%d", &n, &q, &root);
+	for(int i=1; i<n; i++)
+	{
+		int u, v;
+		scanf("%d%d", &u, &v);
+		G[u].push_back(v);
+		G[v].push_back(u);
+	}
+	par[root] = -1, depth[root] = 0;
+	dfs(root);
+	while(q--)
+	{
+		int u, v;
+		scanf("%d%d", &u, &v);
+		printf("%d\n", lca(u, v));
+	}
+	return 0;
+}
+
+

可以发现,程序在最后四个测试点上TLE了:

+TLE +

这是因为,这四个点是专门针对朴素算法设计的(正好是一个 Subtask),使算法的时间复杂度达到了最坏情况 O(NQ)\mathcal O(NQ),而 N,Q5×105N,Q\le 5\times 10^5,所以无法通过测试点。当然,朴素算法在随机树上回答 QQ 次询问的时间复杂度还是 O(N+QlogN)\mathcal O(N+Q\log N),被极端数据卡掉也没办法

+

2.3 倍增

+

倍增算法是朴素算法的改进算法,也是最经典的 LCA 求法。

+

预处理:

+
    +
  • fax,i\text{fa}_{x,i} 表示点 xx 的第 2i2^i 个祖先。
  • +
  • dfs 预处理深度信息时,也可以预处理出 fax,i\text{fa}_{x,i}: +
      +
    • 首先考虑ii的范围:2idx2^i\le d_x(前面说的,dxd_x 表示结点 xx 的深度),所以有0ilog2dx0\le i\le \lfloor\log_2 d_x\rfloor
    • +
    • 对于 i=0i=02i=20=12^i=2^0=1,所以直接令 fax,0=(x的父亲)\text{fa}_{x,0}=(x\text{的父亲}) 即可。
    • +
    • 对于 1ilog2dx1\le i\le \lfloor\log_2 d_x\rfloorxx 的第 2i2^i 个祖先可看作 xx 的第 2i12^{i-1} 个祖先的第 2i12^{i-1} 个祖先(2i1+2i1=2i2^{i-1}+2^{i-1}=2^i),即:
    • +
    +

    +

    +

    +
  • +
+
    +
  1. 使 u,vu,v 的深度相同:计算出 u,vu,v 两点的深度之差,设其为 yy。通过将 yy 进行二进制拆分,我们将 yy 次游标跳转优化为「yy 的二进制表示所含 1 的个数」次游标跳转(详见代码)。
  2. +
  3. 特判:如果此时u=vu=v,直接返回 uuvv 作为 LCA 结果。
  4. +
  5. 同时上移uuvv:从 i=log2dui=\lfloor\log_2 d_u\rfloor 开始循环尝试,一直尝试到 00(包括 00),如果 fau,i=fav,i\text{fa}_{u,i}\not=\text{fa}_{v,i},则 ufau,i,vfav,iu\gets\text{fa}_{u,i},v\gets\text{fa}_{v,i},那么最后的 LCA 为 fau,0\text{fa}_{u,0}
  6. +
+

时间复杂度分析:

+
    +
  • 预处理:O(N)\mathcal O(N) DFS × O(logN)\times~\mathcal O(\log N) 预处理 =O(NlogN)=\mathcal O(N\log N)
  • +
  • 单次查询:平均 O(logN)O(\log N),最坏 O(logN)O(\log N)
  • +
  • 预处理 + QQ 次查询:O(N+QlogN)\mathcal O(N+Q\log N)
  • +
+

另外倍增算法可以通过交换 fa 数组的两维使较小维放在前面。这样可以减少 cache miss 次数,提高程序效率。

+

参考代码:

+
#include <cstdio>
+#include <vector>
+#include <cmath>
+#define maxn 500005
+using namespace std;
+
+vector<int> G[maxn];
+int fa[maxn][19]; // 2^19=524288
+int depth[maxn];
+
+void dfs(int v, int par)
+{
+	fa[v][0] = par;
+	int d = depth[v] + 1;
+	for(int i=1; (1<<i)<d; i++)
+		fa[v][i] = fa[fa[v][i - 1]][i - 1];
+	for(int u: G[v])
+		if(u != par)
+			depth[u] = d, dfs(u, v);
+}
+
+inline int lca(int u, int v)
+{
+	if(depth[u] < depth[v])
+		u ^= v ^= u ^= v;
+	int m = depth[u] - depth[v];
+	for(int i=0; m; i++, m>>=1)
+		if(m & 1)
+			u = fa[u][i];
+	if(u == v) return u; // 这句不能丢
+	for(int i=log2(depth[u]); i>=0; i--)
+		if(fa[u][i] != fa[v][i])
+			u = fa[u][i], v = fa[v][i];
+	return fa[u][0];
+}
+
+int main()
+{
+	int n, q, root;
+	scanf("%d%d%d", &n, &q, &root);
+	for(int i=1; i<n; i++)
+	{
+		int x, y;
+		scanf("%d%d", &x, &y);
+		G[--x].push_back(--y);
+		G[y].push_back(x);
+	}
+	depth[--root] = 0;
+	dfs(root, -1);
+	while(q--)
+	{
+		int u, v;
+		scanf("%d%d", &u, &v);
+		printf("%d\n", lca(--u, --v) + 1);
+	}
+	return 0;
+}
+
+AC +

3. 习题

+ +

4. 总结

+

本文详细讲解了 LCA 问题以及求解 LCA 的两种算法。对比如下:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
算法预处理时间复杂度单次查询时间复杂度[1]空间复杂度能否通过例题[2]
朴素算法O(N)\mathcal O(N)O(N)\mathcal O(N)O(N)\mathcal O(N)
倍增算法O(NlogN)\mathcal O(N\log N)O(logN)\mathcal O(\log N)O(NlogN)\mathcal O(N\log N)✔️
+

创作不易,希望大家能给个三连,感谢支持!

+
+
+
    +
  1. 此时间复杂度按照最坏情况计算↩︎

    +
  2. +
  3. 例题:洛谷 P3379 【模板】最近公共祖先(LCA) ↩︎

    +
  4. +
+
+]]>
+
+ + <![CDATA[【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树]]> + https://goodcoder666.github.io/post/algonotes-rmq/ + + + 2023-01-05T14:48:22.000Z + 0. 前言 +

好久没更算法笔记专栏了,正好学了新算法来更新……
+这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢!

+

1. 关于 RMQ 问题

+

RMQ 的全称是 Range Minimum/Maximum Query,即区间最大/最小值问题。

+

本文中,我们的算法以求最大值为例(最小值基本一致)。题面如下:

+
+

给定一个长为NN的序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)
+有QQ个询问,第ii个询问如下:
+ \to~给定1liriN1\le l_i\le r_i\le N,求区间[li,ri][l_i,r_i]的最大值,即maxj=liriAj\displaystyle\max_{j=l_i}^{r_i} A_j

+
+

下面,我们将从暴力算法开始,逐步讲解 RMQ 问题的常用解法。

+

通用的 RMQ 问题(除暴力外所有算法都能通过):

+ +

2. 解法

+

2.1 暴力法

+

我们先读取序列AA,再逐个读取询问,对于每个询问直接遍历AlArA_l\dots A_r,最终输出结果。
+总时间复杂度为O(rili)=O(NQ)\mathcal O(\sum r_i-l_i)=\mathcal O(NQ)

+
#include <cstdio>
+#define maxn 100005
+using namespace std;
+
+int a[maxn];
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=0; i<n; i++)
+		scanf("%d", a + i);
+	while(q--)
+	{
+		int l, r;
+		scanf("%d%d", &l, &r);
+		l --, r --;
+		int res = a[l];
+		for(int i=l+1; i<=r; i++)
+			if(a[i] < res)
+				res = a[i];
+		printf("%d ", res);
+	}
+	return 0;
+}
+
+

然而,当你提交到洛谷 P1816时……

+TLE一个点 +

肯定还是时间复杂度的锅,算法需要进一步优化

+

2.2 Sparse Table

+

Sparse Table(以下称ST表)是用于静态求解 RMQ 问题的数据结构。

+
+

静态求解是指在原始序列不改变的情况下求解问题。或者说,ST表不能直接进行修改操作

+
+

ST表的初始化时间复杂度为O(NlogN)\mathcal O(N\log N),单次查询时间复杂度为O(1)\mathcal O(1)

+

2.2.1 存储结构

+

ST表的本质是一个N×logNN\times\lceil\log N\rceil的二维数组,其定义如下(令AA表示原数组,求最小值同理):

+

st[i][j]=max{Ai,Ai+1,,Ai+2j1}st[i][j]=\max\{A_i,A_{i+1},\dots,A_{i+2^j-1}\} +

+

也就是说,st[i][j]st[i][j]表示从AiA_i开始,2j2^j个元素中的最大值。这运用了倍增的思想。

+

下面考虑如何快速初始化整个数组。

+

2.2.2 初始化

+

根据倍增的常用算法,使用类似于DP的方式填满整个表:

+

st[i][j]=max{st[i][j1],st[i+2j1][j1]}st[i][j]=\max\{st[i][j-1],st[i+2^{j-1}][j-1]\} +

+

填表时,先枚举jj,再枚举ii。由于整个表共有大约NlogNN\log N个状态,而计算一个状态值的时间复杂度为O(1)\mathcal O(1),所以初始化的总时间复杂度为O(NlogN)\mathcal O(N\log N)

+

伪代码如下:

+
function init() {
+	for i = 1 to N
+		st[i][0] = A[i]
+	for j = 1 to log2(N)
+		for i = 1 to (N + 1 - 2^j)
+			st[i][j] = max(st[i][j - 1], st[i + 2^(j-1)][j - 1])
+}
+
+

C++ 实现:

+
void init()
+{
+	for(int i=0; i<n; i++)
+		st[i][0] = A[i];
+	for(int j=1; j<=log2(n); j++)
+		for(int i=0; i+(1<<j)<=n; i++) // 注意必须是<=n,1<<j即为2^j
+			st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
+}
+
+

2.2.3 查询

+

对于[l,r)[l,r)区间的 RMQ 查询,根据ST表的原理,我们要找到两个区间[l,a)[l,a)[b,r)[b,r),使得它们的并集正好为[l,r)[l,r)。即:lbarl\le b\le a\le r

+
+

为什么是并集?
+ \to~因为max(a,a)=a\max(a,a)=a,所以重复的不影响结果。
+ \to~如果出现遗漏,且遗漏的正好为最大/最小值,那会影响最终结果,所以不能遗漏。
+ \to~如果检查到了多余的元素,且多余的正好大于原区间的最大值,会使查询结果变大,所以不能有多余。
+综上,必须满足[l,a)[l,a)[b,r)[b,r)并集正好为[l,r)[l,r)才能查询。

+
+

要满足上述条件,我们可以aa尽可能靠近rr,让bb尽可能靠近ll,来达到这样的效果。
+此时,我们还需要满足并集的条件la,brl\le a,b\le r,因此我们需要找到最大的kk,使得a=l+2ka=l+2^kb=r2kb=r-2^k

+

则有

+

{l+2krr2kl    2krl  klog2(rl)\left\{ \begin{array}{c} +l+2^k\le r \\ +r-2^k\ge l +\end{array} \right.~~\to~~ 2^k\le r-l\\ +~\\ +\to~k\le \log_2(r-l) +

+

又因为kk必须是整数,所以取k=log2(rl)k=\lfloor\log_2(r-l)\rfloor即可。

+
// query(l, r) = max(A[l], ..., A[r - 1])
+inline int query(int l, int r)
+{
+	int k = log2(r - l);
+	return max(st[l][k], st[r - (1 << k)][k]);
+}
+
+

2.2.4 完整实现

+

下面给出用Sparse Table解决例题的完整代码。总时间复杂度为O(Q+NlogN)\mathcal O(Q+N\log N)

+
#include <cstdio>
+#include <cmath>
+#include <algorithm>
+#define maxn 100005
+using namespace std;
+
+int st[maxn][17]; // 2^17=131072
+
+void init(int n)
+{
+	for(int j=1, t=log2(n); j<=t; j++)
+		for(int i=0; i+(1<<j)<=n; i++)
+			st[i][j] = min(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
+}
+
+inline int query(int l, int r)
+{
+	int k = log2(r - l);
+	return min(st[l][k], st[r - (1 << k)][k]); // 注意此题为min,不是求max
+}
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=0; i<n; i++)
+		scanf("%d", st[i]); // 直接读入到ST表中,节约时间和空间
+	init(n);
+	while(q--)
+	{
+		int l, r;
+		scanf("%d%d", &l, &r);
+		// 此处注意因为是左闭右开区间[l,r),所以只有l需要-1
+		printf("%d ", query(--l, r));
+	}
+	return 0;
+}
+
+AC +

运行时间:128ms128\mathrm{ms}
+使用内存:6.90MB6.90\mathrm{MB}

+

2.3 树状数组

+

关于树状数组的原理我已经在这篇文章中讲过,这里不再多说了。下面我们考虑如何应用树状数组解决 RMQ 问题。

+

2.3.1 原算法

+

树状数组可以用lowbit操作实现prefixSum(前缀和)以及update(更新)操作,时间复杂度均为O(NlogN)\mathcal O(N\log N)。不仅是加法,对于任意满足结合律的运算这两种操作都有效。

+

我们来简单实现一下支持prefixMaxupdate操作的树状数组:

+
#define INF 2147483647
+#define lowbit(x) ((x) & -(x))
+inline void setmax(int& x, int y) { if(y > x) x = y; }
+
+int n, A[N], bit[N];
+
+// max(A[1], ..., A[i])
+inline int prefixMax(int i)
+{
+	int res = -INF;
+	for(; i>0; i-=lowbit(i))
+		setmax(res, bit[i]);
+	return res;
+}
+
+// A[i] = max(A[i], val)
+inline void update(int i, int val)
+{
+	for(; i<=n; i+=lowbit(i))
+		setmax(bit[i], val);
+}
+
+

若要初始化树状数组,可以利用update操作进行O(NlogN)\mathcal O(N\log N)的初始化:

+
inline void init()
+{
+	for(int i=1; i<=n; i++)
+		bit[i] = -INF; // 这一段不要忘!
+	for(int i=1; i<=n; i++)
+		update(i, A[i]);
+}
+
+

另外,我们也可以用子节点直接更新父节点,达到O(N)\mathcal O(N)建树的效果:

+
inline void init()
+{
+	for(int i=1; i<=n; i++)
+		bit[i] = A[i];
+	for(int i=1; i<=n; i++)
+	{
+		int j = i + lowbit(i);
+		if(j <= n) setmax(bit[j], bit[i]);
+	}
+}
+
+

考虑加法时我们计算rangeSum(区间和)的算法:

+
inline int rangeSum(int l, int r)
+{
+	return prefixSum(r) - prefixSum(l - 1);
+}
+
+

也就是用(A1+A2++Ar)(A1+A2++Al1)=Al++Ar(A_1+A_2+\dots+A_r)-(A_1+A_2+\dots+A_{l-1})=A_l+\dots+A_r

+

现在回过来考虑 RMQ 的查询,Min/Max运算不可逆,所以很明显不能用这种计算方式。
+下面我们来介绍针对 RMQ 的树状数组设计。

+

2.3.2 RMQ 树状数组

+

我们令f(l,r)f(l,r)表示rangeMax(l, r),即[l,r][l,r]的区间最大值。
+令t=rlowbit(r)t=r-\mathrm{lowbit}(r)AA表示原序列,BB表示树状数组,考虑如下递推式:

+

f(l,r)={max{Br,f(l,t)}(tl)max{Ar,f(l,r1)}(t<l)(l<r)f(l,r)=\begin{cases} +\max\{B_r,f(l,t)\} & (t\ge l)\\ +\max\{A_r,f(l,r-1)\} & (t<l)\\ +-\infty & (l < r) +\end{cases} +

+
+

等式11 证明
+根据树状数组的定义,Bi=max{Ailowbit(i)+1,,Ai}=f(ilowbit(i)+1,i)B_i=\max\{A_{i-\mathrm{lowbit}(i)+1},\dots,A_i\}=f(i-\mathrm{lowbit}(i)+1,i)
+又有f(l,r)=max{f(l,t),f(t+1,r)}f(l,r)=\max\{f(l,t),f(t+1,r)\},由于f(t+1,r)=f(rlowbit(r)+1,r)=Brf(t+1,r)=f(r-\mathrm{lowbit}(r)+1,r)=B_r,所以当tlt\ge l时,f(l,r)=max{Br,f(l,t)}f(l,r)=\max\{B_r,f(l,t)\}

+
+
+

等式22 证明
+根据max\max操作的结合律可得:f(l,r)=max{f(l,r1),f(r,r)}=max{f(l,r1),Ar}f(l,r)=\max\{f(l,r-1),f(r,r)\}=\max\{f(l,r-1),A_r\}
+这个等式对于任意rr都成立,但出于时间考虑,我们尽可能使用等式11(如果全用等式22就退化成了O(N)\mathcal O(N)的暴力)。

+
+

代码实现:

+
int rangeMax(int l, int r)
+{
+	if(l == r) return A[l];
+	int t = r - lowbit(r);
+	return t < l?
+		max(A[r], rangeMax(l, r - 1)):
+		max(bit[r], rangeMax(l, t));
+}
+
+

这种查询方式的时间复杂度不好估算,可粗略地记为O(logN)\mathcal O(\log N)。实际情况下,运行时间可能稍大于这个值。
+另外,此算法对任意满足结合律的运算(如gcdlcm)都有效。

+

2.3.3 完整实现

+

下面给出用树状数组解决例题的完整代码。总时间复杂度为O(N+QlogN)\mathcal O(N+Q\log N)[1]

+
#include <cstdio>
+#include <algorithm>
+#define maxn 100005
+using namespace std;
+
+#define lowbit(x) ((x) & -(x))
+
+int a[maxn], bit[maxn];
+
+int rangeMin(int l, int r)
+{
+	if(l == r) return a[l];
+	int t = r - lowbit(r);
+	return t < l?
+		min(a[r], rangeMin(l, r - 1)):
+		min(bit[r], rangeMin(l, t));
+}
+
+inline void init(int n)
+{
+	for(int i=1; i<=n; i++)
+		bit[i] = a[i];
+	for(int i=1; i<=n; i++)
+	{
+		int j = i + lowbit(i);
+		if(j <= n)
+			bit[j] = min(bit[j], bit[i]);
+	}
+}
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=1; i<=n; i++)
+		scanf("%d", a + i);
+	init(n);
+	while(q--)
+	{
+		int l, r;
+		scanf("%d%d", &l, &r);
+		printf("%d ", rangeMin(l, r));
+	}
+	return 0;
+}
+
+AC +

运行时间:207ms207\mathrm{ms}
+使用内存:1.10MB1.10\mathrm{MB}

+

另外,我们还可以把rangeMin写成非递归的形式,以进一步节省运行时间:

+
#include <cstdio>
+#define maxn 100005
+using namespace std;
+
+#define INF 2147483647
+#define lowbit(x) ((x) & -(x))
+inline void setmin(int& x, int y) { if(y < x) x = y; }
+
+int a[maxn], bit[maxn];
+
+int rangeMin(int l, int r)
+{
+	int res = INF;
+	while(l <= r)
+	{
+		int t = r - lowbit(r);
+		if(t < l) setmin(res, a[r--]);
+		else setmin(res, bit[r]), r = t;
+	}
+	return res;
+}
+
+inline void init(int n)
+{
+	for(int i=1; i<=n; i++)
+		bit[i] = a[i];
+	for(int i=1; i<=n; i++)
+	{
+		int j = i + lowbit(i);
+		if(j <= n) setmin(bit[j], bit[i]);
+	}
+}
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=1; i<=n; i++)
+		scanf("%d", a + i);
+	init(n);
+	while(q--)
+	{
+		int l, r;
+		scanf("%d%d", &l, &r);
+		printf("%d ", rangeMin(l, r));
+	}
+	return 0;
+}
+
+AC +

运行时间:135ms135\mathrm{ms}
+使用内存:1.14MB1.14\mathrm{MB}

+

2.4 线段树

+

线段树和树状数组一样,都是解决区间问题的树状结构。不过线段树的应用范围更加广泛,时间复杂度与树状数组基本一致,但每种操作都有一个343\thicksim4之间的常数。线段树建树(初始化)的时间复杂度为O(N)\mathcal O(N),单次区间查询的时间复杂度为O(logN)\mathcal O(\log N)

+

RMQ 问题不涉及修改操作,因此我们暂时不考虑这种操作。

+线段树 +

如图即为N=10N=10的一棵线段树。可以发现,线段树本质上是一棵二叉树,每个结点代表一个区间,其存储的值为这个区间的区间和(在 RMQ 问题中为区间最大/最小值)。一个结点的左儿子结点和右儿子结点对应区间的并集正好为这个结点对应的区间(叶子结点除外),且左右两区间的长度的差值不超过11

+

从树的角度考虑,n1=0n_1=0,即没有子结点数量为11的结点。

+

一般的,若一个结点对应的区间为[l,r][l,r]

+
    +
  • l=rl=r:此结点为叶子结点。
  • +
  • l<rl<r,令m=l+r2m=\lfloor\frac{l+r}2\rfloor: +
      +
    • 左子结点对应的区间为[l,m][l,m]
    • +
    • 右子结点对应的区间为[m+1,r][m+1,r]
    • +
    +
  • +
+
+

顺便纠正一下线段树的几个误区:
+线段树是一棵完全二叉树。
+请仔细看看图。
+线段树是一棵二叉搜索树。
+反正我是没找到哪里这样定义的。百度百科 OI Wiki
+线段树上同一深度的结点所对应的区间长度一定相等。
+看看图,[1,3][1,3][4,5][4,5]两个区间,长度明显不相等。
+特例:当NN22的整数次幂时,这句话一定成立。

+
+

2.4.1 存储结构

+

线段树采用堆式储存法,根结点为11,结点uu的父亲为u2\lfloor\frac u2\rfloor,左子结点为2u2u,右子结点为2u+12u+1

+

可以用位运算优化:

+
    +
  • uu的父亲:u2= \lfloor\frac u2\rfloor=~u >> 1
  • +
  • uu的左儿子:2u= 2u=~u << 1
  • +
  • uu的右儿子:2u+1= 2u+1=~u << 1 | 1(或u << 1 ^ 1
  • +
+
// 数组定义
+int a[N], c[4 * N];
+
+// 宏定义
+#define INF 2147483647
+#define ls(x) (x << 1) // 左儿子结点
+#define rs(x) (x << 1 | 1) // 右儿子结点
+#define par(x) (x >> 1) // 父亲结点
+
+

下文中,我们令NN表示元素个数,AA表示原数组,CC表示线段树(数组形式存储)。
+可以证明,线段树的结点个数不会超过4N54N-5,所以我们可以把CC的长度设为4N4N

+

2.4.2 建树(初始化)

+

对于一个结点数据的计算,我们可以先递归地初始化其左子树,再到右子树,最后两儿子的数据取max\max即可。

+

代码实现:

+
// 结点p, 区间[l, r]建树
+void build(int l, int r, int p)
+{
+	if(l == r)
+	{
+		c[p] = a[l];
+		return;
+	}
+	int m = l + r >> 1;
+	build(l, m, ls(p));
+	build(m + 1, r, rs(p));
+	c[p] = max(c[ls(p)], c[rs(p)]);
+}
+
+

2.4.3 区间查询

+

同样采用递归的方式,设pp为当前结点,[l,r][l,r]为当前结点区间,[a,b][a,b]为当前查询区间,函数返回[l,r][l,r][a,b][a,b]交集区间和

+
    +
  • 如果[l,r][l,r][a,b][a,b]的子集(alrba\le l\le r\le b),直接返回当前结点对应的区间和。
  • +
  • 否则,递归查询左右子树,如果没有交集则不查询。返回查询的子树的最大值。
  • +
+

如果上面不是很好理解,可以直接看代码实现:

+
// 结点p, 查询区间[a, b], 当前区间[l, r]
+int query(int l, int r, int a, int b, int p)
+{
+	if(a <= l && r <= b) return c[p];
+	int m = l + r >> 1, res = -INF;
+	if(m >= a) res = max(res, query(l, m, a, b, ls(p)));
+	// m + 1 <= b 即为 m < b
+	if(m < b) res = max(res, query(m + 1, r, a, b, rs(p)));
+	return res;
+}
+
+

2.4.4 完整实现

+

下面给出用线段树解决例题的完整代码。总时间复杂度为O(N+QlogN)\mathcal O(N+Q\log N)

+
#include <cstdio>
+#include <algorithm>
+#define maxn 100005
+using namespace std;
+
+#define INF 2147483647
+#define ls(x) (x << 1)
+#define rs(x) (x << 1 | 1)
+#define par(x) (x >> 1)
+
+int a[maxn], c[maxn << 2];
+
+void build(int l, int r, int p)
+{
+	if(l == r)
+	{
+		c[p] = a[l];
+		return;
+	}
+	int m = l + r >> 1;
+	build(l, m, ls(p));
+	build(m + 1, r, rs(p));
+	c[p] = min(c[ls(p)], c[rs(p)]);
+}
+
+int query(int l, int r, int a, int b, int p)
+{
+	if(a <= l && r <= b) return c[p];
+	int m = l + r >> 1, res = INF;
+	if(m >= a) res = min(res, query(l, m, a, b, ls(p)));
+	if(m < b) res = min(res, query(m + 1, r, a, b, rs(p)));
+	return res;
+}
+
+int main()
+{
+	int n, q;
+	scanf("%d%d", &n, &q);
+	for(int i=0; i<n; i++)
+		scanf("%d", a + i);
+	build(0, n - 1, 1);
+	while(q--)
+	{
+		int l, r;
+		scanf("%d%d", &l, &r);
+		printf("%d ", query(0, n - 1, --l, --r, 1));
+	}
+	return 0;
+}
+
+AC +

运行时间:163ms163\mathrm{ms}
+使用内存:1.78MB1.78\mathrm{MB}

+

3. 总结

+

我们来对比一下四种算法,从理论的角度:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
算法预处理时间复杂度单次查询时间复杂度空间复杂度符合题目要求?[2]
暴力O(1)\mathcal O(1)O(N)\mathcal O(N)O(N)\mathcal O(N)
ST表O(NlogN)\mathcal O(N\log N)O(1)\mathcal O(1)O(NlogN)\mathcal O(N\log N)✔️
树状数组O(N)\mathcal O(N)O(NlogN)\mathcal O(N\log N)O(logN)\mathcal O(\log N)O(N)\mathcal O(N)✔️
线段树O(N)\mathcal O(N)O(logN)\mathcal O(\log N)O(N)\mathcal O(N)✔️
+

洛谷 P1816上实际运行情况的角度(暴力TLE,不考虑):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
算法运行时间内存占用代码长度
ST表128ms128\mathrm{ms}6.90MB6.90\mathrm{MB}625B625\mathrm B
树状数组(递归)[3]207ms207\mathrm{ms}1.10MB1.10\mathrm{MB}720B720\mathrm B
树状数组(非递归)[3:1]135ms135\mathrm{ms}1.14MB1.14\mathrm{MB}786B786\mathrm B
线段树163ms163\mathrm{ms}1.78MB1.78\mathrm{MB}905B905\mathrm B
+

可以看出,ST表写起来简单省事,运行时间也是最快,不过内存占用稍高,毕竟空间复杂度是O(NlogN)\mathcal O(N\log N)
+树状数组可以说是均衡了时间与空间,尽量使用非递归查询,比递归速度快53%53\%,当然如果想省事也可以使用递归式查询;
+线段树可以说是完全输给了树状数组(非递归),不过线段树功能比较多,用来做 RMQ 可以说是大材小用。所以线段树在 RMQ 问题中没什么优势,有一些缺点还是可以理解的。

+
+

本文到此结束,希望大家给个三连!
+这也是我在20232023年写的第一篇文章(也是我的第一篇万字长文),祝大家新年快乐!

+
+
+
    +
  1. 直接调用update建树的方法总时间复杂度为O((N+Q)logN)\mathcal O((N+Q)\log N),这里采用的是前面说的O(N)\mathcal O(N)快速建树。在此问题中,由于不需要修改,使用O(N)\mathcal O(N)建树可省去update方法。 ↩︎

    +
  2. +
  3. 洛谷 P1816为准,N105N\le 10^5,所以单次查询时间复杂度不能超过O(N)\mathcal O(\sqrt N)↩︎

    +
  4. +
  5. 此处指递归/非递归的单次查询实现,两者其他操作完全一致。 ↩︎ ↩︎

    +
  6. +
+
+]]>
+
+ + <![CDATA[AtCoder Beginner Contest 274 A~E 题解]]> + https://goodcoder666.github.io/post/abc274/ + + + 2022-10-24T00:30:00.000Z + 吐槽:这比赛名字为啥没有英文版。。。

+

A - Batting Average

+

题目大意

+

给定整数A,BA,B,输出BA\frac BA,保留三位小数。

+

1A101\le A\le 10
+0BA0\le B\le A

+

分析

+

签到题,使用printfcout格式化输出即可。

+

代码

+
#include <cstdio>
+using namespace std;
+
+int main()
+{
+	int a, b;
+	scanf("%d%d", &a, &b);
+	printf("%.3Lf\n", (long double)b / a);
+	return 0;
+}
+
+
+

B - Line Sensor

+

题目大意

+

给定一个H×WH\times W的网格,每个方格内都是.#
+求每一列的#的个数,分别输出。

+

1H,W10001\le H,W\le 1000

+

分析

+

开一个数组ans[W],存储每一列的#的个数。输入时统计一下即可。

+

代码

+
#include <cstdio>
+#define maxn 1005
+using namespace std;
+
+char s[maxn];
+int ans[maxn];
+
+int main()
+{
+	int n, m;
+	scanf("%d%d", &n, &m);
+	while(n--)
+	{
+		scanf("%s", s);
+		for(int i=0; i<m; i++)
+			if(s[i] == '#')
+				ans[i] ++;
+	}
+	for(int i=0; i<m; i++)
+		printf("%d ", ans[i]);
+	return 0;
+}
+
+
+

C - Ameba

+

题目大意

+

有一棵由2N+12N+1个结点组成的树,根结点是11

+

整棵树用一个序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)表示:

+
    +
  • 结点AiA_i2i2i2i+12i+1的父亲。
  • +
+

求每个结点的深度。

+

1N2×1051\le N\le 2\times 10^5
+1Ai2i11\le A_i\le 2i-1

+

解法1

+

根据题意构造树的邻接表,从根结点11开始向下搜索,从而推出每个结点的深度。

+
#include <cstdio>
+#include <vector>
+#define maxn 200005
+using namespace std;
+
+vector<int> G[maxn << 1];
+int dep[maxn << 1];
+
+void dfs(int v, int par)
+{
+	for(int u: G[v])
+		if(u != par)
+		{
+			dep[u] = dep[v] + 1;
+			dfs(u, v);
+		}
+}
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	for(int i=1; i<=n; i++)
+	{
+		int x;
+		scanf("%d", &x);
+		G[x].push_back(i << 1);
+		G[x].push_back(i << 1 | 1);
+	}
+	dep[1] = 0;
+	dfs(1, -1);
+	for(int i=1; i<=(n<<1)+1; i++)
+		printf("%d\n", dep[i]);
+	return 0;
+}
+
+

解法2(最优解)

+

我们从解法11进一步考虑:由于1Ai2i11\le A_i\le 2i-1,所以AiA_i一定在2i2i2i+12i+1前被处理,那么直接在输入时计算depth[2*i] = depth[2*i+1] = depth[A[i]] + 1即可。

+
#include <cstdio>
+#include <vector>
+#define maxn 200005
+using namespace std;
+
+int dep[maxn << 1];
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	for(int i=1; i<=n; i++)
+	{
+		int x;
+		scanf("%d", &x);
+		dep[i << 1] = dep[i << 1 | 1] = dep[x] + 1;
+	}
+	for(int i=1; i<=(n<<1)+1; i++)
+		printf("%d\n", dep[i]);
+	return 0;
+}
+
+
+

D - Robot Arms 2

+

题目大意

+

给定整数NN和序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),能否在平面直角坐标系中通过NN步从(0,0)(0,0)走到(x,y)(x,y)?每一步如下:

+
    +
  • 11步:从(0,0)(0,0)走到(A1,0)(A_1,0)(向右前进A1A_1格)。
  • +
  • ii步(i>1i>1)先左转或右转90°90\degree,再前进AiA_i格。
  • +
+

2N1032\le N\le 10^3
+1Ai101\le A_i\le 10
+104x,y104-10^4\le x,y\le 10^4

+

分析

+

先考虑另一个问题:

+
+

在一维坐标系中,从ss开始进行NN次位移,第ii次的操作如下:
+ \to~选择左移或者右移AiA_i个长度单位,即坐标加上AiA_i或者减去AiA_i
+NN次操作后是否能到达终点tt注意:必须为最终到达,中途经过不算数!

+
+

很容易想到使用一个简单的DP\text{DP},令f(i,j)f(i,j)表示前ii次操作后是否能达到jj0011),转移显而易见:f(i,j)=f(i1,jAi)f(i1,j+Ai)f(i,j)=f(i-1,j-A_i)\vee f(i-1,j+A_i)
+但是这样的时间复杂度很高,高达O(Nk)\mathcal O(Nk),其中kk为坐标系大小。

+

稍加思考会发现,只有小部分坐标能真正达到,其余都没有必要参与转移,所以使用set进行存储,SiS_i表示前ii次操作后能到达的坐标集合,利用Si=(Si1+Ai)(Si1Ai)S_i=(S_{i-1}+A_i)\cup(S_{i-1}-A_i)进行转移即可。

+

代码:

+
inline bool check(vector<int>& v, int start, int target)
+{
+	set<int> s;
+	s.insert(start);
+	for(int d: v)
+	{
+		set<int> ls = s;
+		s.clear();
+		for(int x: ls)
+			s.insert(x + d), s.insert(x - d);
+	}
+	return s.count(target);
+}
+
+

然后回到原来的问题,发现由于xxyy两个坐标互不影响,所以把两个坐标轴分别独立出来是没有问题的,可以转换为刚才的子问题:

+
    +
  • 对于xx坐标,起始位置为A1A_1,终点为xx,移动序列为A3,A5,A_3,A_5,\dots
  • +
  • 对于yy坐标,起始位置为00,终点为yy,移动序列为A2,A4,A_2,A_4,\dots
  • +
+

只要两个子问题的条件都满足,那么一定存在一种可行的操作序列来满足原题的要求。
+至此,问题得到解决。

+

代码

+
#include <cstdio>
+#include <vector>
+#include <set>
+using namespace std;
+
+inline bool check(vector<int>& v, int start, int target)
+{
+	set<int> s;
+	s.insert(start);
+	for(int d: v)
+	{
+		set<int> ls = s;
+		s.clear();
+		for(int x: ls)
+			s.insert(x + d), s.insert(x - d);
+	}
+	return s.count(target);
+}
+
+int main()
+{
+	int n, x, y;
+	scanf("%d%d%d", &n, &x, &y);
+	vector<int> a(n);
+	for(int& t: a) scanf("%d", &t);
+	vector<int> dx;
+	for(int i=2; i<n; i+=2)
+		dx.push_back(a[i]);
+	if(!check(dx, a[0], x)) { puts("No"); return 0; }
+	vector<int> dy;
+	for(int i=1; i<n; i+=2)
+		dy.push_back(a[i]);
+	puts(check(dy, 0, y)? "Yes": "No");
+	return 0;
+}
+
+
+

E - Booster

+

题目大意

+

在平面直角坐标系中,有NN个城市和MM个箱子。城市ii位于坐标(Xi,Yi)(X_i,Y_i),箱子ii则在坐标(Pi,Qi)(P_i,Q_i)

+

Takahashi现在要从原点(0,0)(0,0)开始访问NN个城市,中途箱子可去可不去。他初始的速度为11,每碰到一个箱子都可以将速度提升至原先的两倍(每个箱子只能加速一次)。

+

至少要用多少时间,才能将NN个城市都访问至少一次?

+

分析

+

参考AtCoder 官方题解的做法,这里不详细解释。

+

代码

+
#include <cstdio>
+#include <cmath>
+#define maxn 17
+using namespace std;
+
+inline double ppow(int x) { return 1.0 / (1 << __builtin_popcount(x)); }
+inline void setmin(double& x, double y)
+{
+	if(y < x) x = y;
+}
+
+double x[maxn], y[maxn], dp[maxn][1 << maxn];
+
+int main()
+{
+	// Input
+	int n, m;
+	scanf("%d%d", &n, &m);
+	m += n;
+	for(int i=0; i<m; i++)
+		scanf("%lf%lf", x + i, y + i);
+	int mx = 1 << m;
+	for(int i=0; i<m; i++)
+		for(int s=0; s<mx; s++)
+			dp[i][s] = 1e18;
+
+	// DP: Initial state
+	for(int i=0; i<m; i++)
+		dp[i][1 << i] = hypot(x[i], y[i]);
+
+	// DP: Transfer
+	for(int s=1; s<mx; s++)
+	{
+		double coef = ppow(s >> n);
+		for(int i=0; i<m; i++)
+		{
+			if(!(s >> i & 1)) continue;
+			for(int j=0; j<m; j++)
+			{
+				if(s >> j & 1) continue;
+				setmin(dp[j][s | (1 << j)],
+					dp[i][s] + hypot(x[i] - x[j], y[i] - y[j])*coef);
+			}
+		}
+	}
+
+	// Output
+	double ans = 1e18;
+	for(int i=0, t=1<<n; i<m; i++)
+		for(int s=t-1; s<mx; s+=t)
+			setmin(ans, dp[i][s] + dp[i][1 << i] * ppow(s >> n));
+	printf("%.10f\n", ans);
+	return 0;
+}
+
+]]>
+
+ + <![CDATA[【算法笔记】位运算详解]]> + https://goodcoder666.github.io/post/algonotes-bwop/ + + + 2022-10-18T00:30:00.000Z + 0. 前言 +

突然想到位运算是个好东西,就来水一波文章了……

+

注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持!

+

本文中参考代码均使用C++编写。

+

废话不多说,下面步入正题。

+
+

1. 基本运算

+

有一定基础的可以跳过该部分。

+

位运算的简要法则:
+位运算法则-简要

+

详细解释:

+

1.1 取反

+

取反(~x)是最简单的位运算操作,只有一个参数xx。将参数上的每一位对应取反即可。例如:
+~0011 = 1100
+~1011 = 0100
+性质:~(~x) = x

+

1.2 按位与

+

按位与(x & y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xxyyx & y
000000
001100
110000
111111
+

例子:
+0011 & 1100 = 0000
+1010 & 1011 = 1010

+

性质:

+
    +
  • 交换律:a & b = b & a
  • +
  • 结合律:a & b & c = a & (b & c)
  • +
  • 自与:a & a = a
  • +
  • 000 & a1 & a2 & a3 & ... = 0
  • +
  • \infty(全11):a & inf = a
  • +
+

1.3 按位或

+

按位与(x | y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xxyyx | y
000000
001111
110011
111111
+

例子:
+1100 | 0011 = 1111
+1010 | 0001 = 1011

+

性质:

+
    +
  • 交换律:a | b = b | a
  • +
  • 结合律:a | b | c = a | (b | c)
  • +
  • 自或:a | a = a
  • +
  • 00a | 0 = a
  • +
  • \infty(全11):a | inf = inf
  • +
+

1.4 异或

+

异或(xyx\oplus yx ^ y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xxyyxyx\oplus y
000000
001111
110011
111100
+

举例:
+1000 ^ 1011 = 0011
+0101 ^ 1010 = 1111

+

性质:

+
    +
  • 交换律:ab=baa\oplus b=b\oplus a
  • +
  • 结合律:abc=a(bc)a\oplus b\oplus c=a\oplus(b\oplus c)
  • +
  • 自异或:aa=0a\oplus a=0
  • +
  • 异或00a0=aa\oplus 0=a
  • +
  • 多重异或:abb=a(bb)=a0=aa\oplus b\oplus b=a\oplus (b\oplus b)=a\oplus 0=a
  • +
  • 异或\infty(全11):a= a\oplus \infty=~~a
  • +
  • ab=ca\oplus b=c,则ac=ba\oplus c=b
  • +
+

1.5 位移

+

位移分为左移(<<)和右移(>>)。

+
    +
  • a << b:将aa末尾添上bb00的结果。
  • +
  • a >> b:从aa末尾删掉bb位的结果。
  • +
+

性质:

+
    +
  • (a << b) >> b = a
  • +
  • a << b =a×2b~=a\times 2^b
  • +
  • a >> b =a2b~=\lfloor\frac a {2^b}\rfloor
  • +
+

1.6 练习题

+

1.6.1 判断22的整数次幂

+

题意:给定整数NN,判断其是否为22的整数次幂。

+

1.6.2 洛谷 P1100 高低位交换

+

题意:给定一个3232位整数xx,在二进制下交换其前1616位与后1616位,输出最终的数。

+

答案为ans = (x >> 16) | (x << 16),这样解释:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
数值16161616
xxAABB
x >> 16161600AA
x << 16BB161600
ansBBAA
+

注意此处使用3232位无符号整数进行计算,这样x << 16会自然溢出,导致前1616位被丢弃,恰好满足要求。

+

参考程序:

+
#include <cstdio>
+using namespace std;
+
+int main()
+{
+	unsigned int x;
+	scanf("%u", &x);
+	printf("%u\n", (x >> 16) | (x << 16));
+	return 0;
+}
+
+

1.6.3 找出不同的数

+

给定一个序列A=(A1,A2,,A2N+1)A=(A_1,A_2,\dots,A_{2N+1}),其中有NN个数各出现22次,还有一个数正好出现11次。找到这个数。请尽可能优化程序的时间和空间复杂度。

+

- 时间O(N)\mathcal O(N)O(NlogN)\mathcal O(N\log N),空间O(N)\mathcal O(N)解法
+简单统计每个数的出现次数,最后找到正好出现11次的数。

+

- 时间O(N)\mathcal O(N),空间O(1)\mathcal O(1)解法
+考虑所有数的异或和S=A1A2A2N+1S=A_1\oplus A_2\oplus\dots\oplus A_{2N+1},则AA中所有出现两次的数抵消为00,剩下的即为唯一出现一次的数,所以直接输出SS即可。

+

参考程序:

+
#include <cstdio>
+using namespace std;
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	n = (n << 1) + 1;
+	int ans = 0;
+	while(n--)
+	{
+		int x;
+		scanf("%d", &x);
+		ans ^= x;
+	}
+	printf("%d\n", ans);
+	return 0;
+}
+
+

1.6.4 AtCoder Beginner Contest 261 E - Many Operations

+

解法:对于i=1,2,,Ni=1,2,\dots,N,记录操作1,2,,i1,2,\dots,i后每一位上的0011分别变成什么,可以在O(N)\mathcal O(N)的时间内用类似于前缀和的方法完成;最后用位运算快速模拟NN次连续操作即可,总时间复杂度为O(N)\mathcal O(N)

+
// https://atcoder.jp/contests/abc261/submissions/33495431
+#include <cstdio>
+using namespace std;
+
+int main()
+{
+	unsigned n, c, zero = 0, one = 0xffffffff;
+	scanf("%d%d", &n, &c);
+	while(n--)
+	{
+		int t, a;
+		scanf("%d%d", &t, &a);
+		if(t == 1) one &= a, zero &= a;
+		else if(t == 2) one |= a, zero |= a;
+		else one ^= a, zero ^= a;
+		printf("%d\n", c = (c & one) | (~c & zero));
+	}
+	return 0;
+}
+
+
+

2. 扩展概念&运算

+

2.1 lowbit

+

lowbit(x)即为二进制下xx的最低位,如lowbit(10010) = 10lowbit(1) = 1。严格来说00没有lowbit,部分情况下可视为lowbit(0) = 1。利用lowbit函数可实现树状数组等数据结构。

+

lowbit 计算方式

+
    +
  1. 暴力计算
    +简单粗暴的按位直接计算,如下:
    int lowbit(int x)
    +{
    +	int res = 1;
    +	while(x && !(x & 1))
    +		x >>= 1, res <<= 1;
    +	return res;
    +}
    +
    +时间复杂度O(logX)\mathcal O(\log X)。缺点:速度慢,代码长,没有体现位运算的优势
  2. +
  3. x & -x
    +巧妙利用lowbit(x) = x & -x。感兴趣的读者可自行尝试证明。
    +时间复杂度O(1)\mathcal O(1)。相比(1)来说,代码更短,速度更快。
  4. +
  5. x & (x - 1)
    +注意:x & (x - 1)不是lowbit(x),而是x - lowbit(x)
    +这种方法常用于树状数组中,可提升x - lowbit(x)的计算速度。
  6. +
+

2.2 popcount

+

popcount(x)定义为xx在二进制下11的个数,如popcount(10101) = 3popcount(0) = 0

+

popcount 计算方式

+
    +
  1. 暴力计算检查
    +还是最粗暴的算法,通过枚举每一位并检查是否为11达到目的,时间复杂度为O(logX)\mathcal O(\log X)
    int popcount(int x)
    +{
    +	int res = 0;
    +	while(x)
    +	{
    +		res += x & 1;
    +		x >>= 1;
    +	}
    +	return res;
    +}
    +
    +
  2. +
  3. lowbit 优化
    +时间复杂度还是O(logX)\mathcal O(\log X),不过平均用时会比(1)快2~3倍左右。
    int popcount(int x)
    +{
    +	int res = 0;
    +	for(; x; x&=x-1) res ++;
    +	return res;
    +}
    +
    +
  4. +
  5. builtin 函数(最快)
    +详见3.1 __builtin_popcount/__builtin_popcountll
  6. +
+
+

3. builtin 位运算函数

+

注意:后面带ll的传入long long类型,不带ll接受int类型。本部分内容按常用程度递减排序。
+参考:https://blog.csdn.net/zeekliu/article/details/124848210

+

3.1 __builtin_popcount/__builtin_popcountll

+

返回参数在二进制下11的个数。

+

3.2 __builtin_ctz / __buitlin_ctzll

+

返回参数在二进制下末尾00的个数。

+

3.3 __buitlin_clz / __buitlin_clzll

+

返回参数在二进制下前导00的个数。

+

3.4 __builtin_ffs / __buitlin_ffsll

+

返回参数在二进制下最后一个1在第几位(从后往前)。
+注意:一般来说,builtin_ffs(x) = __builtin_ctz(x) + 1。当x=0x=0时,builtin_ffs(x) = 0

+

3.5 __builtin_parity / __builtin_parityll

+

返回参数在二进制下11的个数的奇偶性(偶:0,奇:1),即__builtin_parity(x) = __builtin_popcount(x) % 2
+P.S. 这函数,不知是哪位神仙想出来的……

+
+

4. 位运算的应用

+

4.1 子集表示法

+

对于集合{0,1,,N1}\{0,1,\dots,N-1\},我们使用一个NN位的二进制整数SS来表示它的一个子集。从右往左第ii位表示子集是否包含了ii。容易发现,对于任意子集SSS[0,2N1]S\in [0,2^N-1],且对于任意S[0,2N1]S\in [0,2^N-1]SS都是{0,1,,N1}\{0,1,\dots,N-1\}的一个有效子集。下面我们来讲这种子集表示的具体操作。

+

4.1.1 子集操作

+

子集的操作如下(规定NN为集合元素个数):

+
    +
  • 空集:00
  • +
  • 满集:2N12^N-1NN11
  • +
  • 集合SS的元素个数:__builtin_popcount(S)__builtin_popcountll(S)
  • +
  • 集合SS是否包含iiS >> i & 1
  • +
  • ii加入SS(操作前SS是否包含ii不影响操作结果):S |= 1 << i
  • +
  • iiSS中删除(操作前SS必须包含ii):S ^= 1 << i
  • +
  • iiSS中删除(操作前SS是否包含ii不影响操作结果):S &= ~(1 << i)
  • +
  • SSTT的交集(SSTT都包含的集合):S & T
  • +
  • SSTT的并集(SSTT中有任意一个包含的集合):S | T
  • +
  • SSTT的差集(SSTT中恰好有一个包含的集合):S ^ T
  • +
+

4.1.2 子集枚举

+

讲了这么多,也该到子集的实际应用了吧。下面我们来看子集最初步的应用——子集枚举。

+

- 必会:枚举NN个元素的所有子集
+这个很简单,直接枚举S[0,2N1]S\in [0,2^N-1]即可。代码如下:

+
#include <cstdio>
+using namespace std;
+
+const int N = 3;
+
+int main()
+{
+	printf("N = %d\n", N);
+	for(int s=0, full=(1<<N)-1; s<=full; s++)
+	{
+		printf("Subset %d:", s + 1);
+		for(int i=0; i<N; i++)
+			if(s >> i & 1)
+				printf(" %d", i);
+		putchar('\n');
+	}
+	return 0;
+}
+
+

- 必会:枚举子集的子集
+如果我们想枚举{0,1,,N1}\{0,1,\dots,N-1\}的子集的子集,怎么办?这是一个经典套路,常用于状压DP,写法如下:

+
for(int S=0; S<(1<<N); S++) // 枚举子集S
+	for(int T=S; T; T=(T-1)&S) // 枚举子集的子集T
+	{
+		// Do something...
+		printf("%d\n", t);
+	}
+
+

请注意:这个算法的时间复杂度为O(3N)\mathcal O(3^N),不是O(4N)\mathcal O(4^N),使用此算法时请准确估算时间复杂度。

+

- 扩展:枚举NN个元素中大小为KK的子集
+首先很容易想到先枚举所有{0,1,,N1}\{0,1,\dots,N-1\}的所有子集,再依次检查大小是否为KK。代码如下:

+
for(int s=0; s<(1<<n); s++)
+{
+	int cnt = __builtin_popcount(s);
+	if(cnt != K) continue;
+	// Do something...
+}
+
+

这种做法虽然正确,也很易懂,但可惜效率太低,2N2^Npopcount操作浪费了很多时间。我们考虑优化。《挑战程序设计竞赛》上给出了一种算法,如下:

+
int S = (1 << k) - 1;
+while(S < 1 << n)
+{
+	// Do something...
+	printf("%d\n", S);
+	// 移到下一个合法子集
+	int x = S & -S, y = S + x;
+	S = ((S & ~y) / x >> 1) | y;
+}
+
+

这样可保证每次枚举到的都是大小为KK的子集,可以大大提高算法效率。

+

4.1.3 扩展:std::bitset

+

bitset,顾名思义,即为用位运算操作的集合。
+对于元素个数N[1,64]N\in [1,64],集合{0,1,,N1}\{0,1,\dots,N-1\}的任意子集都可以用一个32326464位整数表示出来,操作时间复杂度为O(1)\mathcal O(1)。那么对于N>64N>64,怎么办?我们可以用多个32326464位无符号整数拼凑为一个NN位的bitset,容易发现其操作的时间复杂度为O(Nw)\mathcal O(\frac Nw)NN位的二进制数可用Nw\lceil\frac Nw\rceilww位无符号整数拼凑而成),其中ww一般为32326464

+

C++的Standard Template LibrarySTL)为我们提供了<bitset>头文件,用于bitset的定义。

+

用法如下:
+bitset

+

用法示例:

+
#include <cstdio>
+#include <bitset> // 头文件
+using namespace std;
+
+int main()
+{
+	const int N = 500;
+	bitset<N> S; // 定义大小为N的bitset S,初始为全0
+	S.set(1);    // 将S的第1位设为1
+	S[0] = 1;    // 将S的第0位设为1,注意bitset可使用下标访问和赋值
+	S.reset(1);  // 将S的第1位设为0
+	printf("S[1]: %d\n", (int)S[1]); // 输出S第2位上的值
+	printf("Count: %d\n", (int)S.count()); // S的popcount(二进制下1的个数)
+	printf("Size: %d\n", (int)S.size()); // S的二进制位数(N)
+	printf("None? %d\n", (int)S.none()); // S是否为空?
+	printf("Any?  %d\n", (int)S.any());  // S是否有1?
+	bitset<N> T; // 定义一个新的bitset -- T
+	T.set(); // T置为全1
+	S.set(2), T.reset(2);
+	printf("Intersection: %d\n", (int)(S & T).count()); // 交集
+	printf("Union: %d\n", (int)(S | T).count()); // 并集
+	printf("Difference: %d\n", (int)(S ^ T).count()); // 差集
+	return 0;
+}
+
+
习题:AtCoder Beginner Contest 258 G - Triangle
+

题意和解法见https://blog.csdn.net/write_1m_lines/article/details/125582361#t15

+

4.2 深度优先搜索(DFS)的位运算优化

+

本算法其实还是二进制表示子集的一种优化,不过内容较多,所以单独放了出来。

+

考虑经典的八皇后问题

+
+

有一个8×88\times 8的国际象棋棋盘,要在其中摆88个皇后,求有多少种不同的摆法,使得任意两个皇后之间都没有互相攻击。
+注:皇后的攻击范围是一个“米”字,如下图所示:
+皇后攻击范围

+
+

八皇后问题很容易求解,用一个简单的回溯就可以了。
+考虑NN皇后问题,即:

+
+

有一个N×NN\times N的国际象棋棋盘,要在其中摆NN个皇后,求有多少种不同的摆法,使得任意两个皇后之间都没有互相攻击。

+
+

此时,还是先用标准的「回溯」算法解决问题:

+
#include <cstdio>
+#define maxn 20
+using namespace std;
+
+bool row[maxn], diag_left[maxn << 1], diag_right[maxn << 1];
+int ans, n;
+
+void dfs(int i)
+{
+	if(i == n)
+	{
+		ans ++;
+		return;
+	}
+	for(int j=0; j<n; j++)
+		if(!row[j] && !diag_left[i + j] && !diag_right[i - j + n])
+		{
+			row[j] = diag_left[i + j] = diag_right[i - j + n] = true;
+			dfs(i + 1);
+			row[j] = diag_left[i + j] = diag_right[i - j + n] = false;
+		}
+}
+
+int main()
+{
+	scanf("%d", &n);
+	ans = 0;
+	dfs(0);
+	printf("%d\n", ans);
+	return 0;
+}
+
+

代码很移动,也不是重点,这里就不详细解释了。对于N=13N=13,搜索时间约为243ms243\mathrm{ms}N=14N=141.31s1.31\mathrm sN=15N=158.14s8.14\mathrm sN=16N=16…… 53.4s53.4\mathrm s

+

明显,这样的算法效率太低,我们来考虑使用位运算优化。
+首先,我们把上面程序里的rowdiag_leftdiag_right换成一个int整数,赋值、取值全部改用位运算。但这样对整体的时间优化还是不大,我们要充分发挥位运算的优势——“百发百中”,即利用lowbit算法,确保每次枚举到的都是目前一步可放置的位置,减少不必要的判断。此时,我们改变diag_leftdiag_right的含义,使diag_left表示左下-右上的45°45\degree对角线上当前一步可放置的皇后位置集合,diag_right同理。见代码:

+
#include <cstdio>
+using namespace std;
+
+int ans, mx;
+
+void dfs(int row, int diag_left, int diag_right)
+{
+	if(row == mx)
+	{
+		ans ++;
+		return;
+	}
+	int a = mx & ~(row | diag_left | diag_right);
+	while(a)
+	{
+		int p = a & -a; a ^= p;
+		dfs(row | p, (diag_left | p) >> 1, (diag_right | p) << 1);
+	}
+}
+
+int main()
+{
+	int n;
+	scanf("%d", &n);
+	ans = 0;
+	mx = (1 << n) - 1;
+	dfs(0, 0, 0);
+	printf("%d\n", ans);
+	return 0;
+}
+
+

此时,计算1616皇后只需6.23s6.23\mathrm s
+习题:洛谷 P1092 [NOIP2004 提高组] 虫食算

+

附:N皇后问题的两种解法耗时对比

+

本测试中,两种算法耗时均为在Intel i7-12700H CPU上55次程序运行的最快速度。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NN无优化位运算优化速度提升
1313253ms253\mathrm{ms}66ms66\mathrm{ms}2.83x2.83\text x
14141.31s1.31\mathrm s179ms179\mathrm{ms}6.32x6.32\text x
15158.14s8.14\mathrm s955ms955\mathrm{ms}7.52x7.52\text x
161653.4s53.4\mathrm s6.23s6.23\mathrm s7.57x7.57\text x
+

4.3 其他应用

+

4.3.1 两数交换

+
void swap(int& a, int& b)
+{
+	a ^= b ^= a ^= b;
+}
+
+

位运算交换法扩展:超快GCD

+
inline int gcd(int a, int b)
+{
+	if(b) while(b ^= a ^= b ^= a %= b);
+	return a;
+}
+
+

4.3.2 两数平均数(防溢出)

+
inline int average1(int x, int y)
+{
+	return (x >> 1) + (y >> 1) + (x & y & 1);
+}
+
+inline int average2(int x, int y)
+{
+	return (x & y) + ((x ^ y) >> 1);
+}
+
+

4.3.3 判断一个数是否为22的整数次幂

+
inline bool ispowof2(int x)
+{
+	return x > 0 && !(x & x - 1);
+}
+
+
+

5. 总结

+

本文详细讲解了位运算的使用和扩展。

+
+

创作不易,各位如果觉得好的话就请给个三连,感谢大家的支持!

+]]>
+
+
\ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e745a48e493ceebced657a73c2552951e2c16ca8 GIT binary patch literal 51612 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 literal 0 HcmV?d00001 diff --git a/images/avatar.png b/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..e745a48e493ceebced657a73c2552951e2c16ca8 GIT binary patch literal 51612 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 00000000..beca1c75 --- /dev/null +++ b/index.html @@ -0,0 +1,441 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
+ + + +
+
+
+
+ GoodCoder666的个人博客 +
+
+ 天生我材必有用,千金散尽还复来。 +
+ +
+ 关于 +
+ +
+ + + + + + + + + + + + + +
+ +
+
+ GoodCoder666的个人博客 +
+
+ + +
+ +
+ + + +
+

+ + 元旦快乐 & 新年目标 + +

+
2024-01-01
+
+ 🌟 祝大家 202420242024 元旦快乐!🌟 +🎉 愿你们在新的一年里,万事尽可期待,眼里有光,脸上带笑,心中常怀温暖与爱!🎉 +2023 年的小目标: + + CSP-S 一等 + NOIP 一等 + 一个 300+ Star 的开源项... +
+ + 阅读更多 + +
+ +
+ +
+ + + +
+

+ + AtCoder题解集锦 + +

+
2022-04-15
+
+ 本文在CSDN随时更新,详见: +https://blog.csdn.net/write_1m_lines/article/details/124204736 +... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + Mathematica 入门 + +

+
2024-01-25
+
+ 前言 +Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLAB 和 Maple 等。 +M... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解 + +

+
2023-12-24
+
+ A - Christmas Present +题目大意 +给定两个正整数 B,GB,GB,G(1≤B,G≤10001\le B,G\le 10001≤B,G≤1000 且 B≠GB\ne GB​=G),判断哪个更大。 +分析 +模拟即可。 +代码 +... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + 洛谷 P9754 [CSP-S 2023] 结构体 题解 + +

+
2023-10-29
+
+ 题目传送门 +洛谷博客 CSDN +CSP-S 2023 T3 结构体 题解 +基本思路 +本题主要考查编码能力,所以直接给出基本思路: + +由于可以递归式的创建元素,最多可以同时存在 100100100^{100}100100 个不同的基础类型的元... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + AtCoder Beginner Contest 318 G - Typical Path Problem 题解 + +

+
2023-09-03
+
+ G - Typical Path Problem +题目大意 +给定一张 NNN 个点、MMM 条边的简单无向图 GGG 和三个整数 A,B,CA,B,CA,B,C。 +是否存在一条从顶点 AAA 到 CCC,且经过 BBB 的简单路径? +数据范... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解 + +

+
2023-04-19
+
+ 好久没写题解了,这就来水一篇。 +A - Job Interview +题目大意 +给定一个长为 NNN 的字符串 SSS,由 o、-、x 组成。 +判断 SSS 是否符合下列条件: + +SSS 中至少有一个 o。 +SSS 中没有 x。 + +1≤N≤1... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + 【算法笔记】最近公共祖先(LCA)问题求解——倍增算法 + +

+
2023-01-06
+
+ 0. 前言 +最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 +这种算法应用很广泛,可以很容易解决树上最短路等问题。 +为了方便,我们记某点集 S={... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + 【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树 + +

+
2023-01-05
+
+ 0. 前言 +好久没更算法笔记专栏了,正好学了新算法来更新…… +这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! +1. 关于 RMQ 问题 +RMQ 的全称是 Range Minimum/Maximum... +
+ + 阅读更多 + +
+ +
+ +
+ +
+

+ + AtCoder Beginner Contest 274 A~E 题解 + +

+
2022-10-24
+
+ 吐槽:这比赛名字为啥没有英文版。。。 +A - Batting Average +题目大意 +给定整数A,BA,BA,B,输出BA\frac BAAB​,保留三位小数。 +1≤A≤101\le A\le 101≤A≤10 +0≤B≤A0\le B\l... +
+ + 阅读更多 + +
+ +
+ + +
+ + + + + + +
+
+ + + + + diff --git a/media/css/prism-github.css b/media/css/prism-github.css new file mode 100644 index 00000000..73c94856 --- /dev/null +++ b/media/css/prism-github.css @@ -0,0 +1,131 @@ +/** + * GHColors theme by Avi Aryan (http://aviaryan.in) + * Inspired by Github syntax coloring + */ + +code[class*='language-'], +pre[class*='language-'] { + color: #393a34; + font-family: 'Fira Code', '霞骛文楷'; /* "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace */ + + font-feature-settings: 'calt' 1; /* Enable ligatures for IE 10+, Edge */ + text-rendering: optimizeLegibility; /* Force ligatures for Webkit, Blink, Gecko */ + + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + font-size: 0.9em; + line-height: 1.2em; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre > code[class*='language-'] { + font-size: 1em; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + background: #b3d4fc; +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background-color: #1d1f21; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.2em; + padding-top: 1px; + padding-bottom: 1px; + background: #f8f8f8; + border: 1px solid #dddddd; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999988; + font-style: italic; +} + +.token.namespace { + opacity: 0.7; +} + +.token.string, +.token.attr-value { + color: #e3116c; +} + +.token.punctuation, +.token.operator { + color: #393a34; /* no highlight */ +} + +.token.entity, +.token.url, +.token.symbol, +.token.number, +.token.boolean, +.token.variable, +.token.constant, +.token.property, +.token.regex, +.token.inserted { + color: #36acaa; +} + +.token.atrule, +.token.keyword, +.token.attr-name, +.language-autohotkey .token.selector { + color: #00a4db; +} + +.token.function, +.token.deleted, +.language-autohotkey .token.tag { + color: #9a050f; +} + +.token.tag, +.token.selector, +.language-autohotkey .token.keyword { + color: #00009f; +} + +.token.important, +.token.function, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} diff --git a/media/css/prism-synthwave84.css b/media/css/prism-synthwave84.css new file mode 100644 index 00000000..f11b0668 --- /dev/null +++ b/media/css/prism-synthwave84.css @@ -0,0 +1,146 @@ +/* + * Synthwave '84 Theme originally by Robb Owen [@Robb0wen] for Visual Studio Code + * Demo: https://marc.dev/demo/prism-synthwave84 + * + * Ported for PrismJS by Marc Backes [@themarcba] + */ + +code[class*='language-'], +pre[class*='language-'] { + color: #f92aad; + text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; + background: none; + font-family: 'Fira Code', '霞骛文楷'; /* "Consolas", "Monaco", "Andale Mono", "Ubuntu Mono", monospace */ + + font-feature-settings: 'calt' 1; /* Enable ligatures for IE 10+, Edge */ + text-rendering: optimizeLegibility; /* Force ligatures for Webkit, Blink, Gecko */ + + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background-color: transparent !important; + background-image: linear-gradient(to bottom, #2a2139 75%, #34294f); +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #8e8e8e; +} + +.token.punctuation { + color: #ccc; +} + +.token.tag, +.token.attr-name, +.token.namespace, +.token.number, +.token.unit, +.token.hexcode, +.token.deleted { + color: #e2777a; +} + +.token.property, +.token.selector { + color: #72f1b8; + text-shadow: 0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475; +} + +.token.function-name { + color: #6196cc; +} + +.token.boolean, +.token.selector .token.id, +.token.function { + color: #fdfdfd; + text-shadow: 0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, + 0 0 8px #03edf975; +} + +.token.class-name { + color: #fff5f6; + text-shadow: 0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, + 0 0 25px #fc1f2c75; +} + +.token.constant, +.token.symbol { + color: #f92aad; + text-shadow: 0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3; +} + +.token.important, +.token.atrule, +.token.keyword, +.token.selector .token.class, +.token.builtin { + color: #f4eee4; + text-shadow: 0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575; +} + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #f87c32; +} + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.inserted { + color: green; +} diff --git a/media/css/tailwind.css b/media/css/tailwind.css new file mode 100644 index 00000000..74ed9ef4 --- /dev/null +++ b/media/css/tailwind.css @@ -0,0 +1,1612 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +a, +button { + background-color: transparent; +} +blockquote, +body, +dd, +figure, +h1, +h2, +h3, +h4, +hr, +ol, +p, +pre, +ul { + margin: 0; +} +button, +hr, +input { + overflow: visible; +} +img, +legend { + max-width: 100%; +} +a, +legend { + color: inherit; +} +.cursor-pointer, +[role='button'], +button { + cursor: pointer; +} +.markdown > table, +.text-left { + text-align: left; +} +.btn, +.transition-all { + -webkit-transition-property: all; +} +.btn, +.duration-100 { + -webkit-transition-duration: 0.1s; +} +.border-collapse, +.markdown > table, +table { + border-collapse: collapse; +} +.flex-col, +.markdown figure { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; +} +.list-none, +.markdown > ol, +.markdown > ul:not(.list-none) { + list-style-type: none; +} +main { + display: block; +} +code, +pre { + font-size: 1em; +} +a { + text-decoration: inherit; +} +b, +strong { + font-weight: bolder; +} +small { + font-size: 80%; +} +sub { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + bottom: -0.25em; +} +button, +input, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button { + text-transform: none; + background-image: none; +} +[type='button'], +[type='reset'], +[type='submit'], +button { + -webkit-appearance: button; +} +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring, +button:-moz-focusring { + outline: ButtonText dotted 1px; +} +legend { + box-sizing: border-box; + display: table; + padding: 0; + white-space: normal; +} +textarea { + overflow: auto; + resize: vertical; +} +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; + padding: 0; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +[hidden] { + display: none; +} +button:focus { + outline: dotted 1px; + outline: -webkit-focus-ring-color auto 5px; +} +ol, +ul { + list-style: none; + padding: 0; +} +html { + -webkit-text-size-adjust: 100%; + line-height: 1.5; + font-size: large; +} +*, +::after, +::before { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: #999; +} +hr { + box-sizing: content-box; + height: 0; + border-top-width: 1px; +} +img { + border-style: solid; + height: auto; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #a0aec0; +} +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #a0aec0; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #a0aec0; +} +input::-ms-input-placeholder, +textarea::-ms-input-placeholder { + color: #a0aec0; +} +input::placeholder, +textarea::placeholder { + color: #a0aec0; +} +h1, +h2, +h3, +h4 { + font-size: inherit; + font-weight: inherit; +} +button, +input, +textarea { + padding: 0; + line-height: inherit; + color: inherit; +} +canvas, +img, +svg { + display: block; + vertical-align: middle; +} +.align-baseline, +.markdown > table td code { + vertical-align: baseline; +} +.container { + width: 100%; +} +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} +.bg-black { + background-color: #000; +} +.bg-white { + background-color: #fff; +} +.bg-gray-50 { + background-color: #faf9f7; +} +.bg-gray-100 { + background-color: #fafafa; +} +.bg-gray-200 { + background-color: #eaeaea; +} +.bg-gray-400 { + background-color: #888; +} +.bg-gray-500 { + background-color: #666; +} +.bg-gray-600 { + background-color: #444; +} +.bg-gray-700 { + background-color: #333; +} +.bg-gray-800 { + background-color: #111; +} +.bg-orange-100 { + background-color: #fffaf0; +} +.bg-yellow-50 { + background-color: #ffd602; +} +.bg-yellow-700 { + background-color: #b7791f; +} +.bg-green-600 { + background-color: #38a169; +} +.bg-indigo-100 { + background-color: #ebf4ff; +} +.bg-indigo-200 { + background-color: #c3dafe; +} +.bg-indigo-600 { + background-color: #5a67d8; +} +.hover\:bg-gray-200:hover { + background-color: #eaeaea; +} +.hover\:bg-red-100:hover { + background-color: #fff5f5; +} +.hover\:bg-yellow-50:hover { + background-color: #ffd602; +} +.hover\:bg-blue-100:hover { + background-color: #ebf8ff; +} +.hover\:bg-indigo-100:hover { + background-color: #ebf4ff; +} +.border-transparent { + border-color: transparent; +} +.border-gray-100 { + border-color: #fafafa; +} +.border-gray-200 { + border-color: #eaeaea; +} +.border-gray-300 { + border-color: #999; +} +.border-gray-500 { + border-color: #666; +} +.border-gray-700 { + border-color: #333; +} +.border-orange-600 { + border-color: #dd6b20; +} +.border-yellow-500 { + border-color: #ecc94b; +} +.hover\:border-gray-600:hover { + border-color: #444; +} +.hover\:border-yellow-50:hover { + border-color: #ffd602; +} +.rounded-none { + border-radius: 0; +} +.rounded-sm { + border-radius: 0.125rem; +} +.rounded { + border-radius: 0.25rem; +} +.rounded-lg { + border-radius: 0.5rem; +} +.rounded-full { + border-radius: 9999px; +} +.border-dotted { + border-style: dotted; +} +.border-4 { + border-width: 4px; +} +.border { + border-width: 1px; +} +.border-t-0 { + border-top-width: 0; +} +.border-t, +.markdown > table td { + border-top-width: 1px; +} +.border-r-0 { + border-right-width: 0; +} +.border-l-0 { + border-left-width: 0; +} +.border-b-2 { + border-bottom-width: 2px; +} +.border-l-2 { + border-left-width: 2px; +} +.border-b-8 { + border-bottom-width: 8px; +} +.border-b { + border-bottom-width: 1px; +} +.border-l { + border-left-width: 1px; +} +.block { + display: block; +} +.inline-block { + display: inline-block; +} +.inline { + display: inline; +} +.flex { + display: -webkit-box; + display: flex; +} +.inline-flex { + display: -webkit-inline-box; + display: inline-flex; +} +.grid { + display: grid; +} +.table { + display: table; +} +.table-cell { + display: table-cell; +} +.hidden { + display: none; +} +.flex-col { + flex-direction: column; +} +.flex-wrap { + flex-wrap: wrap; +} +.items-center { + -webkit-box-align: center; + align-items: center; +} +.self-start { + align-self: flex-start; +} +.justify-end { + -webkit-box-pack: end; + justify-content: flex-end; +} +.justify-center { + -webkit-box-pack: center; + justify-content: center; +} +.justify-between { + -webkit-box-pack: justify; + justify-content: space-between; +} +.flex-1 { + -webkit-box-flex: 1; + flex: 1 1 0%; +} +.flex-shrink-0 { + flex-shrink: 0; +} +.order-1 { + -webkit-box-ordinal-group: 2; + order: 1; +} +.order-2 { + -webkit-box-ordinal-group: 3; + order: 2; +} +.clearfix:after { + content: ''; + display: table; + clear: both; +} +.font-light { + font-weight: 300; +} +.font-medium { + font-weight: 500; +} +.font-semibold { + font-weight: 600; +} +.font-bold { + font-weight: 700; +} +.h-6 { + height: 1.5rem; +} +.h-8 { + height: 2rem; +} +.h-32 { + height: 8rem; +} +.h-40 { + height: 10rem; +} +.leading-none { + line-height: 1; +} +.leading-tight { + line-height: 1.25; +} +.leading-snug { + line-height: 1.375; +} +.leading-normal { + line-height: 1.5; +} +.leading-relaxed, +.markdown { + line-height: 1.625; +} +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} +.my-16 { + margin-top: 4rem; + margin-bottom: 4rem; +} +.mx-auto { + margin-left: auto; + margin-right: auto; +} +.-mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} +.-mx-4 { + margin-left: -1rem; + margin-right: -1rem; +} +.-mx-8 { + margin-left: -2rem; + margin-right: -2rem; +} +.mt-0 { + margin-top: 0; +} +.mb-0 { + margin-bottom: 0; +} +.mb-1 { + margin-bottom: 0.25rem; +} +.mb-2, +.post-toc li { + margin-bottom: 0.5rem; +} +.ml-1 { + margin-left: 0.25rem; +} +.mr-2 { + margin-right: 0.5rem; +} +.ml-2 { + margin-left: 0.5rem; +} +.mr-3 { + margin-right: 0.75rem; +} +.mb-3 { + margin-bottom: 0.75rem; +} +.mt-4 { + margin-top: 1rem; +} +.mr-4 { + margin-right: 1rem; +} +.mb-4 { + margin-bottom: 1rem; +} +.ml-4 { + margin-left: 1rem; +} +.mt-6 { + margin-top: 1.5rem; +} +.mr-6 { + margin-right: 1.5rem; +} +.mb-6 { + margin-bottom: 1.5rem; +} +.mt-8 { + margin-top: 2rem; +} +.mb-8 { + margin-bottom: 2rem; +} +.ml-8 { + margin-left: 2rem; +} +.mt-12 { + margin-top: 3rem; +} +.mt-16 { + margin-top: 4rem; +} +.mb-16 { + margin-bottom: 4rem; +} +.mt-px { + margin-top: 1px; +} +.-ml-4 { + margin-left: -1rem; +} +.-mr-64 { + margin-right: -16rem; +} +.max-w-4xl { + max-width: 56rem; +} +.min-h-screen { + min-height: 100vh; +} +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} +.outline-none { + outline: 0; +} +.overflow-auto { + overflow: auto; +} +.overflow-hidden { + overflow: hidden; +} +.overflow-y-auto { + overflow-y: auto; +} +.p-0 { + padding: 0; +} +.p-2 { + padding: 0.5rem; +} +.p-4 { + padding: 1rem; +} +.p-8 { + padding: 2rem; +} +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} +.py-16 { + padding-top: 4rem; + padding-bottom: 4rem; +} +.pl-0 { + padding-left: 0; +} +.pb-2 { + padding-bottom: 0.5rem; +} +.pl-4 { + padding-left: 1rem; +} +.pb-5 { + padding-bottom: 1.25rem; +} +.pl-5 { + padding-left: 1.25rem; +} +.pb-8 { + padding-bottom: 2rem; +} +.pl-8 { + padding-left: 2rem; +} +.pl-10 { + padding-left: 2.5rem; +} +.pt-32 { + padding-top: 8rem; +} +.fixed { + position: fixed; +} +.absolute { + position: absolute; +} +.relative { + position: relative; +} +.top-0 { + top: 0; +} +.right-0 { + right: 0; +} +.bottom-0 { + bottom: 0; +} +.left-0 { + left: 0; +} +.shadow-box { + box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.04); +} +.shadow { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); +} +.shadow-md { + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -1px rgba(0, 0, 0, 0.06); +} +.shadow-lg { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -2px rgba(0, 0, 0, 0.05); +} +.shadow-none { + box-shadow: none; +} +.hover\:shadow-lg:hover { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -2px rgba(0, 0, 0, 0.05); +} +.text-center { + text-align: center; +} +.text-white { + color: #fff; +} +.text-gray-200 { + color: #eaeaea; +} +.text-gray-300 { + color: #999; +} +.text-gray-400 { + color: #888; +} +.text-gray-500 { + color: #666; +} +.text-gray-700 { + color: #333; +} +.text-gray-800 { + color: #111; +} +.text-gray-900 { + color: #000; +} +.text-red-500 { + color: #f56565; +} +.text-orange-200 { + color: #feebc8; +} +.text-orange-900 { + color: #7b341e; +} +.text-yellow-300 { + color: #faf089; +} +.text-blue-500 { + color: #4299e1; +} +.text-indigo-500 { + color: #667eea; +} +.text-indigo-900 { + color: #3c366b; +} +.text-purple-400 { + color: #b794f4; +} +.text-purple-600 { + color: #805ad5; +} +.text-purple-700 { + color: #6b46c1; +} +.hover\:text-gray-700:hover { + color: #333; +} +.text-xs { + font-size: 0.75rem; +} +.text-sm { + font-size: 0.875rem; +} +.text-base { + font-size: 1rem; +} +.text-lg { + font-size: 1.125rem; +} +.text-xl { + font-size: 1.25rem; +} +.text-2xl { + font-size: 1.5rem; +} +.text-3xl { + font-size: 1.875rem; +} +.text-4xl { + font-size: 2.25rem; +} +.text-5xl { + font-size: 3rem; +} +.antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.subpixel-antialiased { + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: auto; +} +.visible { + visibility: visible; +} +.invisible { + visibility: hidden; +} +.break-words { + overflow-wrap: break-word; +} +.w-6 { + width: 1.5rem; +} +.w-8 { + width: 2rem; +} +.w-32 { + width: 8rem; +} +.w-64 { + width: 16rem; +} +.w-full { + width: 100%; +} +.z-10 { + z-index: 10; +} +.transform { + --transform-translate-x: 0; + --transform-translate-y: 0; + --transform-rotate: 0; + --transform-skew-x: 0; + --transform-skew-y: 0; + --transform-scale-x: 1; + --transform-scale-y: 1; + -webkit-transform: translateX(var(--transform-translate-x)) + translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) + skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) + scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)); + transform: translateX(var(--transform-translate-x)) + translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) + skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) + scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)); +} +.rotate-90 { + --transform-rotate: 90deg; +} +.transition-all { + transition-property: all; +} +.ease-in { + -webkit-transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} +.ease-out { + -webkit-transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} +.ease-in-out { + -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.duration-100 { + transition-duration: 0.1s; +} +.duration-300 { + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; +} +.transition { + -webkit-transition: all 0.1s ease-in !important; + transition: all 0.1s ease-in !important; +} +.translate-r-2px { + -webkit-transform: translateX(2px) !important; + transform: translateX(2px) !important; +} +.transition-fast { + -webkit-transition: all 0.2s ease !important; + transition: all 0.2s ease !important; +} +.btn { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-align: center; + align-items: center; + background-color: #5a67d8; + border-radius: 0.25rem; + color: #fff; + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -2px rgba(0, 0, 0, 0.05); + font-size: 0.875rem; + font-weight: 600; + transition-property: all; + transition-duration: 0.1s; + padding: 0.5rem 1rem; +} +.btn:hover { + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -1px rgba(0, 0, 0, 0.06); +} +.btn.btn-black { + background-color: #111; +} +.btn.btn-white { + background-color: #fff; + color: #333; + box-shadow: none; + -webkit-transition-property: all; + transition-property: all; + -webkit-transition-duration: 0.1s; + transition-duration: 0.1s; +} +.btn.btn-white:hover { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), + 0 4px 6px -2px rgba(0, 0, 0, 0.05); +} +@media (prefers-color-scheme: dark) { + .btn { + background-color: #ffd602; + color: #333; + } + .btn.btn-white { + background-color: #444; + color: #eaeaea; + } +} +.nav.scroll { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + box-shadow: 1px 2px 18px rgba(0, 0, 0, 0.1); +} +.post-toc li { + margin-left: 0.5rem; +} +.post-toc a { + display: block; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + color: #888; +} +.post-toc a:hover { + color: #000; +} +.markdown > :first-child { + margin-top: 0; +} +.markdown > * + * { + margin-top: 1.5rem; +} +.markdown > ol > * + *, +.markdown > ul > * + * { + margin-top: 1rem; +} +.markdown .subnav, +.subnav.markdown { + display: -webkit-box; + display: flex; + margin-top: 1.5rem; + margin-bottom: 1.5rem; + padding-bottom: 0.5rem; + border-bottom-width: 2px; + border-color: #999; +} +.markdown .subnav .subnav-link, +.subnav-link.markdown .subnav, +.subnav-link.subnav.markdown, +.subnav.markdown .subnav-link { + margin-right: 1.5rem; + line-height: 1; + color: #000; + font-size: 0.875rem; +} +.markdown > h2::before, +.markdown > h3::before { + display: block; + height: 6rem; + margin-top: -6rem; + visibility: hidden; + content: ''; +} +.markdown > hr { + border-color: #eaeaea; + margin-top: 4rem; + margin-bottom: 4rem; + border-width: 0 0 2px; +} +.markdown > p strong, +.markdown > ul strong { + font-weight: 600; + color: #111; + position: relative; + z-index: 10; +} +.markdown > p strong::before, +.markdown > ul strong::before { + display: inline-block; + -webkit-transform: rotate(-2deg); + transform: rotate(-2deg); + position: absolute; + background-color: #ffd602; + opacity: 0.3; + content: ' '; + width: 100%; + height: 100%; + left: 4px; + top: -4px; + z-index: -1; + border-radius: 0.4rem; +} +@media (prefers-color-scheme: dark) { + .markdown > hr { + border-color: #666; + } + .markdown > p strong, + .markdown > ul strong { + color: #eaeaea; + } +} +.markdown > ol li :not(pre) code, +.markdown > ol li > code, +.markdown > p code, +.markdown > ul li :not(pre) code, +.markdown > ul li > code, +p.markdown code.markdown { + background-color: #fafafa; + border-radius: 0.125rem; + font-size: 0.875rem; + padding-left: 0.25rem; + padding-right: 0.25rem; + overflow-wrap: break-word; + line-height: 1.5; + color: #805ad5; + font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace; + vertical-align: baseline; + font-weight: 400; +} +@media (prefers-color-scheme: dark) { + .markdown > ol li :not(pre) code, + .markdown > ol li > code, + .markdown > p code, + .markdown > ul li :not(pre) code, + .markdown > ul li > code, + p.markdown code.markdown { + background-color: #333; + color: #b794f4; + } +} +.markdown > ol li strong code, +.markdown > p strong code, +.markdown > ul li strong code { + font-weight: 600; +} +.markdown > pre, +pre.markdown { + font-weight: 400; + scrollbar-width: none; +} +.markdown > pre::-webkit-scrollbar, +pre.markdown::-webkit-scrollbar { + display: none; +} +.markdown > blockquote, +blockquote.markdown { + color: #7b341e; + font-size: 0.875rem; + background-color: #fffaf0; + padding: 1rem 2rem; + margin-left: -1rem; + margin-right: -1rem; +} +@media (min-width: 768px) { + .markdown > blockquote, + blockquote.markdown { + margin-left: -2rem; + margin-right: -2rem; + } +} +.markdown > blockquote p:first-of-type, +blockquote.markdown p:first-of-type { + margin-top: 0; + border-left-width: 2px; + border-color: #dd6b20; + padding-left: 1rem; +} +@media (prefers-color-scheme: dark) { + .markdown > blockquote, + blockquote.markdown { + background-color: #b7791f; + color: #faf089; + } + .markdown > blockquote p:first-of-type, + blockquote.markdown p:first-of-type { + border-color: #ecc94b; + } +} +.markdown > h3 > code, +.markdown > h4 > code { + padding-left: 0.25rem; + padding-right: 0.25rem; + background-color: #fafafa; +} +.markdown > h1, +h1.markdown { + margin-bottom: 0.25rem; + line-height: 1; + color: #000; + font-weight: 300; + font-size: 1.875rem; +} +.markdown > h2, +h2.markdown { + margin-top: 4rem; + margin-bottom: 1rem; + color: #000; + line-height: 1; + font-weight: 600; + font-size: 1.5rem; +} +.markdown > h2 + h3 { + margin-top: 1.5rem; +} +.markdown > h3, +h3.markdown { + margin-top: 3rem; + margin-bottom: 0.75rem; + color: #000; + line-height: 1.25; + font-weight: 500; + font-size: 1.25rem; +} +.markdown > h4, +h4.markdown { + margin-top: 3rem; + margin-bottom: 0; + color: #000; + line-height: 1.375; + font-weight: 500; + font-size: 1.125rem; +} +.markdown > h1 + p { + margin-top: 2rem; +} +.markdown > h1 > code, +.markdown > h2 > code, +.markdown > h3 > code, +.markdown > h4 > code { + color: #805ad5; +} +.markdown > h3 > code { + font-size: 1.125rem; +} +.markdown > h4 > code { + font-size: 1rem; +} +.markdown > blockquote > p, +.markdown > p, +p.markdown { + font-size: 1rem; + margin-top: 1.5rem; +} +.markdown > ul:not(.list-none) { + padding-left: 0; +} +.markdown > ul:not(.list-none) li { + position: relative; + padding-left: 1.25rem; +} +.markdown > ul:not(.list-none) li::before { + position: absolute; + left: 0; + color: #888; + display: inline-block; + margin-right: 0.75rem; + content: '\2022'; +} +.markdown > ol { + counter-reset: item; +} +.markdown > ol > li { + position: relative; + padding-left: 2.5rem; +} +.markdown > ol > li::before { + position: absolute; + top: 0; + left: 0; + margin-top: 1px; + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + height: 1.5rem; + width: 1.5rem; + background-color: #c3dafe; + border-radius: 9999px; + color: #3c366b; + font-size: 0.75rem; + font-weight: 700; + content: counter(item); + counter-increment: item; +} +@media (prefers-color-scheme: dark) { + .markdown > ol > li::before { + background-color: #5a67d8; + color: #eaeaea; + } +} +.markdown > :not(pre):not(h1):not(h2):not(h3):not(h4) > code, +.markdown > ol code, +.markdown > ul code { + font-size: 0.875rem; + line-height: 1.5; +} +@media (prefers-color-scheme: dark) { + .markdown > :not(pre):not(h1):not(h2):not(h3):not(h4) > code, + .markdown > ol code, + .markdown > ul code { + background-color: #333; + color: #b794f4; + } +} +.markdown pre { + margin-left: -1rem !important; + margin-right: -1rem !important; +} +@media (min-width: 768px) { + .markdown pre { + margin-left: -2rem !important; + margin-right: -2rem !important; + } +} +.markdown > ol li pre, +.markdown > pre, +.markdown > ul li pre, +pre.markdown { + display: -webkit-box; + display: flex; + padding: 0; + background-color: #111; + font-size: 0.875rem; + line-height: 1.5; +} +.markdown > ol li pre code, +.markdown > pre code, +.markdown > ul li pre code, +pre code.markdown { + padding: 1rem; + color: #eaeaea; + overflow: auto; +} +.markdown > table { + width: 100%; +} +.markdown > table th { + font-size: 0.875rem; + font-weight: 600; + color: #333; + padding: 0.5rem; + background-color: #fafafa; +} +@media (prefers-color-scheme: dark) { + .markdown > table th { + background-color: #333; + color: #999; + } +} +.markdown > table td { + padding: 0.5rem; + border-color: #eaeaea; + font-size: 0.875rem; +} +.markdown > table td code { + background-color: #fafafa; + padding-left: 0.25rem; + padding-right: 0.25rem; + font-size: 0.75rem; + color: #6b46c1; +} +@media (prefers-color-scheme: dark) { + .markdown > table td { + border-color: #333; + } + .markdown > table td code { + background-color: #333; + color: #b794f4; + } +} +.markdown figure { + margin-left: -1rem; + margin-right: -1rem; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + background-color: #fafafa; + outline: 0; + flex-direction: column; +} +@media (min-width: 768px) { + .markdown figure { + margin-left: -2rem; + margin-right: -2rem; + } +} +.markdown figure img { + cursor: -webkit-zoom-in; + cursor: zoom-in; +} +@media (prefers-color-scheme: dark) { + .markdown figure { + background-color: #666; + } +} +.markdown .contains-task-list { + list-style-type: none; + padding-left: 32px; + margin-left: 2rem; +} +.markdown .task-list-item { + position: relative; + padding-left: 0 !important; +} +.markdown .task-list-item:before { + content: '' !important; +} +.markdown .task-list-item-checkbox { + position: absolute; + cursor: pointer; + width: 18px; + height: 18px; + margin: 4px 0 0; + left: -24px; + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + -webkit-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.markdown .task-list-item-checkbox:checked { + -webkit-transform: rotate(0); + transform: rotate(0); +} +.markdown .task-list-item-checkbox:checked:before { + border: transparent; + background-color: #38a169; +} +.markdown .task-list-item-checkbox:checked:after { + -webkit-transform: rotate(-45deg) scale(1); + transform: rotate(-45deg) scale(1); +} +.markdown .task-list-item-checkbox:checked + .task-list-item-label { + color: #888; + background-color: #eaeaea; +} +@media (prefers-color-scheme: dark) { + .markdown .task-list-item-checkbox:checked + .task-list-item-label { + background-color: #666; + color: #999; + } +} +.markdown .task-list-item-checkbox:before { + content: ''; + width: 18px; + height: 18px; + box-sizing: border-box; + display: inline-block; + border-width: 1px; + border-color: #eaeaea; + background-color: #fff; + position: absolute; + top: 0; + left: 0; + -webkit-transition: all 0.35s ease; + transition: all 0.35s ease; +} +@media (prefers-color-scheme: dark) { + .markdown .task-list-item-checkbox:before { + border-color: #666; + background-color: #888; + } +} +.markdown .task-list-item-checkbox:after { + content: ''; + -webkit-transform: rotate(-45deg) scale(0); + transform: rotate(-45deg) scale(0); + width: 9px; + height: 5px; + border: 1px solid #fff; + border-top: none; + border-right: none; + position: absolute; + display: inline-block; + top: 5px; + left: 5px; + -webkit-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.markdown .markdownIt-TOC { + background-color: #ebf4ff; + padding: 2rem; + margin-left: -1rem; + margin-right: -1rem; +} +@media (min-width: 768px) { + .markdown .markdownIt-TOC { + margin-left: -2rem; + margin-right: -2rem; + } +} +.markdown .markdownIt-TOC li:before { + content: '' !important; +} +.markdown .markdownIt-TOC li a { + display: inline-block; + margin-bottom: 1rem; +} +.post-toc-container .markdownIt-TOC { + margin-left: -1rem; +} +.post-toc-container .markdownIt-TOC ul { + padding-left: 1rem; +} +.post-toc-container .markdownIt-TOC a { + display: inline-block; +} +@media (min-width: 768px) { + .md\:rounded-lg { + border-radius: 0.5rem; + } + .md\:block { + display: block; + } + .md\:hidden { + display: none; + } + .md\:flex-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + } + .md\:order-1 { + -webkit-box-ordinal-group: 2; + order: 1; + } + .md\:order-2 { + -webkit-box-ordinal-group: 3; + order: 2; + } + .md\:h-32 { + height: 8rem; + } + .md\:mx-0 { + margin-left: 0; + margin-right: 0; + } + .md\:mx-8 { + margin-left: 2rem; + margin-right: 2rem; + } + .md\:mb-0 { + margin-bottom: 0; + } + .md\:ml-4 { + margin-left: 1rem; + } + .md\:px-0 { + padding-left: 0; + padding-right: 0; + } + .md\:py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + } + .md\:py-8 { + padding-top: 2rem; + padding-bottom: 2rem; + } + .md\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } + .md\:py-32 { + padding-top: 8rem; + padding-bottom: 8rem; + } + .md\:pr-16 { + padding-right: 4rem; + } + .md\:pt-64 { + padding-top: 16rem; + } + .md\:text-left { + text-align: left; + } + .md\:w-56 { + width: 14rem; + } +} +@media (prefers-color-scheme: dark) { + .markdown .markdownIt-TOC { + background-color: #111; + } + .markdown > h1, + .markdown > h2, + .markdown > h3, + .markdown > h4, + h1.markdown, + h2.markdown, + h3.markdown, + h4.markdown { + color: #eaeaea; + } + .dark\:bg-gray-500 { + background-color: #666; + } + .dark\:bg-gray-600 { + background-color: #444; + } + .dark\:bg-gray-700 { + background-color: #333; + } + .dark\:bg-gray-800 { + background-color: #111; + } + .dark\:bg-yellow-50 { + background-color: #ffd602; + } + .dark\:bg-indigo-500 { + background-color: #667eea; + } + .dark\:hover\:bg-black:hover { + background-color: #000; + } + .dark\:hover\:bg-gray-600:hover { + background-color: #444; + } + .dark\:border-gray-400 { + border-color: #888; + } + .dark\:border-gray-600 { + border-color: #444; + } + .dark\:border-gray-700 { + border-color: #333; + } + .dark\:hover\:border-gray-200:hover { + border-color: #eaeaea; + } + .dark\:text-gray-200 { + color: #eaeaea; + } + .dark\:text-gray-300 { + color: #999; + } + .dark\:text-gray-700 { + color: #333; + } + .dark\:hover\:text-white:hover { + color: #fff; + } +} diff --git a/media/gridea.png b/media/gridea.png new file mode 100644 index 0000000000000000000000000000000000000000..7b39ec6e9118a6c37f77839a2e69857b1911bb68 GIT binary patch literal 40435 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 z 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 literal 0 HcmV?d00001 diff --git a/media/images/custom-wechat.png b/media/images/custom-wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..abd5eaa4f53ded5e968e4b8d49060aa896dc785e GIT binary patch literal 442791 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
  • -hA8XZH4BzNCYyvPE7V-Ie4tI&Q@* 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�Zypp#UWH0NU4sUY$vKP2Es#EbKT5vZSV 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 z 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 NnBYa$u}A<+ZipBsW1#^W`=NNBsd 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%0DMJ7sN~ORwZTXGFnswe% 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%0D}W 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 XJ&jp5muufK0l#~CX1dkdu2234o1vNh literal 0 HcmV?d00001 diff --git a/media/prism.js b/media/prism.js new file mode 100644 index 00000000..eb932674 --- /dev/null +++ b/media/prism.js @@ -0,0 +1,206 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+antlr4+apacheconf+apl+applescript+aql+arduino+arff+asciidoc+aspnet+asm6502+autohotkey+autoit+bash+basic+batch+bbcode+bison+bnf+brainfuck+brightscript+bro+c+csharp+cpp+cil+clojure+cmake+coffeescript+csp+crystal+css-extras+d+dart+diff+django+dns-zone-file+docker+ebnf+eiffel+ejs+elixir+elm+etlua+erb+erlang+fsharp+firestore-security-rules+flow+fortran+ftl+gml+gcode+gdscript+gedcom+gherkin+git+glsl+go+graphql+groovy+haml+handlebars+haskell+haxe+hcl+http+hpkp+hsts+ichigojam+icon+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jolie+jq+jsdoc+js-extras+json+json5+jsonp+js-templates+julia+keyman+kotlin+latex+latte+less+lilypond+liquid+lisp+livescript+lolcode+lua+makefile+markdown+markup-templating+matlab+mel+mizar+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+nasm+neon+nginx+nim+nix+nsis+objectivec+ocaml+opencl+oz+parigp+parser+pascal+pascaligo+pcaxis+perl+php+phpdoc+php-extras+plsql+powershell+processing+prolog+properties+protobuf+pug+puppet+pure+python+q+qml+qore+r+jsx+tsx+reason+regex+renpy+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smalltalk+smarty+solidity+soy+sparql+splunk-spl+sqf+sql+stylus+swift+t4-templating+t4-cs+t4-vb+tap+tcl+tt2+textile+toml+turtle+twig+typescript+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+wasm+wiki+wolfram+xeora+xojo+xquery+yaml+zig */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; +!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism); +Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",delete Prism.languages.actionscript.parameter,delete Prism.languages.actionscript["literal-property"],Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:Prism.languages.markup}}); +Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; +Prism.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},Prism.languages.g4=Prism.languages.antlr4; +Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; +Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}; +Prism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}; +Prism.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}; +Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +Prism.languages.arduino=Prism.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),Prism.languages.ino=Prism.languages.arduino; +Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}; +!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},i=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})$[\s\S]*?^\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); +Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); +Prism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"property"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,"op-code":{pattern:/\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{1,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[xya]\b/i,alias:"variable"},punctuation:/[(),:]/}; +Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; +Prism.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; +!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism); +Prism.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},Prism.languages.shortcode=Prism.languages.bbcode; +Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}}); +Prism.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},Prism.languages.rbnf=Prism.languages.bnf; +Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}; +Prism.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},Prism.languages.brightscript["directive-statement"].inside.expression.inside=Prism.languages.brightscript; +Prism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}; +Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}; +Prism.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}; +Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; +!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); +!function(e){function n(e){return RegExp("([ \t])(?:"+e+")(?=[\\s;]|$)","i")}e.languages.csp={directive:{pattern:/(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,lookbehind:!0,alias:"property"},scheme:{pattern:n("[a-z][a-z0-9.+-]*:"),lookbehind:!0},none:{pattern:n("'none'"),lookbehind:!0,alias:"keyword"},nonce:{pattern:n("'nonce-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},hash:{pattern:n("'sha(?:256|384|512)-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},host:{pattern:n("[a-z][a-z0-9.+-]*://[^\\s;,']*|\\*[^\\s;,']*|[a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::[\\d*]+)?(?:/[^\\s;,']*)?"),lookbehind:!0,alias:"url",inside:{important:/\*/}},keyword:[{pattern:n("'unsafe-[a-z-]+'"),lookbehind:!0,alias:"unsafe"},{pattern:n("'[a-z-]+'"),lookbehind:!0,alias:"safe"}],punctuation:/;/}}(Prism); +!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); +!function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,e.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),e.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:e.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:e.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(Prism); +!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); +Prism.languages.d=Prism.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp("(^|[^\\\\])(?:"+["/\\+(?:/\\+(?:[^+]|\\+(?!/))*\\+/|(?!/\\+)[^])*?\\+/","//.*","/\\*[^]*?\\*/"].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(['\\b[rx]"(?:\\\\[^]|[^\\\\"])*"[cwd]?','\\bq"(?:\\[[^]*?\\]|\\([^]*?\\)|<[^]*?>|\\{[^]*?\\})"','\\bq"((?!\\d)\\w+)$[^]*?^\\1"','\\bq"(.)[^]*?\\2"','(["`])(?:\\\\[^]|(?!\\3)[^\\\\])*\\3[cwd]?'].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}}); +!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); +!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism); +!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); +!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism); +Prism.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},Prism.languages["dns-zone"]=Prism.languages["dns-zone-file"]; +!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); +Prism.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}; +Prism.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}; +!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); +Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; +Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; +!function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism); +!function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism); +Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; +Prism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),Prism.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:Prism.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}}); +Prism.languages["firestore-security-rules"]=Prism.languages.extend("clike",{comment:/\/\/.*/,keyword:/\b(?:allow|function|if|match|null|return|rules_version|service)\b/,operator:/&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete Prism.languages["firestore-security-rules"]["class-name"],Prism.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}}); +!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); +Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; +!function(e){for(var t="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism); +Prism.languages.gamemakerlanguage=Prism.languages.gml=Prism.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/}); +Prism.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}; +Prism.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}; +Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; +!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism); +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; +Prism.languages.glsl=Prism.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/}); +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; +Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",(function(n){if("graphql"===n.language)for(var t=n.tokens.filter((function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type})),e=0;e0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism); +!function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); +Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; +Prism.languages.haxe=Prism.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),Prism.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:Prism.languages.haxe}}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),Prism.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}}); +Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}; +!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); +Prism.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; +Prism.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; +Prism.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}; +Prism.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}; +Prism.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.languages.inform7,Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}; +Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}; +Prism.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}; +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); +!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i/g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); +Prism.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}; +Prism.languages.jolie=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),Prism.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}}); +!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); +!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); +!function(a){function e(a,e){return RegExp(a.replace(//g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}; +Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; +!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); +!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); +!function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism); +Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); +!function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism); +!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,(function(){return n}));n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")})); +!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism); +Prism.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},Prism.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=Prism.languages.livescript; +Prism.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}; +Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); +Prism.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}; +Prism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; +Prism.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}; +Prism.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}; +Prism.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=Prism.languages.moonscript,Prism.languages.moon=Prism.languages.moonscript; +Prism.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}; +Prism.languages.n4js=Prism.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),Prism.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),Prism.languages.n4jsd=Prism.languages.n4js; +Prism.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}; +Prism.languages.nasm={comment:/;.*$/m,string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,label:{pattern:/(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,lookbehind:!0,alias:"function"},keyword:[/\[?BITS (?:16|32|64)\]?/,{pattern:/(^\s*)section\s*[a-z.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\r\n]*/i,/(?:CPU|DEFAULT|FLOAT).*$/m],register:{pattern:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,alias:"variable"},number:/(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-\/%<>=&|$!]/}; +Prism.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"property"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}; +!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism); +Prism.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}; +Prism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix; +Prism.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}; +Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec; +Prism.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}; +!function(E){E.languages.opencl=E.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),E.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var _={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};E.languages.insertBefore("c","keyword",_),E.languages.cpp&&(_["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},E.languages.insertBefore("cpp","keyword",_))}(Prism); +Prism.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}; +Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; +!function(e){var n=e.languages.parser=e.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});n=e.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:n.keyword,variable:n.variable,function:n.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:n.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:n.punctuation}}}),e.languages.insertBefore("inside","punctuation",{expression:n.expression,keyword:n.keyword,variable:n.variable,function:n.function,escape:n.escape,"parser-punctuation":{pattern:n.punctuation,alias:"punctuation"}},n.tag.inside["attr-value"])}(Prism); +Prism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal; +!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism); +Prism.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},Prism.languages.px=Prism.languages.pcaxis; +!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); +!function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism); +Prism.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}}); +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); +!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); +Prism.languages.processing=Prism.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),Prism.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}}); +Prism.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}; +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; +!function(e){var s=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism); +!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); +!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism); +!function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism); +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}; +!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(//g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(//g,(function(){return r}));r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); +Prism.languages.qore=Prism.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/}); +Prism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; +!function(t){var n=t.util.clone(t.languages.javascript),e="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function a(t,n){return t=t.replace(//g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(//g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(//g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a(""),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism); +!function(e){var a=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",a),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var t=e.languages.tsx.tag;t.pattern=RegExp("(^|[^\\w$]|(?=|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),Prism.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete Prism.languages.reason.function; +!function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.rpy=Prism.languages.renpy; +Prism.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}; +Prism.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}; +Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}; +!function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism); +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); +!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); +!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant; +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); +Prism.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}; +!function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism); +Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity; +!function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism); +Prism.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},Prism.languages.trig=Prism.languages.turtle; +Prism.languages.sparql=Prism.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),Prism.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),Prism.languages.rq=Prism.languages.sparql; +Prism.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}; +Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"]; +!function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:r,punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(Prism); +Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); +!function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism); +Prism.languages.t4=Prism.languages["t4-cs"]=Prism.languages["t4-templating"].createT4("csharp"); +Prism.languages.vbnet=Prism.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/}); +Prism.languages["t4-vb"]=Prism.languages["t4-templating"].createT4("vbnet"); +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +Prism.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:Prism.languages.yaml,alias:"language-yaml"}}; +Prism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}; +!function(e){e.languages.tt2=e.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),e.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism); +!function(n){function e(n,e){return RegExp(n.replace(//g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(//g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); +Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")})); +Prism.languages.vala=Prism.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),Prism.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:Prism.languages.vala}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}}); +!function(e){e.languages.velocity=e.languages.extend("markup",{});var n={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};n.variable.inside={string:n.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:n.number,boolean:n.boolean,punctuation:n.punctuation},e.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:n}},variable:n.variable}),e.languages.velocity.tag.inside["attr-value"].inside.rest=e.languages.velocity}(Prism); +Prism.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}; +Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; +Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; +Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; +Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; +Prism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}}); +Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; +!function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora}(Prism); +Prism.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}; +!function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); +!function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism); diff --git a/media/scripts/main.js b/media/scripts/main.js new file mode 100644 index 00000000..6d753527 --- /dev/null +++ b/media/scripts/main.js @@ -0,0 +1,57 @@ +new Vue({ + el: '#app', + data() { + return { + scrolled: false, + showToc: false, + showMenu: false, + } + }, + computed: { + text() { + return encodeURIComponent(document.title) + }, + url() { + return encodeURIComponent(window.location.href) + }, + }, + mounted() { + window.addEventListener('scroll', this.navOnScroll) + }, + methods: { + oepnUrl(url) { + window.open(url, '_blank') + }, + navOnScroll() { + if (window.scrollY > 20) { + this.scrolled = true + } else { + this.scrolled = false + } + }, + backToUp() { + window.scrollTo(0, 0) + }, + shareToTwitter() { + window.open( + `https://twitter.com/share?text=${this.text}&url=${this.url}`, + '_blank', + 'width=615,height=505' + ) + }, + shareToWeibo() { + window.open( + `https://service.weibo.com/share/share.php?title=${this.text}&url=${this.url}`, + '_blank', + 'width=615,height=505' + ) + }, + shareToTelegram() { + window.open( + `https://telegram.me/share/url?text=${this.text}&url=${this.url}`, + '_blank', + 'width=615,height=505' + ) + }, + }, +}) diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 00000000..7a095407 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,379 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 00000000..d3c53c28 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,391 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + GitHub访问慢的原因以及解决办法 + +

    +
    2022-07-16
    +
    + 注意:由于某些特殊原因,本文没有在CSDN上发布,因此这里是本文唯一可见的地址。 +前言 +相信大家工作时都难免会遇到。。。 + +$ git push +Error: Failed to connect to github.com port 443... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 258 A~Ex 题解 + +

    +
    2022-07-04
    +
    + D - Trophy +题目大意 +有一个游戏,由NNN个关卡组成。第iii个关卡由一个数对(Ai,Bi)(A_i,B_i)(Ai​,Bi​)组成。 +要通过一个关卡,你必须先花AiA_iAi​的时间看一次介绍。然后,用BiB_iBi​的时间打通... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + README - 账本 + +

    +
    2022-06-28
    +
    + https://github.com/GoodCoder666/AccountBook/blob/main/README.md + +AccountBook +*For English-speaking users: This project ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 254 A~E 题解 + +

    +
    2022-06-04
    +
    + A - Last Two Digits +题目大意 +给定正整数NNN,求NNN的后两位。 +100≤N≤999100\le N\le 999100≤N≤999 +输入格式 +NNN +输出格式 +输出NNN的后两位,注意输出可能有前导0。 +样例 + + + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 253 A~E 题解 + +

    +
    2022-05-29
    +
    + A - Median? +题目大意 +给定正整数a,b,ca,b,ca,b,c,判断bbb是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。 +1≤a,b,c≤1001\le a,b,c\le 1001≤a,b,c≤100 +输入格式... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 252 A~G 题解 + +

    +
    2022-05-22
    +
    + +前言 + +这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! + + +A - ASCII code +题目大意 +给定正整数NNN,输出ASCII码是NNN的字母。 +97≤N≤12297... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 250 C~E 题解 + +

    +
    2022-05-11
    +
    + C - Adjacent Swaps +题目大意 +NNN个球从左到右排成一列。开始时,从左往右的第iii个球上写着数字iii。 +请执行QQQ个操作,第iii个操作如下: + +令j= Nj=~Nj= N个球中写着数字xix_ixi​的球的位置 +如... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248)C~D 题解 + +

    +
    2022-04-17
    +
    + C - Dice Sum +题目大意 +有多少个整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)符合如下条件: + +1≤Ai≤M1\le A_i\le M1≤Ai​≤M +∑i=1NAi≤K\sum\lim... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + ARC138 B - 01 Generation 题解 + +

    +
    2022-04-14
    +
    + ARC138 B - 01 Generation +思路 +考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 245 A~E 题解 + +

    +
    2022-03-28
    +
    + A - Good morning +题目大意 +在同一天里,Takahashi在AAA时BBB分起床,Aoki在CCC时DDD分111秒起床,请问谁起床更早? +0≤A,C<240\le A,C<240≤A,C<24 +0≤B,D... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 00000000..f03cf6d9 --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,389 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 244 D~F 题解 + +

    +
    2022-03-20
    +
    + D - Swap Hats +题目大意 +有333个Takahashi,他们帽子的颜色分别为S1,S2,S3S_1,S_2,S_3S1​,S2​,S3​。 +我们现在想通过正好101810^{18}1018次操作,使得Si=TiS_i=T_iSi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【Python】72行实现代码行数统计,简单实用! + +

    +
    2022-03-15
    +
    + 0. 前言 +最近突然想知道自己总共写了多少行代码,于是做了这样一个小工具…… +1. 准备工作 +先考虑一下希望得到的效果: + + + +Language(语言) +Lines(代码行数) +Size(代码文件总大小) +Files(代码文件总数) + + + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 242 C~E 题解 + +

    +
    2022-03-08
    +
    + C - 1111gal password +题目大意 +给定正整数NNN,求符合下列条件的整数XXX的个数,对998244353998244353998244353取模: + +XXX是NNN位的正整数 +XXX的每一位数都在[1,9][1,9][1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解 + +

    +
    2022-03-05
    +
    + D - Sequence Query +题目大意 +我们有一个空序列AAA。请依次处理QQQ个命令,每个命令有三种类型,每种类型的格式如下: + +1 x:将xxx加入AAA(不去重) +2 x k:求在AAA的≤x\le x≤x的元素中,第kkk大... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Denso Create Programming Contest 2022 (AtCoder Beginner Contest 239) C~E 题解 + +

    +
    2022-02-25
    +
    + C - Knight Fork +题目大意 +在二维平面上是否有一个整数坐标点到(x1,y1)(x_1,y_1)(x1​,y1​)和(x2,y2)(x_2,y_2)(x2​,y2​)的欧几里得距离都是5\sqrt55​? +输入格式 +x1 y1 ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 205 A~E 题解 + +

    +
    2021-07-07
    +
    + A - kcal +题目大意 +我们有一种每100100100毫升含有AAA千卡热量的饮料。BBB毫升的这种饮料含有多少千卡热量? +0≤A,B≤10000\le A, B\le 10000≤A,B≤1000 +输入格式 +A BA~BA B +输出格... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-13
    +
    + A - Square Inequality +题目大意 +给定三个整数A,B,CA,B,CA,B,C。判断A2+B2<C2A^2+B^2<C^2A2+B2<C2是否成立。 +0≤A,B,C≤10000\le A,B,C\le 1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解 + +

    +
    2021-06-10
    +
    + A - Century +题目大意 +公元NNN年在第几个世纪中? + +一个世纪是由100100100个年份组成的一个区间。如,111世纪为[1,100][1,100][1,100]年,222世纪为[101,200][101,200][101,2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 204 A~E 题解 + +

    +
    2021-06-07
    +
    + A - Rock-paper-scissors +三个人玩石头剪刀布平局,其中两个出的分别是x,yx,yx,y,求另一个人出的。 +0≤x,y≤20\le x,y\le 20≤x,y≤2(0,1,20,1,20,1,2分别表示石头,剪刀,布) +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AISing Programming Contest 2021 (AtCoder Beginner Contest 202) A~E 题解 + +

    +
    2021-06-06
    +
    + A - Three Dice +一个人抛了三个骰子,它们的顶面分别是a,b,ca,b,ca,b,c。求它们的底面之和。 +这里用的骰子是标准骰子,即两个相对的面之和为777。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 00000000..32fd242c --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,412 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-03
    +
    + A - Chinchirorin +题目大意 +给定三个整数a,b,ca,b,ca,b,c,如果它们中有两个相等,输出另一个;否则,输出000。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +输入格式 +a b ca~b~c... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解 + +

    +
    2021-05-18
    +
    + A - Tiny Arithmetic Sequence +题目大意 +给定序列A=(A1,A2,A3)A=(A_1,A_2,A_3)A=(A1​,A2​,A3​)。能否将AAA重新排列,使得A3−A2=A2−A1A_3-A_2=A_2-A_1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 198 A~E 题解 + +

    +
    2021-04-13
    +
    + A - Div +题目大意 +两个男孩要分NNN颗糖。问一共有几种分法(每个男孩都必须分到糖)? +1≤N≤151\le N\le 151≤N≤15 +输入格式 +NNN +输出格式 +将答案输出为一个整数。 +样例 + + + +NNN +输出 + + + + +222 +1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 196 A~E 题解 + +

    +
    2021-04-01
    +
    + A - Difference Max +题目大意 +给定四个整数a,b,ca,b,ca,b,c和ddd。 +我们要选择两个整数xxx和yyy(a≤x≤ba\le x\le ba≤x≤b;c≤y≤dc\le y\le dc≤y≤d)。输出最大的x−... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Panasonic Programming Contest (AtCoder Beginner Contest 195) A~E 题解 + +

    +
    2021-03-25
    +
    + A - Health M Death +题目大意 +有一位魔术师,他正在打一个血量为HHH?的怪兽。 +当怪兽的血量是MMM的倍数时,魔术师能打败怪兽。 +魔术师能打败怪兽吗? +1≤M,H≤10001\le M,H\le 10001≤M,H≤100... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 194 A~E 题解 + +

    +
    2021-03-17
    +
    + A - I Scream +题目大意 +在日本,有如下四种冰淇淋产品: + +至少有15%15\%15%的milk solids和8%8\%8%的milk fat的产品称为“冰淇淋”; +至少有10%10\%10%的milk solids和3%3\%... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Caddi Programming Contest 2021 (AtCoder Beginner Contest 193) A~D 题解 + +

    +
    2021-03-08
    +
    + A - Discount +题目大意 +一件商品原价为AAA元,现价为BBB元,现价优惠了百分之几? +1≤B<A≤1051\le B<A\le 10^51≤B<A≤105 +输入格式 +A BA~BA B +输出格式 +输出答案(不加... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 192 A~D 题解 + +

    +
    2021-02-28
    +
    + A - Star +题目大意 +下一个大于XXX的100100100的倍数与XXX的差是多少? +1≤X≤1051\le X\le 10^51≤X≤105 +输入格式 +XXX +输出格式 +输出答案。 +样例 + + + +XXX +输出 + + + + +14014014... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 191 A~D 题解 + +

    +
    2021-02-09
    +
    + A - Vanishing Pitch +题目大意 +一个球的速度是V m/sV~\text{m/s}V m/s,它飞了TTT秒后会隐形,飞了SSS秒时会接触隐形。 +球在飞了DDD米后,人能看见它吗?输出Yes或者No。 +1≤V≤10001\l... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 190 A~D 题解 + +

    +
    2021-02-01
    +
    + A - Very Very Primitive Game +题目大意 +Takahashi和Aoki在玩一个游戏。 +游戏规则是这样的: + +最开始,Takahashi和Aoki分别有AAA和BBB颗糖。 +他们将轮流吃一颗糖,第一个无法吃糖的人算输... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/6/index.html b/page/6/index.html new file mode 100644 index 00000000..dab987de --- /dev/null +++ b/page/6/index.html @@ -0,0 +1,396 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 189 A~D 题解 + +

    +
    2021-01-25
    +
    + A - Slots +题目大意 +给定三个大写英文字母C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​,判断它们是否相同。 +输入格式 +C1C2C3C_1C_2C_3C1​C2​C3​ +输出格式 +如果C1,C2,C3C_1,C_2,C... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 177 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Don't be late +题目大意 +Takahashi要和Aoki见面。 +他们计划在距离Takahashi家DDD米的地方TTT分钟后见面。 +Takahashi将立即出门并以SSS米/分钟的速度朝见面地点走去。 +Takahashi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 188 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Three-Point Shot +题目大意 +有两个球队,分别得到XXX分和YYY分,问得分较少的球队能否在获得三分后超越对方。 +0≤X,Y≤1000\le X,Y\le 1000≤X,Y≤100 +X≠YX \ne YX​=Y +XX... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 187 A~D 题解 + +

    +
    2021-01-03
    +
    + A - Large Digits +题目大意 +给定两个三位整数AAA和BBB,求它们数位和的最大值。 +数位和:例如,123123123的数位和是1+2+3=61+2+3=61+2+3=6。 +100≤A,B≤999100\le A,B\le 9... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 173 A~D 题解 + +

    +
    2020-07-20
    +
    + A - Payment +题目大意 +如果使用价值100010001000元的纸币(假设有)支付NNN元,服务员会找多少钱? +1≤N≤100001\le N\le 100001≤N≤10000 +输入格式 +NNN +输出格式 +一行,即服务员找的钱数... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Anaconda Spyder点击无响应解决 + +

    +
    2020-07-12
    +
    + 问题分析 +可能是升级或卸载了spyder依赖的包,导致spyder无法正常运行。 +我升级了PyQt5,spyder要求PyQt5<5.13,而安装的最新版本为5.15,导致spyder启动时出现问题。 +解决方法 +打开Anaconda ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + pip速度太慢解决(使用清华镜像) + +

    +
    2020-07-12
    +
    + python的包管理工具pip速度太慢,经常下载时报错,可以使用清华镜像代替默认下载源。以下两种方法任何电脑都可以使用,演示电脑为Windows 10 版本1909。 +临时方法 +使用pip下载时,临时使用镜像(命令行): +pip insta... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 171 A~D 题解 + +

    +
    2020-06-22
    +
    + A - αlphabet +题目大意 +输入一个英文字母aaa,判断它是大写还是小写。 +输入格式 +aaa +输出格式 +如果aaa为小写,输出a; +如果aaa为大写,输出A。 +样例输入1 +B + +样例输出1 +A + +B为大写,所以输出A。 +样例输入2 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【python爬虫】从腾讯API爬取美国疫情数据+制表 + +

    +
    2020-06-03
    +
    + 最近(文章撰写时间为2020/6/1 18:40)疫情在中国情况好转,却在美国暴虐。 +本篇文章将爬取腾讯提供的美国疫情数据并制表。 +1. 爬取数据 +调用API接口 +接口:https://api.inews.qq.com/newsqa/v1/... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 168 C~D 题解 + +

    +
    2020-05-19
    +
    + 这次比赛的题名很特殊,是由符号+(+英文+)组成的 😃 +C - : (Colon) +题目大意 +在AAA时BBB分,长度为HHH厘米的时针和长度为MMM厘米的分针的顶点的距离是多少? +1≤A,B≤10001\le A, B\le 10001... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/7/index.html b/page/7/index.html new file mode 100644 index 00000000..a626b636 --- /dev/null +++ b/page/7/index.html @@ -0,0 +1,386 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + Python函数之lambda函数 + +

    +
    2020-04-21
    +
    + 温馨提示:如果读者没有学过def定义函数,请先看这里 +定义形式 +<函数名> = lambda <参数列表>: <返回值> + +等同于: +def <函数名>(<参数列表>): + ret... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之def定义函数 + +

    +
    2020-04-21
    +
    + 链接 +想研究Python函数?看这里 +函数怎样取名?看这里 +有参数的函数还可以怎么传参?看这里 +一、无参数函数 +结构 +def <函数名>(): # 强制要求 + <函数体> # 可省略 + return <返回值&... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【Python】对象(包括类、函数)取名方法 + +

    +
    2020-04-20
    +
    + 先上干货,通用的: +字母:A-Z a-z +下划线:_ +数字:0-9(注意:数字不能在开头) +理论上可以使用中文变量名,但强烈不建议使用。 +合法名字举例 +abcdef GoodCoder AD_fhrygfuigfr +A_a_007 __NA... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Eclipse安装包下载慢解决方法 + +

    +
    2020-04-10
    +
    + +最近开始学习Java,使用经典的Eclipse IDE,结果发现下载太慢…… + +问题分析 + +Eclipse的下载依赖于其他镜像,(在我这里)默认为朝鲜的镜像(可能在不同电脑中默认不同): + +点击Select Another Mirror:... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Eclipse Check For Updates总是检查不到更新-解决方法 + +

    +
    2020-04-08
    +
    + 最近想用流行的Java IDE —— Eclipse的Help -> Check For Updates更新Eclipse,结果总是说未找到更新: + +1. 检查是否有更新 +首先,访问Eclipse下载地址获得最新版本(目前为2020-... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 161D 题解 + +

    +
    2020-04-05
    +
    + 原题链接:洛谷链接;AtCoder链接 +思路 +每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第KKK次弹出的整数。 +注意事项 + +不用long long会WA! +上一位为000时下一位不能为−1-1−1!(要... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Java中的整数移位运算符 + +

    +
    2020-04-04
    +
    + 对于<<, >>两种运算符,可以这样说: +a<<b=a∗2ba<<b=a*2^ba<<b=a∗2b +a>>b=a/2ba>>b=a/2^ba>>... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java final关键字语法 + +

    +
    2020-04-01
    +
    + 一、final类和方法 +英文文档 +原文:Java官方文档 -> Writing Final Classes and Methods +You can declare some or all of a class's methods fi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java.lang.IllegalArgumentException: input == null! 解决方法 + +

    +
    2020-03-29
    +
    + 最近在编一个Java游戏,处理图片时遇到如下问题: +完整错误信息 +Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: in... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + tkinter Text edit_undo()/edit_redo() 没反应解决方法 + +

    +
    2020-03-24
    +
    + 问题 +tkinter.Text调用edit_undo()和edit_redo()没反应。 +问题分析 +这是因为没有设置Text的undo参数为True,设置后才能“激活”edit_undo()和edit_redo()。 +这个错误难发现是因为它... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 00000000..f0de4d46 --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,434 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解 + +

    +
    2020-03-16
    +
    + 题目大意 +输入三个整数aaa,bbb,ccc,如果 a+b<c\sqrt a + \sqrt b < \sqrt ca​+b​<c​ 成立,输出Yes,否则输出No。 +样例 +输入 #1 +2 3 9 + +输出 #1 +No + +2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之*[参数名]和**[参数名]的用处 + +

    +
    2020-03-03
    +
    + 一、*[参数名] +调用 +合法调用 +普通调用 +*参数名一般写成*args, 如: +def func(*args): + print(args) + +可以试着调用func: +>>> func(1) +(1,) +>>>... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + CodeForces Round #621 ABC (1307A+1307B+1307C) 题解 + +

    +
    2020-02-22
    +
    + A. Cow and Haybales +题面 +The USA Construction Operation (USACO) recently ordered Farmer John to arrange a row of n haybale... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + js产生随机数 + +

    +
    2020-02-09
    +
    + +产生[0,1)[0,1)[0,1)之间的随机实数,即0≤Math.random()<10\le\text{Math.random()}<10≤Math.random()<1 + +Math.random() +// 返回值样例... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序报错:Component is not found in path "components/comp/comp.js" + +

    +
    2020-02-05
    +
    + 完整错误 +jsEnginScriptError: +Component is not found in path "components/comp/comp.js" (using by pages/index/index)... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序 云数据库 Collection/Query .orderBy 用法 + +

    +
    2020-02-04
    +
    + Collection.orderBy / Query.orderBy +指定查询排序条件 +方法签名如下: +function orderBy(fieldName: string, order: string): Collection | Que... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 为什么微信小程序设置的onPullDownRefresh无效 + +

    +
    2020-02-04
    +
    + 因为仅有onPullDownRefresh是不行的,需要配置: + +如果是单个页面需要onPullDownRefresh,在对应页面的json文件中设置"enablePullDownRefresh": true,如: + +{... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序-云开发-数据库 报错:-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +

    +
    2020-02-03
    +
    + 微信小程序-云开发-数据库 报错: +-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +原因: +不能设置_openid,它是云服务器根据用户的openID自动设置的... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 使用云函数获取小程序用户openId + +

    +
    2020-02-03
    +
    +

    如何使用云函数获取小程序用户openId?步骤如下:

    +
      +
    • +

      如未开通云开发,请看这篇

      +
    • +
    • +

      基础库版本需为2.3.3以上,建议设为最新版本

      +
    • +
    • +

      新建云函数:
      +

      +
    • +
    • +

      右击cloudfunctions,选择新建Node.js云函数

      +
    • +
    • +

      输入login

      +
        +
      • 现在云开发控制台的样子:
        +
      • +
      +
    • +
    • +

      此函数会保存openID至本地存储,并在出错时调用error

      +
    • +
    +
    function saveOpenID(error) {
    +  if (!wx.getStorageSync('openID')) {
    +    wx.cloud.callFunction({
    +      name: 'login',
    +      data: {},
    +      success: res => {
    +        console.log('Got user openid: ', res.result.openid)
    +        wx.setStorageSync('openID', res.result.openid)
    +      },
    +      fail: err => {
    +        console.error(err)
    +        error()
    +      }
    +    })
    +  }
    +}
    +
    + +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 之前的小程序没有使用云开发,现在需要使用云函数怎么办呢? + +

    +
    2020-02-03
    +
    + 前提条件:基础库版本需为2.3.3以上,建议设为最新版本 +如果是升级自己的项目到云开发,需要做以下修改: + + +点击云开发按钮,按钮位置如下: + + + +开通小程序·云开发 + + +将原来的代码放到 miniprogram 目录 + + +新增 cloud... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/page/9/index.html b/page/9/index.html new file mode 100644 index 00000000..572b0ea8 --- /dev/null +++ b/page/9/index.html @@ -0,0 +1,272 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + wx.showToast中的一个问题 + +

    +
    2020-02-02
    +
    + wx.showToast中的一个问题 +wx.showToast({ + title: '成功', + icon: 'fail', + duration: 2000, + success: func +}) + +wx.showToast({ + title... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 使用微信小程序-云开发时报错: Error: errCode: -401003 api parameter type error | errMsg: parameter.data should ... + +

    +
    2020-02-02
    +
    + 错误 +Uncaught (in promise) thirdScriptError +errCode: -401003 api parameter type error | errMsg: parameter.data should be o... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + js获取1970.1.1到当前的毫秒数 + +

    +
    2020-01-31
    +
    + Date.now() // 获取1970.1.1到当前的毫秒数 +Date.UTC(2000, 1, 1) // 获取1970.1.1到2000.1.1的毫秒数 + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 在微信小程序中做自己的数字键盘 + +

    +
    2020-01-31
    +
    + 为什么要自制键盘? +我最近在开发一款微信小程序,现在需要用户输入一个数字。 +使用系统键盘带来的不便 +如果使用系统键盘,有以下几个问题: + +数字键太小,不方便; +无法阻止用户输入不合法字符(如:“&”); +小数点在一些手机上很难找到;... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + License (GPLv3) + +

    +
    2020-01-02
    +
    + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + License (MIT) + +

    +
    2020-01-02
    +
    + MIT License +Copyright (c) 2024 Stanley +Permission is hereby granted, free of charge, to any person obtaining a copy +of t... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + + diff --git a/post/2048plus-privacy/index.html b/post/2048plus-privacy/index.html new file mode 100644 index 00000000..1f95787b --- /dev/null +++ b/post/2048plus-privacy/index.html @@ -0,0 +1,373 @@ + + + + + +《2048 - Plus》益智小游戏隐私策略声明 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 《2048 - Plus》益智小游戏隐私策略声明 +

    + +
    +
    + 2022-02-10 · 2 min read +
    + + + + 2048 Plus + + +
    +

    《2048 - Plus》是一款益智小游戏。它的设计思想源自经典的数字小游戏2048。本隐私策略声明函盖了用户对于该应用程序中所有内容的使用。

    +
      +
    1. +

      免责声明
      +您在使用本应用过程中,请遵守《中华人民共和国宪法》、《中华人民共和国网络安全法》、《中华人民共和国知识产权法》,以及相关法律法规的各项规定。严禁将应用用于任何非法用途,一切因用户(主观或客观上)使用不当所带来的法律问题,开发者一概不负责。

      +
    2. +
    3. +

      网络访问
      +本应用不访问网络,不会上传任何用户文件与数据,应用不包含任何捆绑插件,也不会后台下载任何附加的安装包。

      +
    4. +
    5. +

      无干扰内容
      +本应用不会向您发送任何无意义的通知,不存在任何第三方的推广信息,不会在后台收集任何用户信息。

      +
    6. +
    7. +

      多媒体设备
      +本应用不需要访问您设备上的多媒体设备(比如摄像头),应用不会收集任何设备制造厂商信息,也不会记录任何设备使用过程中产生的个人信息。

      +
    8. +
    9. +

      第三方组件声明
      +本应用不调用任何第三方扩展组件。

      +
    10. +
    11. +

      变更说明
      +本隐私策略一旦发生变更,会在该页面及时更新,恕不另行通知。本策略的最终解析权归开发者所有。

      +
    12. +
    13. +

      接受本策略
      +当您从 Microsoft 应用商店安装并使用应用,即表明您已同意该策略的各项声明。

      +
    14. +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc161/index.html b/post/abc161/index.html new file mode 100644 index 00000000..59fd9883 --- /dev/null +++ b/post/abc161/index.html @@ -0,0 +1,403 @@ + + + + + +AtCoder Beginner Contest 161D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 161D 题解 +

    + +
    +
    + 2020-04-05 · 1 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    原题链接:洛谷链接AtCoder链接

    +

    思路

    +

    每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第KK次弹出的整数。

    +

    注意事项

    +
      +
    • 不用long longWA
    • +
    • 上一位为00时下一位不能为1-1!(要特判)
    • +
    • 上一位为99时下一位不能为1010!(也要特判)
    • +
    +

    代码

    +
    #include <cstdio>
    +#include <queue>
    +using namespace std;
    +
    +typedef long long LL;
    +
    +int main(int argc, char** argv)
    +{
    +	int k;
    +	scanf("%d", &k);
    +	queue<LL> q;
    +	for(int i=1; i<10; i++) q.push(i);
    +	while(true)
    +	{
    +		LL x = q.front(); q.pop();
    +		if(--k == 0)
    +		{
    +			printf("%lld\n", x);
    +			return 0;
    +		}
    +		int r = x % 10LL;
    +		x *= 10LL;
    +		x += r;
    +		if(r > 0) q.push(x - 1);
    +		q.push(x);
    +		if(r < 9) q.push(x + 1);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc168/index.html b/post/abc168/index.html new file mode 100644 index 00000000..069a0242 --- /dev/null +++ b/post/abc168/index.html @@ -0,0 +1,498 @@ + + + + + +AtCoder Beginner Contest 168 C~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 168 C~D 题解 +

    + +
    +
    + 2020-05-19 · 5 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    这次比赛的题名很特殊,是由符号+(+英文+)组成的 😃

    +

    C - : (Colon)

    +

    题目大意

    +

    AABB分,长度为HH厘米的时针和长度为MM厘米的分针的顶点的距离是多少?
    +1A,B10001\le A, B\le 1000
    +0H110\le H\le 11
    +0M590\le M\le 59
    +(浮点数精度误差最多允许10910^{-9}

    +

    输入格式

    +

    A B H MA~B~H~M

    +

    输出格式

    +

    一行,即两点之间的距离。

    +

    样例

    +

    样例输入1

    +
    3 4 9 0
    +
    +

    样例输出1

    +
    5.00000000000000000000
    +
    +距离5cm +

    样例输入2

    +
    3 4 10 40
    +
    +

    样例输出2

    +
    4.56425719433005567605
    +
    +距离约4.56425cm +

    分析

    +

    其实是给定一个三角形,知道两条边和它们之间的夹角θ\theta(英文为theta),求另一条边的长度(设为C)。可以使用公式:

    +

    C2=A2+B22ABcosθC^2=A^2+B^2-2AB\cos\theta +

    +

    需要注意的是:C/C++中的cos函数的参数应是弧度,如θ\theta是角度请使用cos(theta / 180 * PI)

    +

    代码

    +

    终于上代码了

    +
    #include <cstdio>
    +#include <cmath>
    +#define PI 3.1415926535897932
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int a, b, h, m;
    +	scanf("%d%d%d%d", &a, &b, &h, &m);
    +	int mangle = m * 6;
    +	double hangle = h * 30 + m * 0.5;
    +	double theta  = abs(hangle - mangle);
    +	if(theta > 180) theta = 360 - theta;
    +	theta = theta / 180 * PI;
    +	printf("%.13lf\n", sqrt(double(a * a + b * b) - 2.0 * a * b * cos(theta)));
    +	return 0;
    +}
    +
    +
    +

    D - . . (Double Dots)

    +

    题目大意

    +

    有一个山洞,它有NN个房间和MM条通道。
    +房间的编号是11 ~ NN,通道的编号是11 ~ MM,每条通道双向连接AiA_iBiB_i (1iM1\le i\le M)。房间11是山洞的出口。
    +现在要给每个房间标一个路标,指向一个和本房间被通道连接的房间。
    +每个房间(房间11除外)如果一直按照路标走向指示的房间,那么走的路径一定是最短的到出口的路径。
    +2N1052\le N\le 10^5
    +1M21051\le M\le 2 * 10^5
    +1Ai,BiN1\le A_i, B_i\le N (1iM1\le i\le M)
    +AiBiA_i≠B_i (1iM1\le i\le M)

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +\vdots
    +AM BMA_M~B_M

    +

    输出格式

    +

    如果无解,输出No
    +如果有解,第一行输出Yes,第ii行输出房间ii的路标指向的房间序号。(2iN2\le i\le N)

    +

    分析

    +

    明显bfs题目..
    +说明一点:如果给定山洞不连通,则无解。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#include <queue>
    +#define UNVISITED -1
    +#define maxn 100005
    +using namespace std;
    +
    +typedef pair<int, int> pii;
    +
    +vector<int> G[maxn];
    +int par[maxn];
    +
    +int main(int argc, char** argv)
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<n; i++) par[i] = UNVISITED;
    +	for(int i=0; i<m; i++)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[--x].push_back(--y);
    +		G[y].push_back(x);
    +	}
    +	queue<pii> q;
    +	q.push(pii(0, -1));
    +	while(!q.empty())
    +	{
    +		int room = q.front().first, p = q.front().second;
    +		q.pop();
    +		if(par[room] != UNVISITED) continue;
    +		par[room] = p;
    +		for(int i=0; i<G[room].size(); i++)
    +			q.push(pii(G[room][i], room));
    +	}
    +	for(int i=1; i<n; i++)
    +		if(par[i] == UNVISITED)
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +	puts("Yes");
    +	for(int i=1; i<n; i++) printf("%d\n", par[i] + 1);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc171/index.html b/post/abc171/index.html new file mode 100644 index 00000000..e10643fe --- /dev/null +++ b/post/abc171/index.html @@ -0,0 +1,707 @@ + + + + + +AtCoder Beginner Contest 171 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 171 A~D 题解 +

    + +
    +
    + 2020-06-22 · 6 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - αlphabet

    +

    题目大意

    +

    输入一个英文字母aa,判断它是大写还是小写。

    +

    输入格式

    +

    aa

    +

    输出格式

    +

    如果aa为小写,输出a
    +如果aa为大写,输出A

    +

    样例输入1

    +
    B
    +
    +

    样例输出1

    +
    A
    +
    +

    B为大写,所以输出A

    +

    样例输入2

    +
    a
    +
    +

    样例输出2

    +
    a
    +
    +

    a为小写,所以输出a

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	char a = getchar();
    +	if('a' <= a && a <= 'z') putchar('a');
    +	else putchar('A');
    +	return 0;
    +}
    +
    +
    +

    B - Mix Juice

    +

    题目大意

    +

    给定一个长度为NN的数组p1,p2,p3,...,pNp_1, p_2, p_3, ..., p_N,要求从其中选出KK个数,使它们的和最小。

    +

    1KN10001\le K\le N\le 1000
    +1pi10001\le p_i\le 1000 (1iN1\le i\le N)

    +

    输入格式

    +

    NKN K
    +p1 p2 p3  pNp_1~p_2~p_3~\dots~p_N

    +

    输出格式

    +

    一行,即最小的和。

    +

    样例输入1

    +
    5 3
    +50 100 80 120 80
    +
    +

    最小的和是50+80+80=21050+80+80=210

    +

    样例输出1

    +
    210
    +
    +

    B为大写,所以输出A

    +

    样例输入2

    +
    1 1
    +1000
    +
    +

    样例输出2

    +
    1000
    +
    +

    因为只有一个数,所以最小的和就是10001000。(此注释为笔者所加)

    +

    代码

    +

    题目要求和最小,其实只要找到数组中最小的KK个数字的和即可。可以使用<algorithm>库中的sort()函数对p数组进行升序排序,再取前KK个数字之和作为结果输出。

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 1005
    +using namespace std;
    +
    +int a[maxn];
    +
    +int main(int argc, char** argv)
    +{
    +	int n, k, sum = 0;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	sort(a, a + n);
    +	for(int i=0; i<k; i++)
    +		sum += a[i];
    +	printf("%d\n", sum);
    +	return 0;
    +}
    +
    +
    +

    C - One Quadrillion and One Dalmatians

    +

    题目大意

    +

    100000000000000110000000000000011015+110^{15}+1)只狗,它们的名字分别为:
    +a, b, .., z, aa, ab, .., az, ba, bb, .., bz, .., za, zb, .., zz, aaa, aab, .., aaz, aba, abb, .., abz, ., zzz, aaaa, ..
    +问题:第NN只狗的名字是什么?

    +

    1N1015+11\le N\le 10^{15}+1

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    一行,即第NN只狗的名字。

    +

    样例

    +

    样例较多,为了节省文章篇幅,所以直接整合成表格:

    + + + + + + + + + + + + + + + + + + + + + +
    输入输出
    2b
    27aa
    123456789jjddja
    +

    代码

    +

    其实就是把十进制转换成二十六进制:

    +
    #include <cstdio>
    +#define BASE 26LL
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	char s[12];
    +	int cnt = 0;
    +	long long n;
    +	scanf("%lld", &n);
    +	while(n > 0)
    +	{
    +		n --;
    +		s[cnt++] = n % BASE + 'a';
    +		n /= BASE;
    +	}
    +	for(int i=cnt-1; i>=0; i--) putchar(s[i]);
    +	putchar('\n');
    +	return 0;
    +}
    +
    +
    +

    D - Replacing

    +

    题目大意

    +

    有一个数组A1,A2,,ANA_1, A_2, \dots, A_N
    +执行如下QQ个操作:

    +
      +
    • 在第ii个操作中,将数组中所有的BiB_i替换成CiC_i
    • +
    • 输出操作后AA中所有数之和(记为SiS_i)。
    • +
    +

    1N,Q,Ai,Bi,Ci1051\le N, Q, A_i, B_i, C_i\le 10^5 (1iN1\le i\le N)
    +BiCiB_i\ne C_i

    +

    输入格式

    +

    NN
    +A1 A2 ... ANA_1~A_2~...~A_N
    +QQ
    +B1 C1B_1~C_1
    +B2 C2B_2~C_2
    +::
    +BQ CQB_Q~C_Q

    +

    输出格式

    +

    S1S_1
    +S2S_2
    +::
    +SNS_N

    +

    样例输入1

    +
    4
    +1 2 3 4
    +3
    +1 2
    +3 4
    +2 4
    +
    +

    样例输出1

    +
    11
    +12
    +16
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    时间数组AA
    开始{1,2,3,4}\{1, 2, 3, 4\}
    i=1i=1{2,2,3,4}\{2, 2, 3, 4\}
    i=2i=2{2,2,4,4}\{2, 2, 4, 4\}
    i=3i=3{4,4,4,4}\{4, 4, 4, 4\}
    +

    样例输入2

    +
    4
    +1 1 1 1
    +3
    +1 2
    +2 1
    +3 5
    +
    +

    注意:BiB_i不一定存在列表中。

    +

    样例输出2

    +
    8
    +4
    +4
    +
    +

    样例输入3

    +
    2
    +1 2
    +3
    +1 100
    +2 100
    +100 1000
    +
    +

    样例输出3

    +
    102
    +200
    +2000
    +
    +

    代码

    +

    可以用数组记录AA中每个值出现的次数。这里由于题目原因,还需要记录数组AA每个数之和。

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +typedef long long LL;
    +
    +int cnt[maxn];
    +LL sum = 0;
    +
    +inline LL s(const LL& i)
    +{
    +	return cnt[i] * i;
    +}
    +
    +int main(int argc, char** argv)
    +{
    +	int n, q;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int t;
    +		scanf("%d", &t);
    +		sum += t;
    +		cnt[t] ++;
    +	}
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		sum -= s(x) + s(y);
    +		cnt[y] += cnt[x];
    +		cnt[x] = 0;
    +		sum += s(y);
    +		printf("%lld\n", sum);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc173/index.html b/post/abc173/index.html new file mode 100644 index 00000000..cfbf8293 --- /dev/null +++ b/post/abc173/index.html @@ -0,0 +1,736 @@ + + + + + +AtCoder Beginner Contest 173 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 173 A~D 题解 +

    + +
    +
    + 2020-07-20 · 8 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Payment

    +

    题目大意

    +

    如果使用价值10001000元的纸币(假设有)支付NN元,服务员会找多少钱?

    +

    1N100001\le N\le 10000

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    一行,即服务员找的钱数。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    输入输出
    1900100
    30000
    +

    分析

    +

    特判:
    +如果NN除以10001000能整除,那么不需要找钱,输出00
    +如果有余,输出1000(nmod1000)1000 - (n\mod1000)

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	scanf("%d", &n);
    +	if(n % 1000 == 0) puts("0");
    +	else printf("%d\n", 1000 - n % 1000);
    +	return 0;
    +}
    +
    +
    +

    B - Judge Status Summary

    +

    题目大意

    +

    某人完成了某道算法竞赛题,有ACWATLERE四种结果(status)。题目有NN个测试样例,测试结果分别为S1,S2,,SNS_1, S_2, \dots, S_N,请分别统计并输出ACWATLERE的个数。(格式详见输出格式)

    +

    1N1051\le N\le 10^5
    +SiS_iACWATLERE

    +

    输入格式

    +

    NN
    +S1S_1
    +S2S_2
    +::
    +SNS_N

    +

    输出格式

    +
    AC x [AC的个数]
    +WA x [WA的个数]
    +TLE x [TLE的个数]
    +RE x [RE的个数]
    +
    +

    注意:这里的“乘号”不是“×”,而是英文字母“x”!

    +

    样例

    +

    样例输入1

    +
    6
    +AC
    +TLE
    +AC
    +AC
    +WA
    +TLE
    +
    +

    样例输出1

    +
    AC x 3
    +WA x 1
    +TLE x 2
    +RE x 0
    +
    +

    ACWATLERE分别有3,1,2,03, 1, 2, 0个。

    +

    样例输入2

    +
    10
    +AC
    +AC
    +AC
    +AC
    +AC
    +AC
    +AC
    +AC
    +AC
    +AC
    +
    +

    样例输出2

    +
    AC x 10
    +WA x 0
    +TLE x 0
    +RE x 0
    +
    +

    他全都AC了……

    +

    分析

    +

    要统计个数,可以用别的方法,但我个人喜欢偷懒,使用了map(似乎大材小用了……)

    +

    代码

    +
    #include <iostream>
    +#include <string>
    +#include <map>
    +using namespace std;
    +
    +map<string, int> cnt;
    +
    +int main(int argc, char** argv)
    +{
    +	ios::sync_with_stdio(false);
    +	int n;
    +	cin>>n;
    +	for(int i=0; i<n; i++)
    +	{
    +		string s;
    +		cin>>s;
    +		cnt[s] ++;
    +	}
    +	cout<<"AC x "<<cnt["AC"]<<endl;
    +	cout<<"WA x "<<cnt["WA"]<<endl;
    +	cout<<"TLE x "<<cnt["TLE"]<<endl;
    +	cout<<"RE x "<<cnt["RE"]<<endl;
    +	return 0;
    +}
    +
    +
    +

    C - H and V

    +

    题目大意

    +

    给定HHWW列的方格。在第iijj列(1iH1\le i\le H, 1jW1\le j\le W)的方格是cic_i,_,j_j。它可能是#(黑色)或.(白色)。
    +可以选某些行和列(都可以不选),将行和列上的方格全部涂成红色。

    +

    给定整数KK。有多少种选法使图中只剩KK个黑方格?

    +

    1H,W61\le H, W\le 6
    +1KHW1\le K\le HW
    +cic_i,_,j_j#.

    +

    输入格式

    +

    H W KH~W~K
    +c1,1 c1,2  c1,Wc_{1,1}~c_{1,2}~\dots~c_{1,W}
    +c2,1 c2,2  c2,Wc_{2,1}~c_{2,2}~\dots~c_{2,W}
    +\vdots
    +cH,1 cH,2  c1,Wc_{H,1}~c_{H,2}~\dots~c_{1,W}

    +

    输出格式

    +

    一行,即符合条件的选法数量。

    +

    样例

    +

    样例输入1

    +
    2 3 2
    +..#
    +###
    +
    +

    样例输出1

    +
    5
    +
    +

    有五种方法:

    +
      +
    • 11行和第11
    • +
    • 11行和第22
    • +
    • 11行和第33
    • +
    • 1122
    • +
    • 33
    • +
    +

    样例输入2

    +
    2 3 4
    +..#
    +###
    +
    +

    样例输出2

    +
    1
    +
    +

    只有一种方法:啥也不干!

    +

    样例输入3

    +
    2 2 3
    +##
    +##
    +
    +

    样例输出3

    +
    0
    +
    +

    无解。

    +

    样例输入4

    +
    6 6 8
    +..##..
    +.#..#.
    +#....#
    +######
    +#....#
    +#....#
    +
    +

    博主提示:这是最大的数据,如果程序在本地运行此样例没有超时,则提交后不会TLE!

    +

    样例输出4

    +
    208
    +
    +

    分析

    +

    本题没有巧妙的方法,且数据范围较小,所以使用二进制法枚举行和列。
    +因为输入颜色只有黑或白,所以题目中“涂成红色”只要涂成白色(.)即可。

    +

    代码

    +
    #include <cstdio>
    +#include <cstring>
    +#define maxn 6
    +using namespace std;
    +
    +char c[maxn][maxn];
    +int h, w, k;
    +int cnt = 0;
    +
    +int main(int argc, char** argv)
    +{
    +	scanf("%d%d%d", &h, &w, &k);
    +	for(int i=0; i<h; i++)
    +		scanf("%s", c[i]);
    +	int m1 = 1 << h, m2 = 1 << w, ans = 0;
    +	for(int hs=0; hs<m1; hs++)
    +		for(int ws=0; ws<m2; ws++)
    +		{
    +			char tmp[maxn][maxn]; // 不能修改原数组,所以复制一个数组
    +			memcpy(tmp, c, sizeof(c));
    +			for(int i=0; i<h; i++) // 行
    +				if(hs & (1 << i)) for(int j=0; j<w; j++) // 列
    +					tmp[i][j] = '.';
    +			for(int i=0; i<w; i++) // 列
    +				if(ws & (1 << i)) for(int j=0; j<h; j++) // 行
    +					tmp[j][i] = '.'; // 注意:绝对不能写成tmp[i][j]!
    +			int cnt = 0;
    +			for(int i=0; i<h; i++)
    +				for(int j=0; j<w; j++) if(tmp[i][j] == '#')
    +					cnt ++;
    +			if(cnt == k) ans ++;
    +		}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Chat in a Circle

    +

    题目大意

    +

    NN个人要在某地会和,编号为ii的人的友情值为整数AiA_i。这些人要围成一圈,每人到达该地后会在某个位置插入圈子。每个人的舒适度是入圈时相邻两个人的友情值中较小的一个(第一个人的舒适度为00)。现在,由你决定他们的入圈顺序和插入位置,问:NN个人的最大舒适度之和是多少?

    +

    2N2×1052\le N\le 2\times10^5
    +1Ai1091\le A_i\le 10^9

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出格式

    +

    一行,即NN个人的最大舒适度之和。

    +

    样例

    +

    样例输入1

    +
    4
    +2 2 1 3
    +
    +

    样例输出1

    +
    7
    +
    +

    最大的舒适度之和为0+3+2+2=70+3+2+2=7
    +舒适度

    +

    样例输入2

    +
    7
    +1 1 1 1 1 1 1
    +
    +

    样例输出2

    +
    6
    +
    +

    分析

    +

    贪心算法。先从大到小排序(这是顺序),再将每个人在舒适度最大的地方入圈。
    +priority_queue搞定。

    +

    代码

    +
    #include <cstdio>
    +#include <queue>
    +#include <algorithm>
    +#define maxn 200005
    +using namespace std;
    +
    +int a[maxn], n;
    +
    +struct Position
    +{
    +	int lf, rf, comfort;
    +	inline Position(int l, int r)
    +	{
    +		lf = l, rf = r;
    +		comfort = min(l, r);
    +	}
    +	inline bool operator<(const Position& p) const
    +	{
    +		return comfort < p.comfort;
    +	}
    +};
    +
    +priority_queue<Position> q;
    +
    +inline bool cmp(int x, int y) {return x > y;}
    +
    +int main(int argc, char** argv)
    +{
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	sort(a, a + n, cmp);
    +	q.push(Position(a[0], a[1]));
    +	long long res = a[0];
    +	for(int i=2; i<n; i++)
    +	{
    +		Position p = q.top();
    +		if(q.size() > 1) q.pop();
    +		res += p.comfort;
    +		q.push(Position(a[i], p.lf));
    +		q.push(Position(a[i], p.rf));
    +	}
    +	printf("%lld\n", res);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc177/index.html b/post/abc177/index.html new file mode 100644 index 00000000..f3441c61 --- /dev/null +++ b/post/abc177/index.html @@ -0,0 +1,714 @@ + + + + + +AtCoder Beginner Contest 177 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 177 A~D 题解 +

    + +
    +
    + 2021-01-13 · 8 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Don't be late

    +

    题目大意

    +

    Takahashi要和Aoki见面。
    +他们计划在距离Takahashi家DD米的地方TT分钟后见面。
    +Takahashi将立即出门并以SS米/分钟的速度朝见面地点走去。
    +Takahashi能按时到达吗?

    +

    1D100001\le D\le 10000
    +1T100001\le T\le 10000
    +1S100001\le S\le 10000

    +

    输入格式

    +

    D T SD~T~S

    +

    输出格式

    +

    如果Takahashi提前或准时到达此地,输出Yes;否则输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DTS输出
    10001580Yes
    200020100Yes
    1000011No
    +

    分析

    +

    判断DST\frac D S\le T(简化后为 TSDTS\ge D)即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int d, t, s;
    +	scanf("%d%d%d", &d, &t, &s);
    +	puts(t * s >= d? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Substring

    +

    题目大意

    +

    给你两个字符串SSTT
    +请你修改SS中的一些字符(可以不修改)使得TTSS的字串。
    +至少需要修改多少个字符?
    +子串:如,xxxyxxxy的子串,但不是xxyxx的子串。

    +

    1TS10001\le |T|\le |S|\le 1000
    +SSTT都由小写英文字母组成。

    +

    输入格式

    +

    S TS~T

    +

    输出格式

    +

    一行,即至少需要修改的字符个数。

    +

    样例

    +

    样例输入1

    +
    cabacc
    +abc
    +
    +

    样例输出1

    +
    1
    +
    +cabacc-abc +

    样例输入2

    +
    codeforces
    +atcoder
    +
    +

    样例输出2

    +
    6
    +
    +codeforces-atcoder-sample +

    分析

    +

    我们只要将TTSS中滚动匹配,寻找不同的字母数量的最小值即可。

    +

    代码

    +

    其实这就是枚举 😃
    +注意:如果按下面的代码写,最开始一定要特判SSTT长度相等的情况!

    +
    #include <cstdio>
    +#define maxn 1005
    +using namespace std;
    +
    +char s[maxn], t[maxn];
    +
    +int main(int argc, char** argv)
    +{
    +	scanf("%s%s", s, t);
    +	int tlen = 0, ans = maxn;
    +	for(; t[tlen]; tlen++);
    +	if(s[tlen] == '\0')
    +	{
    +		ans = 0;
    +		for(int i=0; i<tlen; i++)
    +			if(s[i] != t[i])
    +				ans ++;
    +		printf("%d\n", ans);
    +		return 0;
    +	}
    +	for(int i=0; s[i+tlen]; i++)
    +	{
    +		int cnt = 0;
    +		for(int j=0; j<tlen; j++)
    +			if(s[i + j] != t[j])
    +				cnt ++;
    +		if(cnt < ans) ans = cnt;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    C - Sum of product of pairs

    +

    题目大意

    +

    给定NN个整数A1,A2,,ANA_1,A_2,\dots,A_N
    +输出i=1N1j=i+1NAiAjmod(109+7){\sum\limits_{i=1}^{N-1}\sum\limits_{j=i+1}^NA_iA_j} \mod {(10^9+7)},即符合1i<jN1\le i \lt j\le N的所有(i,j)(i,j)AiAjA_iA_j的和,对(109+7)(10^9 + 7)取模。

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出格式

    +

    输出一行,即i=1N1j=i+1NAiAjmod(109+7){\sum\limits_{i=1}^{N-1}\sum\limits_{j=i+1}^NA_iA_j} \mod {(10^9+7)}

    +

    样例

    +

    样例输入1

    +
    3
    +1 2 3
    +
    +

    样例输出1

    +
    11
    +
    +

    1×2+1×3+2×3=111\times2+1\times3+2\times3=11

    +

    样例输入2

    +
    4
    +141421356 17320508 22360679 244949
    +
    +

    样例输出2

    +
    437235829
    +
    +

    不要忘记对(109+7)(10^9 + 7)取模!

    +

    分析

    +

    我们需要将题目中的公式转化一下:

    +

    i=1N1j=i+1NAiAjmod(109+7){\sum\limits_{i=1}^{N-1}\sum\limits_{j=i+1}^NA_iA_j} \mod {(10^9+7)} +

    +

    (i=2Nj=0i1AiAj)mod(109+7){(\sum\limits_{i=2}^{N}\sum\limits_{j=0}^{i-1}A_iA_j)} \mod {(10^9+7)} +

    +

    i=2NAi(j=0i1Aj)mod(109+7){\sum\limits_{i=2}^{N}A_i(\sum\limits_{j=0}^{i-1}A_j)} \mod {(10^9+7)} +

    +

    这时,我们只需循环遍历ii,再设置一个变量记录j=0i1Aj\sum\limits_{j=0}^{i-1}A_j即可。

    +

    代码

    +

    可以输入时直接处理。
    +虽然要取模,但是还要使用long long

    +
    #include <cstdio>
    +#define maxn 200005
    +#define MOD 1000000007LL
    +using namespace std;
    +
    +typedef long long LL;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	LL sum, res = 0LL;
    +	scanf("%d%lld", &n, &sum);
    +	while(--n) // 循环 (n-1) 次
    +	{
    +		LL x;
    +		scanf("%lld", &x);
    +		res += sum * x;
    +		sum += x;
    +		res %= MOD, sum %= MOD;
    +	}
    +	printf("%lld\n", res);
    +	return 0;
    +}
    +
    +
    +

    D - Friends

    +

    题目大意

    +

    NN个人,编号分别为11NN
    +给你MM个关系,第ii个关系为“AiA_i号人和BiB_i号人是朋友。”(关系可能会重复给出)。
    +如果XXYY是朋友、YYZZ是朋友,则XXZZ也是朋友。
    +Takahashi大坏蛋想把这NN个人进行分组,使得每组中的人互不为朋友。他至少要分多少组?

    +

    2N2×1052\le N\le 2\times10^5
    +0M2×1050\le M\le 2\times10^5
    +1Ai,BiN1\le A_i,B_i\le N
    +AiBiA_i \ne B_i

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +A2 B2A_2~B_2
    +\vdots
    +AM BMA_M~B_M

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    5 3
    +1 2
    +3 4
    +5 1
    +
    +

    样例输出1

    +
    3
    +
    +

    分为三组:{1,3}\{1,3\}{2,4}\{2,4\}{5}\{5\}可以达到目标。

    +

    样例输入2

    +
    4 10
    +1 2
    +2 1
    +1 2
    +2 1
    +1 2
    +1 3
    +1 4
    +2 3
    +2 4
    +3 4
    +
    +

    样例输出2

    +
    4
    +
    +

    请注意重复的关系。

    +

    样例输入3

    +
    10 4
    +3 1
    +4 1
    +5 9
    +2 6
    +
    +

    样例输出3

    +
    3
    +
    +

    分析

    +

    这道题可以先分出一个个朋友圈,再从朋友圈的人数中取最大值并输出即可。

    +

    代码

    +

    “分出朋友圈”这个操作可以使用dfs/bfs(不需要去重),当然,并查集也是可以的(需要去重)。我选择的是bfs

    +
    #include <cstdio>
    +#include <queue>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +bool vis[maxn];
    +
    +int bfs(int x)
    +{
    +	queue<int> q;
    +	q.push(x);
    +	int cnt = 0;
    +	while(!q.empty())
    +	{
    +		x = q.front(); q.pop();
    +		if(vis[x]) continue;
    +		vis[x] = true, cnt ++;
    +		for(int v: G[x])
    +			q.push(v);
    +	}
    +	return cnt;
    +}
    +
    +int main(int argc, char** argv)
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<m; i++)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[x].push_back(y);
    +		G[y].push_back(x);
    +	}
    +	int ans = bfs(0);
    +	for(int i=1; i<n; i++)
    +		if(!vis[i])
    +		{
    +			int cnt = bfs(i);
    +			if(cnt > ans)
    +				ans = cnt;
    +		}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc187/index.html b/post/abc187/index.html new file mode 100644 index 00000000..77f2fee7 --- /dev/null +++ b/post/abc187/index.html @@ -0,0 +1,735 @@ + + + + + +AtCoder Beginner Contest 187 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 187 A~D 题解 +

    + +
    +
    + 2021-01-03 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Large Digits

    +

    题目大意

    +

    给定两个三位整数AABB,求它们数位和的最大值。
    +数位和:例如,123123的数位和是1+2+3=61+2+3=6

    +

    100A,B999100\le A,B\le 999

    +

    输入格式

    +

    A  BA~~B

    +

    输出格式

    +

    一行,即AABB数位和的最大值。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    输入输出
    123 2349
    593 95317
    100 99927
    +

    分析

    +

    直接按题目照做即可。

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	char a[10], b[10];
    +	scanf("%s%s", a, b);
    +	int as = 0, bs = 0;
    +	for(int i=0; a[i]; i++)
    +		as += a[i] - '0';
    +	for(int i=0; b[i]; i++)
    +		bs += b[i] - '0';
    +	printf("%d\n", max(as, bs));
    +	return 0;
    +}
    +
    +
    +

    B - Gentle Pairs

    +

    题目大意

    +

    NN个点,每个点的坐标是(xi,yi)(x_i,y_i)xx坐标互不相同。
    +有多少对符合“11-1\le斜率\le1”的点?

    +

    1N1031\le N\le 10^3
    +xi,yi103|x_i|,|y_i|\le 10^3
    +xixjx_i \ne x_j (i<ji < j)

    +

    输入格式

    +

    NN
    +x1 y1x_1~y_1
    +\vdots
    +xn ynx_n~y_n

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    3
    +0 0
    +1 2
    +2 1
    +
    +

    样例输出1

    +
    2
    +
    +

    有三个点(0,0)(0,0)(1,2)(1,2)(2,1)(2,1)

    +
      +
    • (0,0)(0,0)(1,2)(1,2),斜率为22
    • +
    • (0,0)(0,0)(2,1)(2,1),斜率为12\frac12
    • +
    • (1,2)(1,2)(2,1)(2,1),斜率为1-1
    • +
    +

    22对符合条件的点。

    +

    样例输入2

    +
    1
    +-691 273
    +
    +

    样例输出2

    +
    0
    +
    +

    只有11个点,无法组成对,输出00

    +

    样例输入3

    +
    10
    +-31 -35
    +8 -36
    +22 64
    +5 73
    +-14 8
    +18 -58
    +-41 -85
    +1 -88
    +-21 -85
    +-11 82
    +
    +

    样例输出3

    +
    11
    +
    +

    分析

    +

    (x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2)的斜率是y1y2x1x2\frac{y_1-y_2}{x1-x2}
    +推理过程:

    +

    1y1y2x1x21-1 \le \frac{y_1-y_2}{x_1-x_2} \le 1 +

    +

    y1y2x1x21|\frac{y_1-y_2}{x_1-x_2}| \le 1 +

    +

    y1y2x1x21\frac{|y_1-y_2|}{|x_1-x_2|}\le 1 +

    +

    为了防止浮点数精度误差,我们继续:

    +

    y1y2x1x2|y_1-y_2|\le|x1-x2| +

    +

    这时,就可以写代码了。

    +

    代码

    +

    枚举所有对点即可。

    +
    #include <cstdio>
    +#include <cmath>
    +#define maxn 1005
    +using namespace std;
    + 
    +int x[maxn], y[maxn];
    + 
    +inline bool slope_check(int x1, int y1, int x2, int y2)
    +{
    +	int dx = abs(x1 - x2), dy = abs(y1 - y2);
    +	return dy <= dx;
    +}
    + 
    +int main(int argc, char** argv)
    +{
    +	int n, cnt = 0;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		scanf("%d%d", x + i, y + i);
    +	for(int i=0; i<n-1; i++)
    +		for(int j=i+1; j<n; j++)
    +			if(slope_check(x[i], y[i], x[j], y[j]))
    +				cnt ++;
    +	printf("%d\n", cnt);
    +	return 0;
    +}
    +
    +
    +

    C - 1-SAT

    +

    题目大意

    +

    给你NN个字符串S1,S2,...,SNS_1,S_2,...,S_N。每个字符串都由小写字母组成,前面有至多11!
    +找到S1,S2,...,SNS_1,S_2,...,S_N中任意一个字符串,使SS中出现了“!+这个字符串”(没有引号)。如果没有符合条件的字符串,输出satisfiable

    +

    1N1051\le N\le 10^5
    +1Si101\le |S_i|\le 10

    +

    输入格式

    +

    NN
    +S1S_1
    +\vdots
    +SNS_N

    +

    输出格式

    +

    如果有符合条件的字符串,输出任意一个;
    +否则,输出satisfiable

    +

    样例

    +

    样例输入1

    +
    6
    +a
    +!a
    +b
    +!c
    +d
    +!d
    +
    +

    样例输出1

    +
    a
    +
    +

    S1S_1aS2S_2!a,所以S1S_1符合条件;
    +S5S_5dS6S_6!d,所以S5S_5也符合条件,输出d也会被判为正确。

    +

    样例输入2

    +
    10
    +red
    +red
    +red
    +!orange
    +yellow
    +!blue
    +cyan
    +!green
    +brown
    +!gray
    +
    +

    样例输出2

    +
    satisfiable
    +
    +

    没有符合条件的字符串。

    +

    分析

    +

    如果暴力去枚举两个字符串(如,a!a),需要两重循环,复杂度为O(N2)\mathcal O(N^2)(由于字符串太短可以忽略字符串比较),这里NN最大为10510^5,所以,枚举法不可用。
    +我们再考虑O(nlogn)\mathcal O(n\log n)
    +可以每次输入字符串时判断一下,如果它以!开头将它的!后面的内容放入set中,否则将整个字符串放入vector中。最后,循环遍历vectorO(n)\mathcal O(n)),每次在set中查找这个字符串(O(logn)\mathcal O(\log n))。总时间复杂度为O(nlogn)\mathcal O(n\log n)

    +

    代码

    +
    #include <iostream>
    +#include <set>
    +#include <string>
    +#include <vector>
    +using namespace std;
    +
    +vector<string> v;
    +set<string> s;
    +
    +int main(int argc, char** argv)
    +{
    +	ios::sync_with_stdio(false); cin.tie(0);
    +	int n;
    +	cin >> n;
    +	while(n--)
    +	{
    +		string x;
    +		cin >> x;
    +		if(x[0] == '!')
    +			s.insert(x.substr(1));
    +		else v.push_back(x);
    +	}
    +	for(int i=0; i<v.size(); i++)
    +		if(s.find(v[i]) != s.end())
    +		{
    +			cout << v[i] << endl;
    +			return 0;
    +		}
    +	cout << "satisfiable\n";
    +	return 0;
    +}
    +
    +
    +

    D - Choose Me

    +

    题目大意

    +

    题目大意略,请自行前往AtCoder查看。
    +数据范围:
    +1N1051\le N\le 10^5
    +1Ai,Bi1091\le A_i,B_i\le 10^9

    +

    输入格式

    +

    NN
    +A1 B1A_1~B_1
    +\vdots
    +AN BNA_N~B_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    4
    +2 1
    +2 2
    +5 1
    +1 3
    +
    +

    样例输出1

    +
    1
    +
    +

    Takahashi在第三个城市演讲后,AokiTakahashi将分别得到5566个投票。

    +

    样例输入2

    +
    5
    +2 1
    +2 1
    +2 1
    +2 1
    +2 1
    +
    +

    样例输出2

    +
    3
    +
    +

    在任意三个城市演讲后,AokiTakahashi将分别得到4499个投票。

    +

    样例输入3

    +
    1
    +273 691
    +
    +

    样例输出3

    +
    1
    +
    +

    分析

    +

    换句话说,我们的目的就是使得AokiTakahashi的票数差距逐渐减少。
    +最开始,票数的差距是Aoki票数的和,也就是i=1nAi\sum\limits_{i=1}^nA_i
    +每去第ii个城市,差距减少2Ai+Bi2A_i+B_i,因此,我们可以贪心地先前往差距减少多的城市。这一点可以用数组+排序setpriority_queue三种方法实现(我选择的是priority_queuesetpriority_queue更快一些)。

    +

    代码

    +

    注意:一定不能忘记使用long long!!!

    +
    #include <cstdio>
    +#include <queue>
    +using namespace std;
    +
    +typedef long long LL;
    +
    +priority_queue<LL> q;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	scanf("%d", &n);
    +	LL diff = 0;
    +	while(n--)
    +	{
    +		LL ao, ta;
    +		scanf("%lld%lld", &ao, &ta);
    +		diff += ao;
    +		q.push(ao + ao + ta);
    +	}
    +	int ans = 0;
    +	while(!q.empty())
    +	{
    +		ans ++;
    +		if((diff -= q.top()) < 0)
    +		{
    +			printf("%d\n", ans);
    +			return 0;
    +		}
    +		q.pop();
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc188/index.html b/post/abc188/index.html new file mode 100644 index 00000000..5a2ae636 --- /dev/null +++ b/post/abc188/index.html @@ -0,0 +1,786 @@ + + + + + +AtCoder Beginner Contest 188 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 188 A~D 题解 +

    + +
    +
    + 2021-01-13 · 12 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Three-Point Shot

    +

    题目大意

    +

    有两个球队,分别得到XX分和YY分,问得分较少的球队能否在获得三分后超越对方。

    +

    0X,Y1000\le X,Y\le 100
    +XYX \ne Y
    +XXYY都是整数。

    +

    输入格式

    +

    X YX~Y

    +

    输出格式

    +

    如果能,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + +
    XY输出
    35Yes
    +

    分析

    +

    这个不用说了吧,就是求两个数的差是否小于33……

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int a, b;
    +	scanf("%d%d", &a, &b);
    +	puts((abs(a - b) < 3)? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Orthogonality

    +

    题目大意

    +

    给定两个长度为NN的数组A={A1,A2,A3,...,AN}A=\{A_1,A_2,A_3,...,A_N\}B={B1,B2,B3,...,BN}B=\{B_1,B_2,B_3,...,B_N\}。请判定AABB的内项积是否为00。换句话说,判断i=1NAiBi\sum\limits_{i=1}^NA_iB_i是否为00

    +

    1N1051\le N\le 10^5
    +100Ai,Bi100-100\le A_i,B_i\le 100 注意:可能会出现负数!

    +

    输入格式

    +

    NN
    +A1 A2 A3  ANA_1~A_2~A_3~\dots~A_N
    +B1 B2 B3  BNB_1~B_2~B_3~\dots~B_N

    +

    输出格式

    +

    如果AABB的内项积为00,输出Yes;否则,输出No

    +

    样例

    +

    样例输入1

    +
    2
    +-3 6
    +4 2
    +
    +

    样例输出1

    +
    Yes
    +
    +

    N=2N = 2
    +A={3,6}A = \{-3,6\}
    +B={4,2}B = \{4,2\}
    +AABB的内项积为:i=1NAiBi=(3)×4+6×2=0\sum\limits_{i=1}^NA_iB_i = (-3)\times4+6\times2=0,所以输出Yes

    +

    样例输入2

    +
    2
    +4 5
    +-1 -3
    +
    +

    样例输出2

    +
    No
    +
    +

    N=2N = 2
    +A={4,5}A = \{4,5\}
    +B={1,3}B = \{-1,-3\}
    +AABB的内项积为:i=1NAiBi=4×(1)+5×(3)=19\sum\limits_{i=1}^NA_iB_i = 4\times(-1)+5\times(-3)=19,所以输出No

    +

    样例输入3

    +
    3
    +1 3 5
    +3 -6 3
    +
    +

    样例输出3

    +
    Yes
    +
    +

    N=3N = 3
    +A={1,3,5}A = \{1,3,5\}
    +B={3,6,3}B = \{3,-6,3\}
    +AABB的内项积为:i=1NAiBi=1×3+3×(6)+5×3=0\sum\limits_{i=1}^NA_iB_i = 1\times3+3\times(-6)+5\times3=0,所以输出Yes

    +

    分析

    +

    只需按题目说的照做即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +int a[maxn];
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	int res = 0;
    +	for(int i=0; i<n; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		res += x * a[i];
    +	}
    +	puts(res == 0? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    C - ABC Tournament

    +

    题目大意

    +

    2N2^N个玩家,每个玩家的编号是ii且有一个排名AiA_i,举行NN场淘汰赛。
    +淘汰赛可以看作一棵二叉树,制度如下:
    +如,N=3N=3,有88个玩家,排名分别为1,6,7,10,5,13,8,91,6,7,10,5,13,8,9

    +
      +
    1. 1,6,7,10,5,13,8,9 两两比较,淘汰1,7,5,8;(排名越高的玩家越厉害)
    2. +
    3. 6,10,13,9 两两比较,淘汰6,9;
    4. +
    5. 10,13 1313最大,胜利!
    6. +
    +

    请输出比赛的第二名(即在最后一轮被淘汰的玩家,如上面的1313)的编号。

    +

    1N161\le N\le 16
    +1Ai1091\le A_i \le 10^9
    +AiA_i互不相同。

    +

    输入格式

    +

    NN
    +A1 A2 A3  A2NA_1~A_2~A_3~\dots~A_{2^N}

    +

    输出格式

    +

    输出最终获得第二名的玩家的编号

    +

    样例

    +

    样例输入1

    +
    2
    +1 4 2 5
    +
    +

    样例输出1

    +
    2
    +
    +

    44个玩家,排名分别为1,4,2,51,4,2,5

    +
      +
    1. 1,4,2,5
    2. +
    3. 4,5(22号玩家在这里被淘汰了)
    4. +
    +

    所以,我们输出22

    +

    样例输入2

    +
    2
    +3 1 5 4
    +
    +

    样例输出2

    +
    1
    +
    +

    44个玩家,排名分别为3,1,5,43,1,5,4

    +
      +
    1. 3,1,5,4
    2. +
    3. 3,5(11号玩家在这里被淘汰了)
    4. +
    +

    所以,我们输出11

    +

    样例输入3

    +
    4
    +6 13 12 5 3 7 10 11 16 9 8 15 2 1 14 4
    +
    +

    样例输出3

    +
    2
    +
    +

    博主提示:在这个样例上手算,就可以知道不能将输入排序后取第二大的值!!!

    +

    分析

    +

    首先,题目不允许偷懒(要求第二名的编号),不能将输入排序后取第二大的值
    +我们考虑别的方法。
    +很容易想到,可以直接模拟。不过,模拟时不能直接删除元素,会TLE。可以采取利用循环队列的O(1)\mathcal O(1)进出,每次出队两个元素,再将其中较大的再放入队列即可。最后,当队列中只剩两个元素时,输出其中较小的编号即可。

    +

    代码

    +

    写代码时要注意两点:

    +
      +
    1. 一定要使用long long
    2. +
    3. 要在进行队列操作时记录编号,可以用pair实现。
    4. +
    +
    #include <cstdio>
    +#include <queue>
    +using namespace std;
    +
    +using LL = long long;
    +using pli = pair<LL, int>;
    +
    +int main(int argc, char** argv)
    +{
    +	queue<pli> q;
    +	int n;
    +	scanf("%d", &n);
    +	n = 1 << n;
    +	for(int i=1; i<=n; i++)
    +	{
    +		LL x;
    +		scanf("%lld", &x);
    +		q.emplace(x, i);
    +	}
    +	while(q.size() > 2)
    +	{
    +		pli x = q.front(); q.pop();
    +		pli y = q.front(); q.pop();
    +		if(x < y) q.push(y);
    +		else q.push(x);
    +	}
    +	pli x = q.front(); q.pop();
    +	pli y = q.front();
    +	printf("%d\n", x < y? x.second: y.second);
    +	return 0;
    +}
    +
    +
    +

    D - Snuke Prime

    +

    题目大意

    +

    Takahashi需要使用NN种服务。
    +每种服务的价格是cic_i元(原题中钱币单位是日元,翻译时使用人民币作单位),他需要从第aia_i天的开始(0:00)用到第bib_i天的结束(23:59)。有一种特殊的服务,它可以使你无限次使用任意其它服务,每天收费CC元(需要从一天的开始订阅到一天的结束,订阅结束时失效,可以多次订阅)。
    +Takahashi使用这些服务至少需要多少元?

    +

    1N2×1051\le N\le 2\times 10^5
    +1C1091\le C\le 10^9
    +1aibi1091\le a_i\le b_i\le 10^9
    +1ci1091\le c_i\le 10^9

    +

    输入格式

    +

    N CN~C
    +a1 b1 c1a_1~b_1~c_1
    +a2 b2 c2a_2~b_2~c_2
    +......
    +aN bN cNa_N~b_N~c_N

    +

    输出格式

    +

    输出一行,即最少需要的钱数。

    +

    样例

    +

    样例输入1

    +
    2 6
    +1 2 4
    +2 2 4
    +
    +

    样例输出1

    +
    10
    +
    +sample1_note +

    样例输入2

    +
    5 1000000000
    +583563238 820642330 44577
    +136809000 653199778 90962
    +54601291 785892285 50554
    +5797762 453599267 65697
    +468677897 916692569 87409
    +
    +

    样例输出2

    +
    163089627821228
    +
    +

    最优方案是不订阅特殊服务。

    +

    样例输入3

    +
    5 100000
    +583563238 820642330 44577
    +136809000 653199778 90962
    +54601291 785892285 50554
    +5797762 453599267 65697
    +468677897 916692569 87409
    +
    +

    样例输出3

    +
    88206004785464
    +
    +

    自制样例

    +

    博主在这里再提供一组样例,方便手算后面的代码以及理解题目的意思。

    +

    输入:

    +
    2 7
    +1 3 5
    +2 6 4
    +
    +

    输出:

    +
    31
    +
    +

    在这组数据中,我们在第2233天订阅特殊服务。

    +

    分析

    +

    参考:AtCoder官方题解
    +我们可以把每一个服务的订阅拆分成两个事件(ai1,ci)(a_i-1,c_i)(bi,ci)(b_i,-c_i)。每个事件有两个参数,分别是时间(某一天的最后一刻)和每天增加的钱数(可以为负数,表示减少需要花的钱)。然后,再按时间排序这些事件。
    +我们可以用变量fee记录每天需要花的钱,用ans记录答案。循环遍历每个事件,当这个事件的事件与上一次不同时,将ans加上计算最划算的付钱方法(分开付,要花fee元或一起付,花CC元)乘以与上一次差的天数,最后加上当前事件的增加钱数。
    +最后,输出ans即可。

    +

    代码

    +

    作为一个优先队列爱好者,排序当然是用priority_queue实现了~
    +以下代码要注意三点:

    +
      +
    • 必须使用long long
    • +
    • 建议使用pair存储;
    • +
    • 拆分事件时第一个事件(ai1,ci)(a_i-1,c_i)中的aia_i一定不能忘记1-1(因为aia_i表示的是一天的开始,应该转换为前一天的结束)。
    • +
    +
    #include <cstdio>
    +#include <vector>
    +#include <queue>
    +#include <algorithm>
    +using namespace std;
    +
    +typedef long long LL;
    +typedef pair<LL, LL> pll;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	LL c;
    +	scanf("%d%lld", &n, &c);
    +	priority_queue<pll, vector<pll>, greater<pll> > q;
    +	while(n--)
    +	{
    +		LL x, y, z;
    +		scanf("%lld%lld%lld", &x, &y, &z);
    +		q.emplace(--x, z);
    +		q.emplace(y, -z);
    +	}
    +	LL ans = 0LL, fee = 0LL, last = 0LL;
    +	while(!q.empty())
    +	{
    +		auto [day, cost] = q.top(); q.pop();
    +		if(last != day)
    +		{
    +			ans += min(c, fee) * (day - last);
    +			last = day;
    +		}
    +		fee += cost;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +

    上面的代码使用了C++17新特性,如果上面的代码无法通过本地编译,请使用下面的代码:

    +
    #include <cstdio>
    +#include <vector>
    +#include <queue>
    +#include <algorithm>
    +using namespace std;
    +
    +typedef long long LL;
    +typedef pair<LL, LL> pll;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	LL c;
    +	scanf("%d%lld", &n, &c);
    +	priority_queue<pll, vector<pll>, greater<pll> > q;
    +	while(n--)
    +	{
    +		LL x, y, z;
    +		scanf("%lld%lld%lld", &x, &y, &z);
    +		q.push(pll(--x, z));
    +		q.push(pll(y, -z));
    +	}
    +	LL ans = 0LL, fee = 0LL, last = 0LL;
    +	while(!q.empty())
    +	{
    +		LL day = q.top().first, cost = q.top().second; q.pop();
    +		if(last != day)
    +		{
    +			ans += min(c, fee) * (day - last);
    +			last = day;
    +		}
    +		fee += cost;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc189/index.html b/post/abc189/index.html new file mode 100644 index 00000000..754c586b --- /dev/null +++ b/post/abc189/index.html @@ -0,0 +1,666 @@ + + + + + +AtCoder Beginner Contest 189 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 189 A~D 题解 +

    + +
    +
    + 2021-01-25 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Slots

    +

    题目大意

    +

    给定三个大写英文字母C1,C2,C3C_1,C_2,C_3,判断它们是否相同。

    +

    输入格式

    +

    C1C2C3C_1C_2C_3

    +

    输出格式

    +

    如果C1,C2,C3C_1,C_2,C_3相等,输出Won;否则,输出Lost

    +

    样例

    + + + + + + + + + + + + + + + + + +
    输入输出
    SSSWon
    WVWLost
    +

    分析

    +

    这题如果不会做,就等于没学过C++吧……

    +

    代码

    +

    注意:请不要将WonLost写成YesNo

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	char a = getchar(), b = getchar(), c = getchar();
    +	puts((a == b && b == c)? "Won": "Lost");
    +	return 0;
    +}
    +
    +
    +

    B - Alcoholic

    +

    题目大意

    +

    一个人要按顺序喝NN杯酒。第ii杯酒有ViV_i毫升,酒精含量为Pi%P_i\%1iN1\le i\le N)。
    +他喝的酒精总含量超过XX毫升时将会醉酒。(如果正好喝了XX毫升也不会喝醉)
    +他喝完第几杯酒后会第一次喝醉?

    +

    1N1031\le N\le 10^3
    +0X1060\le X\le 10^6
    +1Vi1031\le V_i\le 10^3
    +0Pi1000\le P_i\le 100

    +

    输入格式

    +

    N XN~X
    +V1 P1V_1~P_1
    +\vdots
    +VN PNV_N~P_N

    +

    输出格式

    +

    如果这个人在喝完第ii杯酒后第一次喝醉,输出ii。如果他直到最后都没有喝醉,输出-1

    +

    样例

    +

    样例输入1

    +
    2 15
    +200 5
    +350 3
    +
    +

    样例输出1

    +
    2
    +
    +

    11杯酒含有200×5%=10200\times5\%=10毫升的酒精。
    +第22杯酒含有350×3%=10.5350\times3\%=10.5毫升的酒精。
    +他喝完第二杯酒后一共喝了20.520.5毫升的酒精,高于最大可承受量(1515),所以我们输出22

    +

    样例输入2

    +
    2 10
    +200 5
    +350 3
    +
    +

    样例输出2

    +
    2
    +
    +

    当他正好喝了XX毫升的酒精时,他还没有喝醉。

    +

    样例输入3

    +
    3 1000000
    +1000 100
    +1000 100
    +1000 100
    +
    +

    样例输出3

    +
    -1
    +
    +

    他似乎免疫酒精了……

    +

    分析

    +

    ii杯酒中酒精的量是Vi×Pi%V_i\times P_i\%,即Vi×Pi/100V_i\times P_i/100
    +这时,我们将题目转化一下,就是求符合V1×P1/100+V2×P2/100+...+Vi×Pi/100>XV_1\times P_1/100+V_2\times P_2/100+...+V_i\times P_i/100 > X的最小ii。所以,我们很容易想到在输入的同时计算V1×P1/100+V2×P2/100+...+Vi×Pi/100V_1\times P_1/100+V_2\times P_2/100+...+V_i\times P_i/100,当它大于XX时输出ii
    +但是,这里有一个问题。
    +由于C++存在浮点数精度误差,所以这样算可能会得到错误的结果。
    +例如,下面一组数据:(数据来自AtCoder官方题解

    +
    3 13
    +30 13
    +35 13
    +35 13
    +
    +

    在很多环境下,程序会输出3,而这组数据的正确答案是-1。所以,我们考虑把前面的式子转化一下。

    +

    V1×P1/100+V2×P2/100+...+Vi×Pi/100>XV_1\times P_1/100+V_2\times P_2/100+...+V_i\times P_i/100 > X +

    +

    (V1×P1+V2×P2+...+Vi×Pi)/100>X(V_1\times P_1+V_2\times P_2+...+V_i\times P_i)/100 > X +

    +

    V1×P1+V2×P2+...+Vi×Pi>100XV_1\times P_1+V_2\times P_2+...+V_i\times P_i > 100X +

    +

    这时,我们就可以用前面的思路写代码了。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int n, x;
    +	scanf("%d%d", &n, &x);
    +	x *= 100;
    +	for(int i=1; i<=n; i++)
    +	{
    +		int v, p;
    +		scanf("%d%d", &v, &p);
    +		x -= v * p;
    +		if(x < 0)
    +		{
    +			printf("%d\n", i);
    +			return 0;
    +		}
    +	}
    +	puts("-1");
    +	return 0;
    +}
    +
    +
    +

    C - Mandarin Orange

    +

    题目大意

    +

    Takahashi面前有NN个碗排成一行,从左数第ii个碗中装有AiA_i个橙子。
    +他会选出以个符合下列所有条件的三元组(l,r,x)(l,r,x)

    +
      +
    • 1lrN1\le l\le r\le N
    • +
    • 1xAi1\le x\le A_ilirl\le i\le r
    • +
    +

    然后,他在第ll个到第rr个盘子(包含llrr)中每个吃掉xx个橙子。
    +通过选择三元组(l,r,x)(l,r,x)以最大化此数目,Takahashi最多可以吃多少个橙子?

    +

    1N1041\le N\le 10^4
    +1Ai1051\le A_i\le 10^5

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N

    +

    输出格式

    +

    输出一行,即Takahashi最多可以吃的橙子的个数。

    +

    样例

    +

    样例输入1

    +
    6
    +2 4 4 9 4 9
    +
    +

    样例输出1

    +
    20
    +
    +

    他可以选择(l,r,x)=(2,6,4)(l,r,x)=(2,6,4),能吃2020个橙子。

    +

    样例输入2

    +
    6
    +200 4 4 9 4 9
    +
    +

    样例输出2

    +
    200
    +
    +

    他可以选择(l,r,x)=(1,1,200)(l,r,x)=(1,1,200),能吃200200个橙子。

    +

    分析

    +

    很明显,如果我们选择(l,r,x)(l,r,x),则Takahashi能吃(lr+1)x(l-r+1)x个橙子。
    +我们要让吃的橙子个数最大化,那么选择(l,r)(l,r)后,xx必定为min{Al,Al+1,...,Ar}\min\{A_l,A_{l+1},...,A_r\}。这样一来,我们就可以枚举(l,r)(l,r),并记录min{Al,Al+1,...,Ar}\min\{A_l,A_{l+1},...,A_r\}作为xx,最终输出最小的(lr+1)x(l-r+1)x
    +这个算法的时间复杂度为O(n2)\mathcal O(n^2)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 10005
    +#define INF 2147483647
    +using namespace std;
    +
    +int a[maxn];
    +
    +inline void setmin(int& a, int b) {if(b < a) a = b;}
    +inline void setmax(int& a, int b) {if(b > a) a = b;}
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	int ans = 0;
    +	for(int l=0; l<n; l++)
    +	{
    +		int m = INF;
    +		for(int r=l; r<n; r++)
    +		{
    +			setmin(m, a[r]);
    +			setmax(ans, (r - l + 1) * m);
    +		}
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Logical Expression

    +

    题目大意

    +

    给你NN个字符串S1,S2,...,SNS_1,S_2,...,S_N,每个是AND或者OR
    +找到符合下列条件的长度为(N+1)(N+1)的元组(x0,x1,...,xN)(x_0,x_1,...,x_N)的数量:

    +
      +
    • xix_iTrue\text{True}或者False\text{False}
    • +
    • y0=x0y_0=x_0
    • +
    • i1i\ge 1时:如果SiS_iANDyi=yi1xiy_i=y_{i-1}\land x_i;如果SiS_iOR,则yi=yi1xiy_i=y_{i-1}\lor x_i
    • +
    +

    在这里,aba\land b表示aabbaba\lor b表示aabb

    +

    1N601\le N\le 60

    +

    输入格式

    +

    NN
    +S1S_1
    +\vdots
    +SNS_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    其实,题目解释得有些复杂了 😦
    +理解时例如样例11
    +sample1_exp

    +

    我们将f(N)f(N)定义为本题S={S1,S2,,SN}S=\{S_1,S_2,\dots,S_N\}的答案,则
    +f(N)={f(N1)(SN=AND)f(N1)×2N(SN=OR)f(N)=\begin{cases} + f(N-1) & (S_N=\text{AND})\\ + f(N-1)\times2^N & (S_N=\text{OR}) +\end{cases}
    +这时,我们就可以在输入时处理答案了。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int n;
    +	scanf("%d", &n);
    +	char c[4];
    +	long long ans = 1LL, x = 1LL;
    +	while(n--)
    +	{
    +		x <<= 1LL;
    +		scanf("%s", c);
    +		if(c[0] == 'O')
    +			ans ^= x; // 等同于ans += x;这样写速度更快
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc190/index.html b/post/abc190/index.html new file mode 100644 index 00000000..a2fd7dae --- /dev/null +++ b/post/abc190/index.html @@ -0,0 +1,784 @@ + + + + + +AtCoder Beginner Contest 190 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 190 A~D 题解 +

    + +
    +
    + 2021-02-01 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Very Very Primitive Game

    +

    题目大意

    +

    Takahashi和Aoki在玩一个游戏。
    +游戏规则是这样的:

    +
      +
    • 最开始,Takahashi和Aoki分别有AABB颗糖。
    • +
    • 他们将轮流吃一颗糖,第一个无法吃糖的人算输。如果C=0C=0,那么Takahashi先吃;如果C=1C=1,那么Aoki先吃。
    • +
    +

    请输出最终胜者的名字。

    +

    0A,B1000\le A,B\le 100
    +C{0,1}C \in \{0,1\}

    +

    输入格式

    +

    A B CA~B~C

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ABC输出
    210Takahashi
    220Aoki
    221Takahashi
    +

    分析

    +

    可以看出,如果是Aoki先吃(C=1C=1),那么当B>AB>A时,Aoki会赢。那么如果Takahashi先吃(C=1C=1),我们可以先将BB加上11,这时就变成了前一种情况,再判断B>AB>A是否成立即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	if(c == 0) b ++;
    +	puts(b > a? "Aoki": "Takahashi");
    +	return 0;
    +}
    +
    +
    +

    B - Magic 3

    +

    题目大意

    +

    一位魔术师要与怪兽战斗。
    +他可以使用NN种咒语。
    +第ii个咒语的冷却时间是XiX_i秒、伤害是YiY_i
    +但是,这个怪兽可以免疫冷却时间不少于SS或伤害不超过DD的任何咒语的伤害。
    +这位魔术师能伤害到怪兽吗?

    +

    1N1001\le N\le 100
    +1Xi,Yi1091\le X_i, Y_i\le 10^9
    +1S,D1091\le S, D\le 10^9

    +

    输入格式

    +

    N S DN~S~D
    +X1 Y1X_1~Y_1
    +X2 Y2X_2~Y_2
    +\vdots
    +XN YNX_N~Y_N

    +

    输出格式

    +

    如果魔术师能伤害到怪物,输出Yes;否则,输出No

    +

    样例

    +

    样例输入1

    +
    4 9 9
    +5 5
    +15 5
    +5 15
    +15 15
    +
    +

    样例输出1

    +
    Yes
    +
    +

    S=D=9S=D=9,则:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    咒语编号冷却时间伤害能否伤害到怪物
    1155   ~~~\checkmark5   ×5~~~\bm\times×\bm\times
    221515   ×~~~\bm\times5   ×5~~~\bm\times×\bm\times
    3355   ~~~\checkmark15   15~~~\checkmark\checkmark
    441515   ×~~~\bm\times15   15~~~\checkmark×\bm\times
    +

    样例输入2

    +
    3 691 273
    +691 997
    +593 273
    +691 273
    +
    +

    样例输出2

    +
    No
    +
    +

    样例输入3

    +
    7 100 100
    +10 11
    +12 67
    +192 79
    +154 197
    +142 158
    +20 25
    +17 108
    +
    +

    样例输出3

    +
    Yes
    +
    +

    只有第七个咒语能伤害怪兽。

    +

    分析

    +

    这题可以遍历每一个ii,并判断如果Xi<SX_i<SYi>DY_i>D同时成立,输出Yes;当所有ii都不符合条件时,输出No

    +

    代码

    +

    我写的这个代码是在输入时处理的,当然也可以输入之后再处理。

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, s, d;
    +	scanf("%d%d%d", &n, &s, &d);
    +	while(n--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		if(x < s && y > d)
    +		{
    +			puts("Yes");
    +			return 0;
    +		}
    +	}
    +	puts("No");
    +	return 0;
    +}
    +
    +
    +

    C - Bowls and Dishes

    +

    题目大意

    +

    NN个编号为1,2,,N1,2,\dots,N的盘子和MM个编号为1,2,,M1,2,\dots,M的条件。
    +当编号为AiA_iBiB_i的盘子中都有(至少一个)球时,第ii个条件就被满足了。
    +有KK个编号为1,2,,K1,2,\dots,K的人。第ii个人会将一个球放入编号为CiC_iDiD_i的盘子中。
    +最多能有多少个条件被满足?

    +

    2N1002\le N\le 100
    +1M1001\le M\le 100
    +1Ai<BiN1\le A_i<B_i\le N
    +1K161\le K\le 16
    +1Ci<DiN1\le C_i<D_i\le N

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +\vdots
    +AM BMA_M~B_M
    +KK
    +C1 D1C_1~D_1
    +\vdots
    +CK DKC_K~D_K

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    4 4
    +1 2
    +1 3
    +2 4
    +3 4
    +3
    +1 2
    +1 3
    +2 3
    +
    +

    样例输出1

    +
    2
    +
    +

    如果编号为1,2,31,2,3的人将他们的球分别放入编号为1,3,21,3,2的盘子中,则条件1122将被满足。

    +

    样例输入2

    +
    4 4
    +1 2
    +1 3
    +2 4
    +3 4
    +4
    +3 4
    +1 2
    +2 4
    +2 4
    +
    +

    样例输出2

    +
    4
    +
    +

    如果编号为1,2,3,41,2,3,4的人将他们的球分别放入编号为3,1,2,43,1,2,4的盘子中,则所有条件将被满足。

    +

    样例输入3

    +
    6 12
    +2 3
    +4 6
    +1 2
    +4 5
    +2 6
    +1 5
    +4 5
    +1 3
    +1 2
    +2 6
    +2 3
    +2 5
    +5
    +3 5
    +1 4
    +2 6
    +4 6
    +5 6
    +
    +

    样例输出3

    +
    9
    +
    +

    分析

    +

    这个题数据范围很小,所以我们考虑枚举。
    +我们可以按人枚举,枚举第ii个人是将自己的球放入编号为CiC_i还是DiD_i的盘子。
    +每个人有选CiC_iDiD_i两种情况,所以枚举次数为2K2^K,而题目保证1K161\le K\le16,所以不会超时。
    +我们可以使用二进制法来枚举:

    +
      +
    • KK个二进制位。
    • +
    • ii个二进制位如果是11,则第ii个人将球放入编号为CiC_i的盘子;否则,他会把球放入编号为DiD_i的盘子。
    • +
    +

    总时间复杂度为O(M2K)\mathcal O(M2^K)

    +

    代码

    +
    #include <cstdio>
    +#include <cstring>
    +using namespace std;
    +
    +int a[105], b[105], c[20], d[20];
    +
    +int main()
    +{
    +	int n, m, k;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<m; i++)
    +	{
    +		scanf("%d%d", a + i, b + i);
    +		a[i] --, b[i] --;
    +	}
    +	scanf("%d", &k);
    +	for(int i=0; i<k; i++)
    +	{
    +		scanf("%d%d", c + i, d + i);
    +		c[i] --, d[i] --;
    +	}
    +	int limit = 1 << k, ans = 0;
    +	for(int st=0; st<limit; st++)
    +	{
    +		bool hasdish[105] = {false};
    +		for(int i=0; i<k; i++)
    +			if(st & (1 << i))
    +				hasdish[c[i]] = true;
    +			else hasdish[d[i]] = true;
    +		int cnt = 0;
    +		for(int i=0; i<m; i++)
    +			cnt += hasdish[a[i]] && hasdish[b[i]];
    +		if(cnt > ans) ans = cnt;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    D - Staircase Sequences

    +

    题目大意

    +

    有多少个和为NN、公差为11的等差数列?
    +1N10121\le N\le 10^{12}

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    N输出
    121244
    1122
    637611984006376119840019201920
    +

    分析

    +

    我们设和为NN、公差为11的等差数列为[a,b][a,b],则

    +

    (a+b)(ba+1)2=N\frac {(a+b)(b-a+1)} 2=N +

    +

    (a+b)(ba+1)=2N{(a+b)(b-a+1)}=2N +

    +

    所以,我们求2N2N的奇偶性不同的因子对数即可。这里注意,题目里的等差数列是可以有负数的,所以最终结果一定要乘22
    +代码总时间复杂度为O(n)\mathcal O(\sqrt n)

    +

    代码

    +

    请注意一定要使用long long

    +
    #include <cstdio>
    +using namespace std;
    +
    +typedef long long LL;
    +
    +int main()
    +{
    +	LL n;
    +	scanf("%lld", &n);
    +	n <<= 1LL;
    +	int cnt = 0;
    +	for(LL i=1; i*i<=n; i++)
    +		if(n % i == 0 && i % 2 != n / i % 2)
    +			cnt ++;
    +	printf("%d\n", cnt << 1);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc191/index.html b/post/abc191/index.html new file mode 100644 index 00000000..6de5432d --- /dev/null +++ b/post/abc191/index.html @@ -0,0 +1,755 @@ + + + + + +AtCoder Beginner Contest 191 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 191 A~D 题解 +

    + +
    +
    + 2021-02-09 · 10 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Vanishing Pitch

    +

    题目大意

    +

    一个球的速度是V m/sV~\text{m/s},它飞了TT秒后会隐形,飞了SS秒时会接触隐形。
    +球在飞了DD米后,人能看见它吗?输出Yes或者No

    +

    1V10001\le V\le 1000
    +1T<S10001\le T<S\le 1000
    +1D10001\le D\le 1000

    +

    输入格式

    +

    V T S DV~T~S~D

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VVTTSSDD输出
    101033552020Yes
    101033553030No
    +

    分析

    +

    如果VTDVSVT\le D\le VS,则球飞了DD米后是隐形的,人看不见,输出No;否则,输出Yes

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int v, t, s, d;
    +	scanf("%d%d%d%d", &v, &t, &s, &d);
    +	puts((v * t <= d && d <= v * s)? "No": "Yes");
    +	return 0;
    +}
    +
    +
    +

    B - Remove It

    +

    题目大意

    +

    给你一个长度为NN的整数序列AA,请你将其中所有的XX都删除并不改变顺序输出。

    +

    1N1051\le N\le 10^5
    +1X1091\le X\le 10^9
    +1Ai1091\le A_i\le 10^9

    +

    输入格式

    +

    N XN~X
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出格式

    +

    输出最终序列,两个相邻的元素之间有一个空格。

    +

    样例

    +

    样例输入1

    +
    5 5
    +3 5 6 5 4
    +
    +

    样例输出1

    +
    3 6 4
    +
    +

    我们从序列[3,5,6,5,4][3,5,6,5,4]中删除所有的55,得到[3,6,4][3,6,4]

    +

    样例输入2

    +
    3 3
    +3 3 3
    +
    +

    样例输出2

    +
    
    +
    +

    当所有元素都被删除时,我们输出一个空行即可。

    +

    分析

    +

    这道题不需要真正删除所有的XX,只需输出时不输出等于XX的元素。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, x;
    +	scanf("%d%d", &n, &x);
    +	while(n--)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		if(a != x) printf("%d ", a);
    +	}
    +	putchar('\n');
    +	return 0;
    +}
    +
    +
    +

    C - Digital Graffiti

    +

    题目大意

    +

    我们有一张H×WH\times W的方格纸,在(i,j)(i,j)位置上的点是Si,jS_{i,j}
    +每一个方格都是黑色(#)或白色(.),题目保证最外圈的点都是白色的。
    +黑色方格放在一起是一个多边形。求这个多边形的边数。

    +

    3H,W103\le H,W\le 10

    +

    输入格式

    +

    H WH~W
    +S1,1S1,2S1,WS_{1,1}S_{1,2}\dots S_{1,W}
    +S2,1S2,2S2,WS_{2,1}S_{2,2}\dots S_{2,W}
    +\vdots
    +SH,1SH,2SH,WS_{H,1}S_{H,2}\dots S_{H,W}

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入

    +
    5 5
    +.....
    +.###.
    +.###.
    +.###.
    +.....
    +
    +

    样例输出

    +
    4
    +
    +

    这是一个四边形。

    +

    自制数据

    +

    由于样例太简单,无法全面测试我们的程序。因此,博主再提供一组数据:

    +

    输入

    +
    5 5
    +.....
    +..#..
    +.###.
    +.#.#.
    +.....
    +
    +

    输出

    +
    12
    +
    +

    分析

    +

    很多人看到这种图就会想到DFS\text{DFS}BFS\text{BFS}……其实这道题根本不需要。
    +这道题的做法来源于一个很简单的定理:多边形的顶点数=边数。
    +再进一步分析,一个点,在这个图上,怎样判断其是否为顶点?
    +其实,只要一个点周围四个方格中有一个或三个白方格,那么它就是一个顶点。
    +我们只要用一个2×22\times 2的正方形搜索即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 15
    +using namespace std;
    +
    +char c[maxn][maxn];
    +
    +int main()
    +{
    +	int h, w, ans = 0;
    +	scanf("%d%d", &h, &w);
    +	for(int i=0; i<h; i++)
    +		scanf("%s", c[i]);
    +	for(int i=0; i<h-1; i++)
    +		for(int j=0; j<w-1; j++)
    +		{
    +			int cnt = 0;
    +			cnt += c[i][j] == '.';
    +			cnt += c[i][j + 1] == '.';
    +			cnt += c[i + 1][j] == '.';
    +			cnt += c[i + 1][j + 1] == '.';
    +			if(cnt == 1 || cnt == 3) ans ++;
    +		}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Circle Lattice Points

    +

    题目大意

    +

    有一个中心为(X,Y)(X,Y)、半径为RR的圆。
    +这个圆内(圆上的也算)有多少个栅格点(X,YX,Y坐标均为整数的点)?

    +

    X105|X| \le 10^5
    +Y105|Y|\le 10^5
    +0R1050\le R\le 10^5
    +X,Y,RX,Y,R至多是四位小数。

    +

    输入格式

    +

    X Y RX~Y~R

    +

    输出格式

    +

    输出一行,即园内栅格点的个数。

    +

    样例

    +

    样例输入1

    +
    0.2 0.8 1.1
    +
    +

    样例输出1

    +
    3
    +
    +

    这个圆如下图所示。标了红色的是栅格点。
    +ABC191D示意图

    +

    样例输入2

    +
    100 100 1
    +
    +

    样例输出2

    +
    5
    +
    +

    X,YX,YRR也有可能是整数。
    +注意:正好在圆上的栅格点也计入总数内!

    +

    样例输入3

    +
    42782.4720 31949.0192 99999.99
    +
    +

    样例输出3

    +
    31415920098
    +
    +

    分析

    +

    这道题难就难在卡精度。
    +题目中说了,X,YX,YRR最多是四位小数。所以,很容易想到,程序中将所有小数乘上1000010000即可。但是,当输入X,Y,RX,Y,R后,可能就已经有浮点数精度误差了。我们可以给它们加上一个EPS\text{EPS},但是这样做有一定的风险。所以,我们使用自定义的输入函数,在输入是直接乘上1000010000,这样输入问题就解决了。
    +接下来考虑题目解法。
    +我们可以枚举圆内的每一个XX坐标,并求出XX坐标对应的最上面的整数YY坐标(YupY_\text{up})和最下面的整数YY坐标(YdownY_\text{down})并将答案加上(YupYdown+1)(Y_\text{up}-Y_\text{down}+1)。我们很容易想到,如果设当前XX坐标为ii,最上面的YY坐标为jj(不一定是整数),则

    +

    (iX)2+(jY)2=R2(i-X)^2+(j-Y)^2=R^2 +

    +

    (jY)2=R2(iX)2(j-Y)^2=R^2-(i-X)^2 +

    +

    jY=R2(iX)2j-Y=\sqrt{R^2-(i-X)^2} +

    +

    j=R2(iX)2+Yj=\sqrt{R^2-(i-X)^2}+Y +

    +

    如果要取整:

    +

    j=R2(iX)2+Yj=\lfloor \sqrt {R^2-(i-X)^2}+Y\rfloor +

    +

    对于任意一个XX坐标,它的YupY_\text{up}YdownY_\text{down}是以圆心YY作为对称轴对称的,所以我们可以使用2YYup2Y-Y_\text{up}求得YdownY_\text{down}
    +可惜的是,R2(iX)2\sqrt{R^2-(i-X)^2}的计算结果可能有浮点数精度误差,我们的程序需要完全避开任何浮点数操作,所以这样做行不通。
    +其实,这道题可以二分。我们利用二分找到XX坐标对应的最上面的点,再求出最下面的点和对应的栅格点即可。

    +

    代码

    +

    前面都是干货,下面上代码~
    +注意:long long不能忘!一定要判断各种负数的情况!

    +
    #include <cstdio>
    +#define DIV 10000LL
    +using namespace std;
    +
    +typedef long long LL;
    +
    +LL x, y, R;
    +
    +inline LL read()
    +{
    +	// Returns: input * 10000.
    +	LL res = 0LL;
    +	int num = 0;
    +	bool flag = false, negative = false;
    +	for(char c=getchar(); c != ' ' && c != '\n'; c=getchar())
    +	{
    +		if(c == '-') negative = true;
    +		else if(c == '.') flag = true;
    +		else
    +		{
    +			res *= 10LL;
    +			res += c - '0';
    +			if(flag) num ++;
    +		}
    +	}
    +	for(int i=num; i<4; i++)
    +		res *= 10LL;
    +	return negative? -res: res;
    +}
    +
    +inline LL in_circle(const LL& dx, const LL& dy)
    +{
    +	return dx * dx + dy * dy <= R * R;
    +}
    +
    +inline LL findtop(LL i)
    +{
    +	i *= DIV;
    +	LL l = y, r = y + R;
    +	while(l < r)
    +	{
    +		LL mid = l + r + 1LL >> 1LL;
    +		if(in_circle(i - x, mid - y))
    +			l = mid;
    +		else r = mid - 1LL;
    +	}
    +	return l;
    +}
    +
    +inline LL ceildiv(const LL& a)
    +{
    +	// Returns: ceil(a / DIV).
    +	if(a < 0LL) return a / DIV;
    +	if(a % DIV == 0LL) return a / DIV;
    +	return a / DIV + 1LL;
    +}
    +
    +inline LL floordiv(const LL& a)
    +{
    +	// Returns: floor(a / DIV).
    +	if(a >= 0LL) return a / DIV;
    +	if(a % DIV == 0LL) return a / DIV;
    +	return a / DIV - 1LL;
    +}
    +
    +int main()
    +{
    +	x = read(), y = read(), R = read();
    +	LL ans = 0LL, left = ceildiv(x - R), right = floordiv(x + R);
    +	for(LL i=left; i<=right; i++)
    +	{
    +		LL top = findtop(i);
    +		LL bottom = (y << 1LL) - top;
    +		ans += floordiv(top) - ceildiv(bottom) + 1LL;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc192/index.html b/post/abc192/index.html new file mode 100644 index 00000000..1311767f --- /dev/null +++ b/post/abc192/index.html @@ -0,0 +1,695 @@ + + + + + +AtCoder Beginner Contest 192 A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 192 A~D 题解 +

    + +
    +
    + 2021-02-28 · 6 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Star

    +

    题目大意

    +

    下一个大于XX100100的倍数与XX的差是多少?
    +1X1051\le X\le 10^5

    +

    输入格式

    +

    XX

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    XX输出
    1401406060
    10001000100100
    +

    分析

    +

    下一个大于XX100100的倍数是(X/100+1)×100(\lfloor X/100\rfloor+1)\times 100。所以,这题我们直接输出(X/100+1)×100X(\lfloor X/100\rfloor+1)\times 100-X

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int x;
    +	scanf("%d", &x);
    +	printf("%d\n", (x / 100 + 1) * 100 - x);
    +	return 0;
    +}
    +
    +
    +

    B - uNrEaDaBlE sTrInG

    +

    题目大意

    +

    当一个字符串的奇数位置上(第11位、第33位、第55位……,下标从11开始)都是小写英文字母且偶数位置上(第22位、第44位、第66位……)都是大写英文字母时,它是一个难以阅读的字符串。
    +字符串SS难以阅读吗?

    +

    1S10001\le |S|\le 1000
    +SS由大写字母和小写字母组成。

    +

    输入格式

    +

    SS

    +

    输出格式

    +

    如果SS难以阅读,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    SS输出
    dIfFiCuLt\text{dIfFiCuLt}Yes
    eASY\text{eASY}No
    a\text{a}Yes
    +

    分析

    +

    这题只要照题目说的做即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	char c;
    +	int n = 0;
    +	while((c = getchar()) != '\n')
    +	{
    +		if(n++ % 2 == 0)
    +		{
    +			if(c < 'a' || c > 'z')
    +			{
    +				puts("No");
    +				return 0;
    +			}
    +			continue;
    +		}
    +		if(c < 'A' || c > 'Z')
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +	}
    +	puts("Yes");
    +	return 0;
    +}
    +
    +
    +

    C - Kaprekar Number

    +

    题目大意

    +

    对于一个自然数xx,我们对g1(x),g2(x),f(x)g1(x),g2(x),f(x)的定义如下:

    +
      +
    • g1(x)=xg1(x)=x按十进制位降序排序的结果
    • +
    • g2(x)=xg2(x)=x按十进制位升序排序的结果
    • +
    • f(x)=g1(x)g2(x)f(x)=g1(x)-g2(x)
    • +
    +

    举几个例子:g1(314)=431,g2(3021)=123,f(271)=721127=594g1(314)=431,g2(3021)=123,f(271)=721-127=594请注意,前导00会被忽略!
    +给你两个数N,KN,K,请进行KKN:=f(N)N:=f(N)这个操作,并输出最终的NN

    +

    0N1090\le N\le 10^9
    +1K1051\le K\le 10^5

    +

    输入格式

    +

    N KN~K

    +

    输出格式

    +

    输出一行,即最终的NN

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NNKK输出
    31431422693693
    1000000000100000000010010000
    6174617410000010000061746174
    +

    分析

    +

    这题在计算f(n)f(n)时可以使用一个桶来排序nn,从而得到O(K)\mathcal O(K)的总复杂度。

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#include <vector>
    +using namespace std;
    +
    +int cnt[10];
    +
    +int f(int x)
    +{
    +	for(int i=0; i<10; i++) cnt[i] = 0;
    +	while(x > 0)
    +	{
    +		cnt[x % 10] ++;
    +		x /= 10;
    +	}
    +	int g1 = 0, g2 = 0, t = 1;
    +	for(int i=0; i<10; i++)
    +		while(cnt[i]--)
    +		{
    +			g1 += i * t, g2 = g2 * 10 + i;
    +			t *= 10;
    +		}
    +	return g1 - g2;
    +}
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	while(k--) n = f(n);
    +	printf("%d\n", n);
    +	return 0;
    +}
    +
    +
    +

    D - Base n

    +

    题目大意

    +

    给你一个大整数XX别想得太美,long long存不下)和整数MM。我们设ddXX中最大的位上的十进制数。
    +有多少个符合“将XX看成(不是转换成)nn进制的数的十进制表示不超过MM”这个条件的nn

    +

    XX是一个没有前导00的正整数。
    +XX在十进制表示下至少有11位、至多有6060位。
    +1M10181\le M\le 10^{18}

    +

    输入格式

    +

    XX
    +MM

    +

    输出格式

    +

    输出一行,即符合条件的nn的个数。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    很明显,这题nn的范围是d<nMd<n\le M。我们可以用二分找到最大可能的NN,再用这个数减去dd即可。

    +

    代码

    +

    写这份代码,需要注意如下三个点:

    +
      +
    • 二分的边界
    • +
    • 二分的判断
    • +
    • 大整数的处理
    • +
    +

    废话不多说,我们直接上代码!            \downarrow~~~~~~\downarrow~~~~~~\downarrow

    +
    #include <cstdio>
    +using namespace std;
    +
    +typedef unsigned long long ULL;
    +
    +char x[65];
    +ULL m;
    +
    +inline void setmax(int& x, int y)
    +{
    +	if(y > x) x = y;
    +}
    +
    +inline bool check(const ULL& base)
    +{
    +	// Returns: (x -> base) <= m?
    +	ULL t = 0ULL;
    +	for(int i=0; x[i]; i++)
    +	{
    +		if(t > m / base)
    +			return false;
    +		t *= base;
    +		if((t += x[i] - '0') > m)
    +			return false;
    +	}
    +	return true;
    +}
    +
    +int main()
    +{
    +	scanf("%s%llu", x, &m);
    +	int d = 0;
    +	for(int i=0; x[i]; i++)
    +		setmax(d, x[i] - '0');
    +	if(x[1] == '\0')
    +	{
    +		puts(d > m? "0": "1");
    +		return 0;
    +	}
    +	ULL l = d, r = m;
    +	while(l < r)
    +	{
    +		ULL mid = l + r + 1ULL >> 1ULL;
    +		if(check(mid)) l = mid;
    +		else r = mid - 1ULL;
    +	}
    +	printf("%llu\n", l - d);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc193/index.html b/post/abc193/index.html new file mode 100644 index 00000000..68cfd5cd --- /dev/null +++ b/post/abc193/index.html @@ -0,0 +1,700 @@ + + + + + +Caddi Programming Contest 2021 (AtCoder Beginner Contest 193) A~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Caddi Programming Contest 2021 (AtCoder Beginner Contest 193) A~D 题解 +

    + +
    +
    + 2021-03-08 · 7 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Discount

    +

    题目大意

    +

    一件商品原价为AA元,现价为BB元,现价优惠了百分之几?

    +

    1B<A1051\le B<A\le 10^5

    +

    输入格式

    +

    A BA~B

    +

    输出格式

    +

    输出答案(不加%)。最大允许误差为10210^{-2}

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABB输出
    100100808020.020.0
    776614.28571414.285714
    999999999999998999980.00100001000010.0010000100001
    +

    分析

    +

    这里答案可以直接使用ABA\frac{A-B}{A}求得结果。

    +

    代码

    +
    #include <cstdio>
    +#include <tuple>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b;
    +	scanf("%d%d", &a, &b);
    +	printf("%.6lf", (a - b) * 100.0 / a);
    +	return 0;
    +}
    +
    +
    +

    B - Play Snuke

    +

    题目大意

    +

    Takahashi想要买一件商品,它叫Play Snuke。
    +有NN家商店售卖Play Snuke。Takahashi从家到第ii个商店需要AiA_i分钟,这家商店的卖价是
    +PiP_i元且库存XiX_i件Play Snuke。
    +现在,Takahashi想要去这NN家店中的某一家并且买一个Play Snuke。
    +但是,每家店的Play Snuke都会在第0.5,1.5,2.5,0.5,1.5,2.5,\dots分钟被买掉一个。
    +判断Takahashi到底能不能买到Play Snuke。如果能,请输出他最少要花的钱。

    +

    1N1051\le N\le 10^5
    +1Ai,Pi,Xi1091\le A_i, P_i, X_i\le 10^9

    +

    输入格式

    +

    NN
    +A1 P1 X1A_1~P_1~X_1
    +\vdots
    +AN PN XNA_N~P_N~X_N

    +

    输出格式

    +

    如果Takahashi能买到Play Snuke,输出他最少要花的钱数;否则,输出-1

    +

    样例

    +

    样例输入1

    +
    3
    +3 9 5
    +4 8 5
    +5 7 5
    +
    +

    样例输出1

    +
    8
    +
    +

    Takahashi可以去22号商店,需要花88元。

    +

    样例输入2

    +
    3
    +5 9 5
    +6 8 5
    +7 7 5
    +
    +

    样例输出2

    +
    -1
    +
    +

    无论Takahashi去哪个商店,到达时Play Snuke都卖光了,因此输出-1

    +

    样例输入3

    +
    10
    +158260522 877914575 602436426
    +24979445 861648772 623690081
    +433933447 476190629 262703497
    +211047202 971407775 628894325
    +731963982 822804784 450968417
    +430302156 982631932 161735902
    +880895728 923078537 707723857
    +189330739 910286918 802329211
    +404539679 303238506 317063340
    +492686568 773361868 125660016
    +
    +

    样例输出3

    +
    861648772
    +
    +

    分析

    +

    对于第ii个商店,如果Xi>AiX_i>A_i,则Takahashi到达时商品没有卖光,这时取最大的PiP_i输出即可。如果没有ii符合条件Xi>AiX_i>A_i,则输出-1

    +

    代码

    +
    #include <cstdio>
    +#define maxn 100005
    +#define INF 2147483647
    +using namespace std;
    +
    +int main()
    +{
    +	int n, ans = INF;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a, p, x;
    +		scanf("%d%d%d", &a, &p, &x);
    +		if(x > a && p < ans)
    +			ans = p;
    +	}
    +	if(ans == INF) puts("-1");
    +	else printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    C - Unexpressed

    +

    题目大意

    +

    给你一个整数NN。有多少个在11~NN之间的整数不能表示为aba^baabb都是不少于22的整数)?

    +

    1N10101\le N\le 10^{10}

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    8866
    1000001000009963499634
    +

    分析

    +

    其实能表示为aba^b的整数并不多。我们只要枚举所有的aa2aN2\le a\le \sqrt N),再把它的不超过NN的所有整数次方放入一个set中(去重),再用N最终set中的元素个数N-\text{最终set中的元素个数}即可。

    +

    代码

    +
    #include <cstdio>
    +#include <cmath>
    +#include <set>
    +using namespace std;
    +
    +using LL = long long;
    +set<LL> s;
    +
    +int main()
    +{
    +	LL n;
    +	scanf("%lld", &n);
    +	LL tmp = sqrt(n);
    +	for(LL a=2; a<=tmp; a++)
    +	{
    +		LL res = a; // res = a ^ b
    +		while((res *= a) <= n)
    +			s.insert(res);
    +	}
    +	printf("%lld\n", n - s.size());
    +	return 0;
    +}
    +
    +
    +

    D - Poker

    +

    题目大意

    +

    略,请自行前往AtCoder查看

    +

    输入格式

    +

    KK
    +SS
    +TT

    +

    输出格式

    +

    输出一行,即Takahashi的胜率(不要使用百分数,请使用0011之间的小数)。最大允许误差10510^{-5}

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KKSSTT输出
    221144#2233#0.44444444444440.4444444444444
    229988#1122#1.01.0
    661122#2228#0.00193236714980.0019323671498
    10510^53226#3597#0.62962979424260.6296297942426
    +

    分析

    +

    (参考AtCoder官方题解
    +对于每一对(x,y)(x, y),Takahashi有卡牌xx且Aoki有卡牌yy的总组合数为:

    +

    {CxCy(xy)Cx(Cx1)(x=y)\begin{cases} +C_xC_y & (x \ne y)\\ +C_x(C_x - 1) & (x = y)\\ +\end{cases}

    +

    枚举每一对(x,y)(x, y),拿最终的结果除以(9K8)(9K9)(9K - 8)(9K - 9)即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +using LL = long long;
    +
    +char s[7], t[7];
    +
    +int score(const char* cards)
    +{
    +	int cnt[10];
    +	for(int i=0; i<10; i++) cnt[i] = i;
    +	for(int i=0; i<5; i++)
    +		cnt[cards[i] - '0'] *= 10;
    +	int res = 0;
    +	for(int x: cnt) res += x;
    +	return res;
    +}
    +
    +int main()
    +{
    +	int k;
    +	scanf("%d%s%s", &k, s, t);
    +	int cnt[10];
    +	for(int i=1; i<10; i++) cnt[i] = k;
    +	for(int i=0; i<4; i++)
    +		cnt[s[i] - '0'] --,
    +		cnt[t[i] - '0'] --;
    +	LL win = 0LL;
    +	for(int x=1; x<10; x++)
    +		if(cnt[x])
    +		{
    +			s[4] = '0' + x;
    +			int sscore = score(s);
    +			for(int y=1; y<10; y++)
    +				if(cnt[y])
    +				{
    +					t[4] = '0' + y;
    +					if(sscore > score(t))
    +						win += cnt[x] * LL(cnt[y] - (x == y));
    +				}
    +		}
    +	LL tmp = 9LL * k - 8LL;
    +	printf("%.8lf\n", double(win) / tmp / double(tmp - 1LL));
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc194/index.html b/post/abc194/index.html new file mode 100644 index 00000000..03b47d42 --- /dev/null +++ b/post/abc194/index.html @@ -0,0 +1,703 @@ + + + + + +AtCoder Beginner Contest 194 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 194 A~E 题解 +

    + +
    +
    + 2021-03-17 · 12 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - I Scream

    +

    题目大意

    +

    在日本,有如下四种冰淇淋产品:

    +
      +
    • 至少有15%15\%的milk solids和8%8\%的milk fat的产品称为“冰淇淋”;
    • +
    • 至少有10%10\%的milk solids和3%3\%的milk fat且不是冰淇淋的产品称为“冰奶”;
    • +
    • 至少有3%3\%的milk solids且不是冰淇淋或冰奶**的产品称为“乳冰”;
    • +
    • 不是以上三种的产品称为“调味冰”。
    • +
    +

    在这里,milk solids由milk fat和milk solids-not-fat组成。
    +有一种冰淇淋产品,它由A%A\%的milk solids-not-fat和B%B\%的milk fat组成。
    +这种产品是上述的哪一类?

    +

    0A,B1000\le A,B\le 100
    +0A+B1000\le A+B\le 100

    +

    输入格式

    +

    A BA~B

    +

    输出格式

    +

    请按如下格式输出类别:

    +
      +
    • 如果这是冰淇淋,输出11
    • +
    • 如果这是冰奶,输出22
    • +
    • 如果这是乳冰,输出33
    • +
    • 如果这是调味冰,输出44
    • +
    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABB输出
    10108811
    112233
    000044
    +

    分析

    +

    只需将AA加上BB(变为milk solids的占比),再按题目所说的判断即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b;
    +	scanf("%d%d", &a, &b);
    +	a += b;
    +	if(a >= 15 && b >= 8) puts("1");
    +	else if(a >= 10 && b >= 3) puts("2");
    +	else if(a >= 3) puts("3");
    +	else puts("4");
    +	return 0;
    +}
    +
    +
    +

    B - Job Assignment

    +

    题目大意

    +

    你的公司有NN位员工,他们叫员工11,员工22,……,员工NN
    +你有两份重要工作要完成——工作A和工作B。
    +员工ii可以在AiA_i分钟内完成工作A并在BiB_i分钟内完成工作B。
    +你要将两个工作分别分给某一位员工。
    +假设工作A分给了员工ii,工作B分给了员工jj,将要花的分钟数设为tt,则:

    +

    t={Ai+Bi(i=j)max{Ai,Bj}(ij)t= +\begin{cases} +A_i+B_i & (i=j) \\ +\max\{A_i,B_j\} & (i\ne j) \\ +\end{cases}

    +

    求最小的tt

    +

    2N10002\le N\le 1000
    +1Ai,Bi1051\le A_i,B_i\le 10^5

    +

    输入格式

    +

    NN
    +A1 B1A_1~B_1
    +A2 B2A_2~B_2
    +\vdots
    +AN BNA_N~B_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    这题由于NN最大只有10310^3,所以枚举是完全可行的,只要枚举所有的(i,j)(i,j),再根据题目里的公式求出答案取最小值即可,这样做总时间复杂度为O(n2)\mathcal O(n^2)
    +另外,本题也有贪心的O(n)\mathcal O(n)的算法,但是情况太多,代码太麻烦,所以这里不写。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 1005
    +#define INF 2147483647
    +using namespace std;
    +
    +int a[maxn], b[maxn];
    +
    +inline void setmin(int& x, int y) { if(y < x) x = y; }
    +inline int max(int x, int y) { return x > y ? x : y; }
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		scanf("%d%d", a + i, b + i);
    +	int ans = INF;
    +	for(int i=0; i<n; i++)
    +	{
    +		setmin(ans, a[i] + b[i]); // i == j
    +		for(int j=i+1; j<n; j++)
    +		{
    +			setmin(ans, max(a[i], b[j]));
    +			setmin(ans, max(a[j], b[i]));
    +		}
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    C - Squared Error

    +

    题目大意

    +

    给你一个长度为NN的序列AA
    +输出i=2Nj=1i1(AiAj)2\displaystyle \sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} (A_i - A_j)^2

    +

    2N3×1052 \le N \le 3 \times 10^5
    +Ai200|A_i| \le 200

    +

    输入格式

    +

    NN
    +A1 A2 A3  ANA_1~A_2~A_3~\dots~A_N

    +

    输出格式

    +

    输出一行,即i=2Nj=1i1(AiAj)2\displaystyle \sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} (A_i - A_j)^2

    +

    样例

    +

    样例输入1

    +
    3
    +2 8 4
    +
    +

    样例输出1

    +
    56
    +
    +

    通过计算,我们得到i=2Nj=1i1(AiAj)2=(82)2+(42)2+(48)2=56\displaystyle \sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} (A_i - A_j)^2 = (8 - 2)^2 + (4 - 2) ^ 2 + (4 - 8) ^ 2 = 56

    +

    样例输入2

    +
    5
    +-5 8 9 -4 -3
    +
    +

    样例输出2

    +
    950
    +
    +

    分析

    +

    根据公式(ab)2=a2+b22ab(a-b)^2=a^2+b^2-2ab,我们可以使用如下推理:

    +

    i=2Nj=1i1(AiAj)2\sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} (A_i - A_j)^2 +

    +

    i=2Nj=1i1Ai2+Aj22AiAj\sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} {A_i}^2+{A_j}^2-2A_iA_j +

    +

    (i=2Nj=1i1Ai2)+(i=2Nj=1i1Aj2)(i=2Nj=1i12AiAj)(\sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} {A_i}^2)+(\sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} {A_j}^2)-(\sum_{i = 2}^{N} \sum_{j = 1}^{i - 1} 2A_iA_j) +

    +

    这时,我们设Si=j=1i1AiS_i=\sum\limits_{j=1}^{i-1} A_i,则:

    +

    (n1)(i=1NAi2)2(i=1NSiAi)(n-1)(\sum_{i = 1}^{N} {A_i}^2)-2(\sum_{i = 1}^{N} S_iA_i) +

    +

    这时,计算所有SiS_i的时间复杂度为O(n)\mathcal O(n),求最终结果的时间复杂度也是O(n)\mathcal O(n),所以总时间复杂度为O(n)\mathcal O(n)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 300005
    +using namespace std;
    +
    +using LL = long long;
    +
    +int main()
    +{
    +	int n, s1 = 0;
    +	scanf("%d", &n);
    +	LL s2 = 0, m = 0LL;
    +	for(int i=0; i<n; i++)
    +	{
    +		LL x;
    +		scanf("%lld", &x);
    +		m += x * s1;
    +		s1 += x, s2 += x * x;
    +	}
    +	m <<= 1LL, s2 *= n - 1LL;
    +	printf("%lld\n", s2 - m);
    +	return 0;
    +}
    +
    +
    +

    D - Journey

    +

    题目大意

    +

    我们有一个NN个顶点(称为顶点11、顶点22、……、顶点NN)。
    +目前,这个图没有任何边。
    +Takahashi会重复执行以下操作,直到这个图变为连通图:

    +
      +
    • 从这NN个顶点中随机选一个顶点。每个顶点被抽中的概率相等,即1N\frac 1 N
    • +
    • 在现在站着的点和选中的顶点之间添加一条边,并走到这个点上。
    • +
    +

    求Takahashi执行操作次数的期望值。

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案,最大允许浮点数误差10610^{-6}

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    2222
    334.54.5
    +

    分析

    +

    通过dp分析,我们可以得到i=1n1Ni\sum\limits_{i=1}^{n-1}\frac Ni这个公式。这时,就可以写代码了。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	double res = 0;
    +	for(int i=1; i<n; i++)
    +		res += double(n) / i;
    +	printf("%.8lf\n", res);
    +	return 0;
    +}
    +
    +
    +

    E - Mex Min

    +

    题目大意

    +

    我们定义mex(x1,x2,x3,,xk)\mathrm{mex}(x_1, x_2, x_3, \dots, x_k)为最小的不出现在x1,x2,x3,,xkx_1, x_2, x_3, \dots, x_k中的自然数。
    +给你一个长度为NN的序列AA(A1,A2,A3,,AN)(A_1, A_2, A_3, \dots, A_N)
    +对于每个0iNM0\le i\le N-M的整数ii,我们计算mex(Ai+1,Ai+2,Ai+3,,Ai+M)\mathrm{mex}(A_{i + 1}, A_{i + 2}, A_{i + 3}, \dots, A_{i + M})。输出这些NM+1N-M+1个结果中的最小值。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    先用最基本的方法想一下这道题,要求mex(x1,x2,x3,,xk)\mathrm{mex}(x_1, x_2, x_3, \dots, x_k),只需记录每个xix_i的出现次数,放进数组cnt\text{cnt}里(cnti=i\text{cnt}_i=ixx中出现的次数)。这时,只要找到cnt\text{cnt}中第一个00即可,这样计算mex\mathrm{mex}的时间复杂度为O(k)\mathcal O(k)。我们还可以想到一种优化方法,就是每一次计算mex(Ai+1,Ai+2,Ai+3,,Ai+M)\mathrm{mex}(A_{i + 1}, A_{i + 2}, A_{i + 3}, \dots, A_{i + M})1iNM1\le i\le N-M)时,将cntAi\text{cnt}_{A_i}减少11,并且将cntAi+M\text{cnt}_{A_{i+M}}增加11,这样就达到了O(1)\mathcal O(1)计算cnt\text{cnt}的效果。但是,即使这样还会TLE。所以,我们可以用一个set维护cnt\text{cnt}中所有00的位置,这样总时间复杂度就能降至O(NlogM)\mathcal O(N\log M)

    +

    代码

    +

    这里注意,set中一定要添加NN

    +
    #include <cstdio>
    +#include <set>
    +#define maxn 1500005
    +using namespace std;
    +
    +int cnt[maxn], a[maxn];
    +
    +set<int> s;
    +
    +inline void setmin(int& x, int y)
    +{
    +	if(y < x) x = y;
    +}
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	for(int i=0; i<m; i++)
    +		cnt[a[i]] ++;
    +	for(int i=0; i<n; i++)
    +		if(cnt[i] == 0)
    +			s.insert(i);
    +	s.insert(n);
    +	int ans = *s.begin();
    +	n -= m;
    +	for(int i=0; i<n; i++)
    +	{
    +		if(cnt[a[i + m]]++ == 0) s.erase(a[i + m]);
    +		if(--cnt[a[i]] == 0) s.insert(a[i]);
    +		setmin(ans, *s.begin());
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc195/index.html b/post/abc195/index.html new file mode 100644 index 00000000..72af6c1f --- /dev/null +++ b/post/abc195/index.html @@ -0,0 +1,714 @@ + + + + + +Panasonic Programming Contest (AtCoder Beginner Contest 195) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Panasonic Programming Contest (AtCoder Beginner Contest 195) A~E 题解 +

    + +
    +
    + 2021-03-25 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Health M Death

    +

    题目大意

    +

    有一位魔术师,他正在打一个血量为HH?的怪兽。
    +当怪兽的血量是MM的倍数时,魔术师能打败怪兽。
    +魔术师能打败怪兽吗?

    +

    1M,H10001\le M,H\le 1000

    +

    输入格式

    +

    M HM~H

    +

    输出格式

    +

    如果魔术师能打败怪兽,输出Yes;如果不能,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + +
    MMHH输出
    1010120120Yes
    1010125125No
    +

    分析

    +

    只需判断HH是否是MM的倍数即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int m, h;
    +	scanf("%d%d", &m, &h);
    +	puts(h % m == 0? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Many Oranges

    +

    题目大意

    +

    我们有很多橙子。每个橙子的重量在AA克到BB克之间(包含AABB克,可能为小数)。
    +这些橙子的总重量为WW千克
    +找到橙子最少和最多的数量。

    +

    1AB10001\le A\le B\le 1000
    +1W10001\le W\le 1000

    +

    输入格式

    +

    A B WA~B~W

    +

    输出格式

    +

    输出橙子最少和最多的数量,用一个空格隔开;如果数据不合法,输出UNSATISFIABLE

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBWW输出
    1001002002002210 2010~20
    1201201501502214 1614~16
    30030033333311UNSATISFIABLE
    +

    分析

    +

    如果要得到最小的结果,那么每个橙子的单价必定要取最大值。所以,我们设min=WBmin=\lceil\frac WB\rceil
    +同理,如果要得到最大的结果,那么每个橙子的单价必定要取最小值。所以,我们设max=WAmax=\lfloor\frac WA\rfloor
    +计算完成后,如果min>maxmin>max,说明数据不合法;否则,输出minminmaxmax

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, w;
    +	scanf("%d%d%d", &a, &b, &w);
    +	w *= 1000;
    +	int min = w % b == 0? w / b: w / b + 1;
    +	int max = w / a;
    +	if(min > max) puts("UNSATISFIABLE");
    +	else printf("%d %d\n", min, max);
    +	return 0;
    +}
    +
    +
    +

    C - Comma

    +

    题目大意

    +

    我们写一个整数时,可以从右开始每隔三位写一个逗号。如,12345671234567写作1,234,567777777直接写作777
    +如果我们写下11NN之间的所有整数,一共要用多少个逗号?

    +

    1N10151\le N\le 10^{15}

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出总共需要的逗号的数量。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    101010101111
    2718281828459027182818284590107730272137364107730272137364
    +

    分析

    +

    我们可以按位置数逗号的数量。首先,在从右往左数的第一个逗号的位置,只要大于10001000的数都需要写逗号。以此类推,在从右往左数的第NN个逗号的位置,只要大于1000N1000^N的数都需要写逗号。这样,我们就可以通过上述算法写出代码了。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +typedef long long LL;
    +
    +int main()
    +{
    +	LL n, ans = 0LL;
    +	scanf("%lld", &n);
    +	for(LL p=1000LL; p<=n; p*=1000LL)
    +		ans += n - p + 1;
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Shipping Center

    +

    题目大意

    +

    我们有NN个包裹(包裹11,……,包裹NN)和MM个盒子(盒子11,……,盒子NN)。
    +第ii个包裹的大小和价值分别是WiW_iViV_i
    +第ii个盒子最多只能装一个大小为XiX_i的包裹。
    +给你QQ组询问,每组包含两个整数LLRR,请回答下列问题:

    +
      +
    • 在这MM个盒子中,盒子L,L+1,,RL,L+1,\dots,R暂时不可用。请把包裹放进剩余的盒子(不一定要全放)并输出最大可能的总价值。
    • +
    +

    1N,M,Q501\le N,M,Q\le 50
    +1Wi,Vi,Xi1061\le W_i,V_i,X_i\le 10^6
    +1LRM1\le L\le R\le M

    +

    输入格式

    +

    N M QN~M~Q
    +W1 V1W_1~V_1
    +\vdots
    +WN VNW_N~V_N
    +X1  XMX_1~\dots~X_M
    +L1 R1L_1~R_1
    +\vdots
    +LQ RQL_Q~R_Q

    +

    输出格式

    +

    输出QQ行。第ii行应该包含LiL_iRiR_i这个询问对应的答案。

    +

    样例

    +

    样例输入

    +
    3 4 3
    +1 9
    +5 3
    +7 8
    +1 8 6 9
    +4 4
    +1 4
    +1 3
    +
    +

    样例输出

    +
    20
    +0
    +9
    +
    +

    分析

    +

    这道题看似很像背包问题,其实不然。我们只需升序排序数组XX后,再按顺序贪心地为每个盒子选择它能拿到的价值最高的包裹即可。总时间复杂度为O(NMQ)\mathcal O(NMQ)

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 55
    +using namespace std;
    +
    +typedef pair<int, int> pii;
    +
    +pii bags[maxn], boxes[maxn];
    +bool taken[maxn];
    +
    +int main()
    +{
    +	int n, m, q;
    +	scanf("%d%d%d", &n, &m, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%d%d", &bags[i].second, &bags[i].first);
    +	sort(bags, bags + n, greater<pii>());
    +	for(int i=0; i<m; i++)
    +		scanf("%d", &boxes[i].first), boxes[i].second = i;
    +	sort(boxes, boxes + m);
    +	while(q--)
    +	{
    +		int l, r, ans = 0;
    +		scanf("%d%d", &l, &r);
    +		l --, r --;
    +		fill(taken, taken + n, false);
    +		for(int i=0; i<m; i++)
    +		{
    +			auto [size, idx] = boxes[i];
    +			if(idx < l || idx > r)
    +			{
    +				int j = 0;
    +				for(; j<n; j++)
    +					if(!taken[j] && bags[j].second <= size)
    +						break;
    +				if(j < n)
    +					ans += bags[j].first, taken[j] = true;
    +			}
    +		}
    +		printf("%d\n", ans);
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - Lucky 7 Battle

    +

    题目大意

    +

    我们有一个长度为NN、由数字0~9组成的字符串SS,和一个长度同样为NN、由AT组成的字符串XX
    +Takahashi和Aoki要用这两个字符串玩一个NN轮的游戏。最开始,他们有一个空的字符串TT。在第ii轮(1iN1\le i\le N),他们要做下列事情:

    +
      +
    • 如果XiX_iA,Aoki执行下面的操作;如果XiX_iT,则Takahashi执行下面的操作:
    • +
    • SiS_i或者0加到TT的后面。
    • +
    +

    NN个操作之后,TT会变成一个数字0~9组成的字符串。如果我们把它看成一个十进制数(去掉前导00),那么如果这个数为77的倍数,则Takahashi胜;相反,如果这个数不为77的倍数,则Aoki胜。

    +

    判断当两个人都按照最优操作进行游戏时,谁会赢。

    +

    1N1051\le N\le 10^5
    +S=X=N|S|=|X|=N

    +

    输入格式

    +

    NN
    +SS
    +XX

    +

    输出格式

    +

    输出胜者的名字(Takahashi或者Aoki)。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    这题首先很容易想到使用搜索。我们定义winner(i,r)= \mathrm{winner}(i,r)=~在第iiTmod7=rT\bmod7=r最终的赢家。
    +我们会发现,由于rr只有00~66,计算重复率较高,所以这题可以使用记忆化搜索来解决。

    +

    代码

    +
    #include <cstdio>
    +#include <cstring>
    +#define AO 0
    +#define TA 1
    +#define maxn 200005
    +using namespace std;
    +
    +char s[maxn], x[maxn];
    +int n, dp[maxn][7];
    +
    +int winner(int i, int r)
    +{
    +	if(dp[i][r] != -1) return dp[i][r];
    +	if(i >= n) return dp[i][r] = r == 0;
    +	if(winner(i + 1, 10 * r % 7) == TA)
    +	{
    +		if(x[i] == 'T')
    +			return dp[i][r] = TA;
    +	}
    +	else if(x[i] == 'A') return dp[i][r] = AO;
    +	if(winner(i + 1, (10 * r + s[i] - '0') % 7) == TA)
    +	{
    +		if(x[i] == 'T')
    +			return dp[i][r] = TA;
    +	}
    +	else if(x[i] == 'A') return dp[i][r] = AO;
    +	return dp[i][r] = x[i] == 'A';
    +}
    +
    +int main()
    +{
    +	scanf("%d%s%s", &n, s, x);
    +	memset(dp, -1, sizeof(dp));
    +	puts(winner(0, 0) == TA? "Takahashi": "Aoki");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc196/index.html b/post/abc196/index.html new file mode 100644 index 00000000..b6e1182c --- /dev/null +++ b/post/abc196/index.html @@ -0,0 +1,780 @@ + + + + + +AtCoder Beginner Contest 196 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 196 A~E 题解 +

    + +
    +
    + 2021-04-01 · 10 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Difference Max

    +

    题目大意

    +

    给定四个整数a,b,ca,b,cdd
    +我们要选择两个整数xxyyaxba\le x\le bcydc\le y\le d)。输出最大的xyx-y

    +

    100ab100-100\le a\le b\le 100
    +100cd100-100\le c\le d\le 100

    +

    输入格式

    +

    a  ba~~b
    +c  dc~~d

    +

    输出格式

    +

    输出最大的xyx-y

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    aabbccdd输出
    0010100010101010
    100-100100-100100100100100200200
    100-100100100100-100100100200200
    +

    分析

    +

    如果要xyx-y最大,那么xx要尽可能大、yy要尽可能小。因此,xx取最大值bbyy取最小值cc。所以,我们直接输出bcb-c即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c, d;
    +	scanf("%d%d%d%d", &a, &b, &c, &d);
    +	printf("%d\n", b - c);
    +	return 0;
    +}
    +
    +
    +

    B - Round Down

    +

    题目大意

    +

    给定一个数XX,求X\lfloor X\rfloor

    +

    0X101000\le X\le 10^{100}

    +

    输入格式

    +

    XX

    +

    输出格式

    +

    输出X\lfloor X\rfloor

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    XX输出
    5.905.9055
    0000
    84939825309432908832902189.909230940980909132984939825309432908832902189.90923094098090913298493982530943290883290218984939825309432908832902189
    +

    分析

    +

    只需找到小数点并将其及后面的数位删去再输出即可。例如:5.905\sout{.90}

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	char c;
    +	while((c = getchar()) != '\n')
    +	{
    +		if(c == '.') return 0;
    +		putchar(c);
    +	}
    +	return 0;
    +}
    +
    +
    +

    C - Doubled

    +

    题目大意

    +

    11~NN之间有多少个数是另一个正整数重复两遍得来的?

    +

    1N<10121\le N<10^{12}

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    NN输出
    333333
    133313331313
    1000000010000000999999
    +

    分析

    +

    这道题说白了就是要找到最大的XX,使得XX重复两遍不超过NN,并输出XX。我们可以使用二分法求出最大的XX
    +注意:这里的二分右边界最好设置为N\sqrt N,否则一不小心就会溢出!

    +

    代码

    +
    #include <cstdio>
    +#include <cmath>
    +using namespace std;
    +
    +typedef long long LL;
    +
    +inline bool check(const LL& x, const LL& n)
    +{
    +	LL p = 1LL;
    +	while(p <= x) p *= 10LL;
    +	return x * p + x <= n;
    +}
    +
    +int main()
    +{
    +	LL n;
    +	scanf("%lld", &n);
    +	LL l = 0LL, r = sqrt(n);
    +	while(l < r)
    +	{
    +		LL mid = l + r + 1LL >> 1LL;
    +		if(check(mid, n)) l = mid;
    +		else r = mid - 1;
    +	}
    +	printf("%lld\n", l);
    +	return 0;
    +}
    +
    +
    +

    D - Hanjo

    +

    题目大意

    +

    有一个H×WH\times W的地板,请你在地板上铺砖。
    +有两种地砖:aabbaa地砖有AA个,是2×12\times1的可旋转长方形。bb地砖有BB个,是1×11\times1的正方形。问要将这个地板正好铺满,总共有多少种铺法?

    +

    1H,W,HW161\le H,W,HW\le 16
    +0A,B0\le A,B
    +2A+B=HW2A+B=HW

    +

    输入格式

    +

    H W A BH~W~A~B

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HHWWAABB输出
    2222112244
    333344111818
    444488003636
    +

    分析

    +

    由于数据范围较小,我们可以用暴力搜索解决这道题。注意,这里搜索时为了避免重复计算,我们每次递归只尝试一个位置,这样还能有效加速。具体请看代码。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 20
    +using namespace std;
    +
    +bool mat[maxn][maxn];
    +int h, w, a, b, ans;
    +
    +inline bool valid(int x, int y)
    +{
    +	return !mat[x][y] && x >= 0 && x < h && y >= 0 && y < w;
    +}
    +
    +void dfs(int i, int j, int usedA, int usedB)
    +{
    +	if((usedA << 1) + usedB == h * w)
    +	{
    +		ans ++;
    +		return;
    +	}
    +	if(i == h) return;
    +	int ni, nj;
    +	if(j == w - 1) ni = i + 1, nj = 0;
    +	else ni = i, nj = j + 1;
    +	if(mat[i][j])
    +	{
    +		dfs(ni, nj, usedA, usedB);
    +		return;
    +	}
    +	mat[i][j] = true;
    +	// Rectangle (A)
    +	if(usedA < a)
    +	{
    +		if(valid(i, j + 1))
    +		{
    +			mat[i][j + 1] = true;
    +			dfs(ni, nj, usedA + 1, usedB);
    +			mat[i][j + 1] = false;
    +		}
    +		if(valid(i + 1, j))
    +		{
    +			mat[i + 1][j] = true;
    +			dfs(ni, nj, usedA + 1, usedB);
    +			mat[i + 1][j] = false;
    +		}
    +	}
    +	// Square (B)
    +	if(usedB < b) dfs(ni, nj, usedA, usedB + 1);
    +	mat[i][j] = false;
    +}
    +
    +int main()
    +{
    +	scanf("%d%d%d%d", &h, &w, &a, &b);
    +	dfs(0, 0, 0, 0);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Filters

    +

    题目大意

    +

    给定三个整数序列A=(a1,a2,,aN)A = (a_1, a_2, \dots, a_N)T=(t1,t2,,tN)T = (t_1, t_2, \dots, t_N)X=(x1,x2,,xQ)X = (x_1, x_2, \dots, x_Q)
    +我们如下定义NN个函数f1(x),f2(x),,fN(x)f_1(x), f_2(x), \dots, f_N(x)
    +fi(x)={x+ai(ti=1)max(x,ai)(ti=2)min(x,ai)(ti=3)f_i(x) = \begin{cases} x + a_i & (t_i = 1)\\ \max(x, a_i) & (t_i = 2)\\ \min(x, a_i) & (t_i = 3)\\ \end{cases}
    +对于每个i=1,2,,Qi = 1, 2, \dots, Q,求fN(f2(f1(xi)))f_N( \dots f_2(f_1(x_i)) \dots )

    +

    1N,Q2×1051 \le N,Q \le 2 \times 10^5
    +ai,xi109|a_i|,|x_i|\le 10^9
    +1ti31 \le t_i \le 3

    +

    输入格式

    +

    NN
    +a1 t1a_1~t_1
    +a2 t2a_2~t_2
    +\vdots
    +aN tNa_N~t_N
    +QQ
    +x1 x2 xqx_1~x_2~\dotsx x_q

    +

    输出格式

    +

    输出QQ行。第ii行应该包含fN(f2(f1(xi)))f_N( \dots f_2(f_1(x_i)) \dots )

    +

    样例

    +

    样例输入

    +
    3
    +-10 2
    +10 1
    +10 3
    +5
    +-15 -10 -5 0 5
    +
    +

    样例输出

    +
    0
    +0
    +5
    +10
    +10
    +
    +

    在这里,f1(x)=max(x,10),f2(x)=x+10,f3(x)=min(x,10)f_1(x) = \max(x, -10), f_2(x) = x + 10, f_3(x) = \min(x, 10),则有:

    +
      +
    • f3(f2(f1(15)))=0f_3(f_2(f_1(-15))) = 0
    • +
    • f3(f2(f1(10)))=0f_3(f_2(f_1(-10))) = 0
    • +
    • f3(f2(f1(5)))=5f_3(f_2(f_1(-5))) = 5
    • +
    • f3(f2(f1(0)))=10f_3(f_2(f_1(0))) = 10
    • +
    • f3(f2(f1(5)))=10f_3(f_2(f_1(5))) = 10
    • +
    +

    分析

    +

    (参考AtCoder官方题解
    +很容易想到,我们可以直接照做,即分别计算每个fN(f2(f1(xi)))f_N( \dots f_2(f_1(x_i)) \dots )。但是,这样做的时间复杂度是O(NQ)\mathcal O(NQ),所以肯定会TLE
    +我们考虑它们的复合函数F(x)=fN(f2(f1(xi)))F(x)=f_N( \dots f_2(f_1(x_i)) \dots )在图上怎么表示。

    +
      +
    • ti=1t_i=1fif_i是将图整体平移的操作;
    • +
    • ti=2t_i=2fif_i是将图的最小值设为aia_i
    • +
    • ti=3t_i=3fif_i是将图的最大值设为aia_i
    • +
    +

    所以,我们可以得到下图:
    +F(x)和x的关系

    +

    或者说,存在三个数a,b,ca,b,c使得F(x)=min(c,max(b,x+a))F(x)=\min(c,\max(b,x+a))
    +关于a,b,ca,b,c的具体计算请看代码。

    +

    代码

    +

    注意:这里的代码中的\inftyINF)一定不能直接设为long long的最大值,否则会溢出!

    +
    #include <cstdio>
    +#include <algorithm>
    +#include <climits>
    +using namespace std;
    +
    +typedef long long LL;
    +const LL INF = LLONG_MAX >> 1LL;
    +
    +int main()
    +{
    +	LL l = -INF, r = INF, add = 0LL;
    +	int n, q;
    +	scanf("%d", &n);
    +	while(n--)
    +	{
    +		LL a, t;
    +		scanf("%lld%lld", &a, &t);
    +		if(t == 1) l += a, r += a, add += a;
    +		else if(t == 2) l = max(l, a), r = max(r, a);
    +		else l = min(l, a), r = min(r, a);
    +	}
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		LL x;
    +		scanf("%lld", &x);
    +		printf("%lld\n", clamp(x + add, l, r));
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc198/index.html b/post/abc198/index.html new file mode 100644 index 00000000..5746e485 --- /dev/null +++ b/post/abc198/index.html @@ -0,0 +1,829 @@ + + + + + +AtCoder Beginner Contest 198 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 198 A~E 题解 +

    + +
    +
    + 2021-04-13 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Div

    +

    题目大意

    +

    两个男孩要分NN颗糖。问一共有几种分法(每个男孩都必须分到糖)?

    +

    1N151\le N\le 15

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    将答案输出为一个整数。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    NN输出
    2211
    1100
    3322
    +

    分析

    +

    这题说白了就是将NN分成AABB两个正整数的和(A+BA+BB+AB+A是两种分法),所以列表如下:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABB
    11N1N-1
    22N2N-2
    \dots\dots
    N1N-111
    这个表一共有N1N-1项,所以我们直接输出N1N-1即可。
    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	printf("%d\n", n - 1);
    +	return 0;
    +}
    +
    +
    +

    B - Palindrome with leading zeros

    +

    题目大意

    +

    给定一个整数NN
    +是否可以在NN的十进制表示的前面填上任意(可以为00)个0,使得NN变成一个回文数?

    +

    0N1090\le N\le 10^9

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出Yes或者No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    NN输出
    12101210Yes
    777777Yes
    123456789123456789No
    +

    分析

    +

    如果能在NN的前面加上一些0使得NN变成一个回文数,那么将NN去掉末尾的所有0后也一定能得到一个回文数。所以,我们只需将NN末尾的0去掉后,再判断它是不是一个回文数即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +char s[10];
    +
    +int main()
    +{
    +	char c;
    +	int len = 0;
    +	while((c = getchar()) != '\n')
    +		s[len++] = c;
    +	while(len > 0 && s[--len] == '0');
    +	for(int i=0; i<=len; i++)
    +		if(s[i] != s[len - i])
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +	puts("Yes");
    +	return 0;
    +}
    +
    +
    +

    C - Compass Walking

    +

    题目大意

    +

    在一个二维的平面上,一个人每一步都只能走正好RR个距离单位。
    +这个人从(0,0)(0,0)走到(X,Y)(X,Y)至少需要多少步?
    +注意:在二维平面上,两个点(x1,y1)(x_1, y_1)(x2,y2)(x_2,y_2)的距离是(x1x2)2+(y1y2)2\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

    +

    1R1051\le R\le 10^5
    +0X,Y1050\le X,Y\le 10^5
    +(X,Y)(0,0)(X,Y)\ne(0,0)

    +

    输入格式

    +

    R X YR~X~Y

    +

    输出格式

    +

    输出一行,即最少需要的步数。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RRXXYY输出
    5515150033
    5511110033
    33444422
    +

    分析

    +

    我们可以先定义d=X2+Y2d=\sqrt{X^2+Y^2},即(X,Y)(X,Y)(0,0)(0,0)的距离,则有如下解法:

    +
      +
    • 如果d=Rd=R,则总共只需要11步。
    • +
    • 如果d<Rd<R,则总共需要22步。
    • +
    • 如果d>Rd>R,总共需要dr\lceil\frac d r\rceil步。
    • +
    +

    这样,我们就可以写代码了。

    +

    代码

    +

    这题很容易出现精度问题,但我用long double居然卡过去了……

    +
    #include <cstdio>
    +#include <cmath>
    +using namespace std;
    +
    +int main()
    +{
    +	int r, x, y;
    +	scanf("%d%d%d", &r, &x, &y);
    +	long double dist = hypotl(x, y);
    +	if(dist == r) puts("1");
    +	else if(dist < r) puts("2");
    +	else printf("%d\n", int(ceill(dist / r)));
    +	return 0;
    +}
    +
    +
    +

    D - Send More Money

    +

    题目大意

    +

    注意:本题的时间限制是55秒。
    +给定三个由小写字母组成的字符串S1,S2,S3S_1,S_2,S_3
    +在这里,相同的字母表示相同的数字,不同的字母表示不同的数字。
    +我们要找到一种每个字母对应的数字,并将它们分别填入S1,S2,S3S_1,S_2,S_3,变成三个无前导00的正整数N1,N2,N3N_1,N_2,N_3,使得N1+N2=N3N_1+N_2=N_3。如果有多组解,找到任意一组即可。

    +

    1S1,S2,S3101\le |S_1|,|S_2|,|S_3|\le 10

    +

    输入格式

    +

    S1S_1
    +S2S_2
    +S3S_3

    +

    输出格式

    +

    如果有解,输出三行,即N1,N2N_1,N_2N3N_3;如果无解,输出UNSOLVABLE

    +

    样例

    +

    |S1S_1|S2S_2|S3S_3|输出|
    +|--|--|--|--|--|--|
    +|a|b|c|1 2 3|
    +|x|x|y|1 1 2|
    +|p|q|p|UNSOLVABLE|

    +

    分析

    +

    很容易想到,因为每位能填的数字只有0099(一共1010个),所以如果S1,S2S_1,S_2S3S_3中总共不同的字母个数超过1010个,我们就可以直接认为这个等式无解。
    +现在,由于这道题时间限制较长,我们就可以暴力枚举每一种字母对应的数字(一共最多有10!=362880010!=3628800种可能),再逐个填入并验证即可。

    +

    代码

    +

    这里的枚举我是用全排列做的,当然也可以用回溯法等,方法不限。

    +
    #include <cstdio>
    +#include <set>
    +#include <algorithm>
    +#define maxl 15
    +using namespace std;
    +
    +using LL = long long;
    +
    +char s1[maxl], s2[maxl], s3[maxl], ch[maxl];
    +
    +set<char> chars;
    +int pos[26], num[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    +
    +#define N (num[pos[str[i] - 'a']])
    +inline LL parse(const char* str)
    +{
    +	LL res = 0LL;
    +	for(int i=0; str[i]; i++)
    +		res = res * 10LL + N;
    +	return res;
    +}
    +
    +inline void print(const char* str)
    +{
    +	for(int i=0; str[i]; i++)
    +		putchar(N + '0');
    +	putchar('\n');
    +}
    +#undef N
    +
    +inline void add(const char* str)
    +{
    +	for(int i=0; str[i]; i++)
    +		chars.insert(str[i]);
    +}
    +
    +inline bool isok(const char* str)
    +{
    +	return num[pos[str[0] - 'a']] != 0;
    +}
    +
    +int main()
    +{
    +	scanf("%s%s%s", s1, s2, s3);
    +	add(s1), add(s2), add(s3);
    +	if(chars.size() > 11)
    +	{
    +		puts("UNSOLVABLE");
    +		return 0;
    +	}
    +	int cnt = 0;
    +	for(char x: chars)
    +		pos[x - 'a'] = cnt++;
    +	do
    +	{
    +		if(isok(s1) && isok(s2) && isok(s3) && (parse(s1) + parse(s2) == parse(s3)))
    +		{
    +			print(s1);
    +			print(s2);
    +			print(s3);
    +			return 0;
    +		}
    +	} while(next_permutation(num, num + 10));
    +	puts("UNSOLVABLE");
    +	return 0;
    +}
    +
    +
    +

    P.S. 这段代码的运行速度不可思议的快…… 居然只花了109109ms……

    +
    +
    +

    E - Unique Color

    +

    题目大意

    +

    给你一棵由编号为1,2, ,N1,2,~\dots,NNN个顶点组成的树。其中,第ii条边连接着顶点AiA_iBiB_i。第ii个顶点的颜色是CiC_i(在这里,颜色用一个整数表示)。
    +我们定义一个顶点xx好的,仅当如下条件成立:

    +
      +
    • 从顶点11到顶点xx的最短路径上,没有与顶点xx颜色相同的点(顶点xx本身除外)。
    • +
    +

    找到所有的好的顶点。

    +

    2N1052\le N\le 10^5
    +1Ci1051\le C_i\le 10^5
    +1Ai,Bi1051\le A_i,B_i\le 10^5

    +

    输入格式

    +

    NN
    +C1  CNC_1~\dots~C_N
    +A1 B1A_1~B_1
    +\vdots
    +AN1 BN1A_{N-1}~B_{N-1}

    +

    输出格式

    +

    输出所有的好的顶点,按升序排序,每行一个。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    其实这题用最朴素的DFS\text{DFS}算法就能解决。
    +我们在搜索的同时,维护一个used\text{used}数组,记录每个颜色在路径上是否已经用过。这样,我们就能O(1)\mathcal O(1)地判断每个点是否是一个好的点,最后排序并输出即可。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#include <set>
    +#define maxn 100005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +bool used[maxn];
    +int color[maxn];
    +
    +set<int> res;
    +
    +void dfs(int v, int par)
    +{
    +	if(used[color[v]])
    +	{
    +		for(int u: G[v])
    +			if(u != par)
    +				dfs(u, v);
    +		return;
    +	}
    +	used[color[v]] = true;
    +	res.insert(v);
    +	for(int u: G[v])
    +		if(u != par)
    +			dfs(u, v);
    +	used[color[v]] = false;
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=1; i<=n; i++)
    +		scanf("%d", color + i);
    +	while(--n)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[x].push_back(y);
    +		G[y].push_back(x);
    +	}
    +	dfs(1, -1);
    +	for(int v: res)
    +		printf("%d\n", v);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc199/index.html b/post/abc199/index.html new file mode 100644 index 00000000..afa62f3a --- /dev/null +++ b/post/abc199/index.html @@ -0,0 +1,872 @@ + + + + + +AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解 +

    + +
    +
    + 2021-06-13 · 13 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Square Inequality

    +

    题目大意

    +

    给定三个整数A,B,CA,B,C。判断A2+B2<C2A^2+B^2<C^2是否成立。

    +

    0A,B,C10000\le A,B,C\le 1000

    +

    输入格式

    +

    A B CA~B~C

    +

    输出格式

    +

    如果A2+B2<C2A^2+B^2<C^2,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBCC输出
    222244Yes
    101010101010No
    334455No
    +

    分析

    +

    直接按题意计算即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	puts(a * a + b * b < c * c? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Intersection

    +

    题目大意

    +

    给定两个长度为NN的序列:A=(A1,A2,A3,,AN)A = (A_1, A_2, A_3, \dots, A_N)B=(B1,B2,B3,,BN)B = (B_1, B_2, B_3, \dots, B_N)
    +找到符合如下条件的整数xx的个数:

    +
      +
    • 对于所有的1iN1\le i\le NAixBiA_i\le x\le B_i
    • +
    +

    1N1001\le N\le 100
    +1AiBi10001\le A_i\le B_i\le 1000

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N
    +B1 B2  BNB_1~B_2~\dots~B_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    2
    +3 2
    +7 5
    +
    +

    样例输出1

    +
    3
    +
    +

    xx可以取3,4,53,4,5

    +

    样例输入2

    +
    3
    +1 5 3
    +10 7 3
    +
    +

    样例输出2

    +
    0
    +
    +

    没有xx符合条件。

    +

    样例输入3

    +
    3
    +3 2 5
    +6 9 8
    +
    +

    样例输出3

    +
    2
    +
    +

    分析

    +

    我们将xx的限制条件拆解为:

    +
      +
    • 对于所有的1iN1\le i\le NAixA_i\le x
    • +
    • 对于所有的1iN1\le i\le NxBix\le B_i
    • +
    +

    这时,我们可以进一步简化条件:

    +
      +
    • (maxA)x(\max A)\le x
    • +
    • x(minB)x\le (\min B)
    • +
    +

    从而得到(maxA)x(minB)(\max A)\le x\le (\min B),所以合法的xx的个数为max(0,minBmaxA+1)\max(0,\min B-\max A+1)

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, maxa = 1, minb = 1000;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		if(a > maxa) maxa = a;
    +	}
    +	while(n--)
    +	{
    +		int b;
    +		scanf("%d", &b);
    +		if(b < minb) minb = b;
    +	}
    +	if(maxa > minb) puts("0");
    +	else printf("%d\n", minb - maxa + 1);
    +	return 0;
    +}
    +
    +
    +

    C - IPFL

    +

    题目大意

    +

    给定长度为2N2N且只由大写英文字母组成的字符串SS
    +你要处理QQ个请求。
    +第ii个请求中由三个整数Ti,AiT_i,A_iBiB_i组成:

    +
      +
    • 如果Ti=1T_i=1:交换SS中第AiA_iBiB_i个字符;
    • +
    • 如果Ti=2T_i=2,交换SS中的前NN个和后NN个字符(如:FLIP\toIPFL)。
    • +
    +

    输出执行所有请求后的SS

    +

    1N2×1051\le N\le 2\times 10^5
    +S=2N|S|=2N
    +1Q3×1051\le Q\le 3\times 10^5
    +1Ti21\le T_i\le 2,如果Ti=1T_i=11Ai<Bi2N1\le A_i < B_i\le 2N;如果Ti=2T_i=2Ai=Bi=0A_i=B_i=0

    +

    输入格式

    +

    NN
    +SS
    +QQ
    +T1 A1 B1T_1~A_1~B_1
    +T2 A2 B2T_2~A_2~B_2
    +\hspace{18pt}\vdots
    +TQ AQ BQT_Q~A_Q~B_Q

    +

    样例

    +

    样例输入1

    +
    2
    +FLIP
    +2
    +2 0 0
    +1 1 4
    +
    +

    样例输出1

    +
    LPFI
    +
    +

    FLIPIPFLLPFI\text{FLIP}\to\text{IPFL}\to\text{LPFI}

    +

    样例输入2

    +
    2
    +FLIP
    +6
    +1 1 3
    +2 0 0
    +1 1 2
    +1 2 3
    +2 0 0
    +1 1 4
    +
    +

    样例输出2

    +
    ILPF
    +
    +

    分析

    +

    首先,O(NQ)\mathcal O(NQ)的模拟法肯定行不通,会TLE
    +我们考虑优化。
    +我们很容易发现,Ti=1T_i=1的交换操作肯定是O(1)\mathcal O(1)的,但Ti=2T_i=2的翻转操作是O(n)\mathcal O(n)的,所以需要优化。
    +我们可以用一个变量flipped\mathrm{flipped}记录目前是否已经前后翻转(11表示已经翻转,00表示没有翻转),这时,操作变为如下:

    +
      +
    • Ti=2T_i=2flipped:=1flipped\mathrm{flipped}:=1-\mathrm{flipped}
    • +
    • Ti=1T_i=1flipped=0\mathrm{flipped}=0时,我们直接交换AiA_iBiB_i
    • +
    • Ti=flipped=1T_i=\mathrm{flipped}=1时,我们发现,一个位置xx如果<N<N,则实际位置在x+Nx+N;否则,实际位置在xNx-N
    • +
    +

    这种算法的时间复杂度为O(N+Q)\mathcal O(N+Q),可轻松通过此题。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 400005
    +using namespace std;
    +
    +char s[maxn];
    +int n;
    +
    +inline void swap(char& x, char& y) { x ^= y ^= x ^= y; }
    +inline char& calc(int pos) { return s[pos < n? pos + n: pos - n]; }
    +
    +int main()
    +{
    +	scanf("%d%s", &n, s);
    +	int q;
    +	scanf("%d", &q);
    +	bool flipped = false;
    +	while(q--)
    +	{
    +		int t, a, b;
    +		scanf("%d%d%d", &t, &a, &b);
    +		a --, b --;
    +		if(t == 2) flipped = !flipped;
    +		else if(flipped) swap(calc(a), calc(b));
    +		else swap(s[a], s[b]);
    +	}
    +	if(flipped)
    +		for(int i=0; i<n; i++)
    +			swap(s[i], s[n + i]);
    +	puts(s);
    +	return 0;
    +}
    +
    +
    +

    D - RGB Coloring 2

    +

    题目大意

    +

    我们有一个有NN个点和MM条边的简单无向图,第ii条边连接着顶点AiA_iBiB_i
    +我们要给这个图用三种不同的颜色着色,使得相邻的顶点有不同的颜色。
    +有多少种合法的着色方法?不一定要使用所有颜色。

    +

    1N201\le N\le 20
    +0MN(N1)20\le M\le \frac{N(N-1)}2
    +1Ai,BiN1\le A_i,B_i\le N

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +A2 B2A_2~B_2
    +\hspace{12pt}\vdots
    +AM BMA_M~B_M

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    3 3
    +1 2
    +2 3
    +3 1
    +
    +

    样例输出1

    +
    6
    +
    +

    我们用RGB分别代表三种不同的颜色,则有66中不同的着色方法,它们分别是RGBRBGGRBGBRBRGBGR

    +

    样例输入2

    +
    3 0
    +
    +

    样例输出2

    +
    27
    +
    +

    这个图没有边,所以任意着色都是可行的,一共有3N=273^N=27种方法。

    +

    样例输入3

    +
    4 6
    +1 2
    +2 3
    +3 4
    +2 4
    +1 3
    +1 4
    +
    +

    样例输出3

    +
    0
    +
    +

    这里没有合法方案。

    +

    样例输入4

    +
    20 0
    +
    +

    样例输出4

    +
    3486784401
    +
    +

    分析

    +

    我们将图中的每个连通块依次暴力算出所有可能的着色方案数,再相乘即可。
    +其实,这里我们最大的总尝试数不是3N3^N,而是3×2N13\times 2^{N-1},因为使用DFS\text{DFS}时每个点的前一个点的颜色已经定好了,只需要尝试两种可能即可。

    +

    代码

    +

    似乎没人发现可以用unsigned int吧……

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 25
    +using namespace std;
    +
    +vector<int> G[maxn];
    +int col[maxn], dep[maxn];
    +
    +inline int next(int c) { return (c + 1) % 3; }
    +
    +int paint(int v)
    +{
    +	for(int u: G[v])
    +		if(col[v] == col[u])
    +			return 0;
    +	int ans = 1;
    +	for(int u: G[v])
    +	{
    +		if(dep[u] == -1) dep[u] = dep[v] + 1;
    +		if(dep[u] == dep[v] + 1)
    +		{
    +			col[u] = next(col[v]);
    +			int res = paint(u);
    +			col[u] = next(col[u]);
    +			res += paint(u);
    +			col[u] = -1;
    +			if(res == 0) return 0;
    +			ans *= res;
    +		}
    +	}
    +	return ans;
    +}
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[--x].push_back(--y);
    +		G[y].push_back(x);
    +	}
    +	for(int i=0; i<n; i++)
    +		col[i] = dep[i] = -1;
    +	unsigned int ans = 1;
    +	for(int i=0; i<n; i++)
    +		if(dep[i] == -1)
    +		{
    +			col[i] = dep[i] = 0;
    +			ans *= 3U * paint(i);
    +		}
    +	printf("%u\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Permutation

    +

    题目大意

    +

    求符合如下条件的(1,2,,N)(1,2,\dots,N)的排列的个数:

    +
      +
    • 对于每个1iM1\le i\le M,这个排列的前XiX_i个数中不超过YiY_i的最多有ZiZ_i个。
    • +
    +

    2N182\le N\le 18
    +0M1000\le M\le 100
    +1Xi,Yi<N1\le X_i,Y_i < N
    +0Zi<N0\le Z_i < N

    +

    输入格式

    +

    N MN~M
    +X1 Y1 Z1X_1~Y_1~Z_1
    +X2 Y2 Z2X_2~Y_2~Z_2
    +\hspace{18pt}\vdots
    +XM YM ZMX_M~Y_M~Z_M

    +

    输出格式

    +

    输出一个整数,即符合条件的排列的个数。

    +

    样例

    +

    样例输入1

    +
    3 1
    +2 2 1
    +
    +

    样例输出1

    +
    4
    +
    +

    四个符合条件的排列分别为:(1,2,3)(1,2,3)(2,3,1)(2,3,1)(3,1,2)(3,1,2)(3,2,1)(3,2,1)

    +

    样例输入2

    +
    5 2
    +3 3 2
    +4 4 3
    +
    +

    样例输出2

    +
    90
    +
    +

    样例输入3

    +
    18 0
    +
    +

    样例输出3

    +
    6402373705728000
    +
    +

    由于没有限制条件,所有的18!=640237370572800018!=6402373705728000个排列都可行。这也是本题的最大输出。

    +

    分析

    +

    首先,还是先排除O(N!X)\mathcal O(N!\sum X)的暴力算法,这样做的时间复杂度太高了。
    +我们考虑状压DP\text{DP}。令dpmask\mathrm{dp}_\mathrm{mask}表示从(1,2,,N)(1,2,\dots,N)中选出子序列mask\mathrm{mask}(二进制第ii位是00表示不选ii11表示选ii)。
    +则,dp0=1\mathrm{dp}_0=1,动态转移方程为dpmask=mask\mathrm{dp}_\mathrm{mask}=\mathrm{mask}中所有为的11位上把11变成00dp\mathrm{dp}中的和,详见代码。
    +写代码时注意判断合法性,最终答案应为dp2N1\mathrm{dp}_{2^N-1}(全选)。

    +

    代码

    +

    我这里做了一个小优化,即忽略ZiYiZ_i\ge Y_i的条件。当然,我们也可以不用优化,但不能不用long long!!!

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 20
    +using namespace std;
    +
    +using LL = long long;
    +
    +vector<pair<int, int>> lim[maxn];
    +LL dp[1 << maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int x, y, z;
    +		scanf("%d%d%d", &x, &y, &z);
    +		if(z < y) lim[x].emplace_back(y, z);
    +	}
    +	int mx = 1 << n;
    +	dp[0] = 1LL;
    +	for(int st=0; st<mx; st++)
    +	{
    +		vector<int> s;
    +		for(int i=0; i<n; i++)
    +			if(st >> i & 1)
    +				s.push_back(i);
    +		int cnt = __builtin_popcount(st);
    +		bool ok = true;
    +		for(auto [y, z]: lim[cnt])
    +		{
    +			int tot = 0;
    +			for(auto x: s)
    +				if(x < y && ++tot > z)
    +				{
    +					ok = false;
    +					break;
    +				}
    +			if(!ok) break;
    +		}
    +		if(ok) for(int x: s) dp[st] += dp[st ^ (1 << x)];
    +	}
    +	printf("%lld\n", dp[mx - 1]);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc200/index.html b/post/abc200/index.html new file mode 100644 index 00000000..6f328bc4 --- /dev/null +++ b/post/abc200/index.html @@ -0,0 +1,814 @@ + + + + + +KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解 +

    + +
    +
    + 2021-06-10 · 12 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Century

    +

    题目大意

    +

    公元NN年在第几个世纪中?

    +
    +

    一个世纪是由100100个年份组成的一个区间。如,11世纪为[1,100][1,100]年,22世纪为[101,200][101,200]年,……

    +
    +

    1N30001\le N\le 3000

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    将答案输出为一个整数。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    202120212121
    20020022
    +

    分析

    +

    根据本题条件我们可以推出:公元NN年在世纪N100\lceil \frac N {100}\rceil

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	printf("%d\n", n % 100 == 0? n / 100: n / 100 + 1);
    +	return 0;
    +}
    +
    +
    +

    B - 200th ABC-200

    +

    题目大意

    +

    对于整数NN,执行KK次如下操作:

    +
      +
    • 如果NN200200的倍数,将NN除以200200
    • +
    • 否则,在NN后面添上200200。(如,123123变为123200123200)。
    • +
    +

    1N1051\le N\le 10^5
    +1K201\le K\le 20

    +

    输入格式

    +

    N KN~K

    +

    输出格式

    +

    输出最终的NN

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NNKK输出
    20212021445053150531
    40000400002211
    8691869120208487548828184875488281
    +

    分析

    +

    本题我们按照题意模拟即可,但我们需要证明答案不会超过26312^{63}-1,这样才能使用long long

    +
      +
    • 任何数NN添上200200都是200200的倍数。证明:一个数只要是10010022的公倍数,它就是200200的倍数。NN添上200200后以00结尾,就证明了它是200200的倍数。
    • +
    • 这样,NN每次添上200200后都要除以200200,相当于去掉两个零再将NN除以22
    • +
    • 所以,NN每次最多增加一位,还经常减少位数(除以200200),肯定严格小于2632^{63}
    • +
    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	long long n;
    +	int k;
    +	scanf("%lld%d", &n, &k);
    +	while(k--)
    +		n = n % 200LL == 0LL? n / 200LL: n * 1000LL + 200LL;
    +	printf("%lld\n", n);
    +	return 0;
    +}
    +
    +
    +

    C - Ringo's Favorite Numbers 2

    +

    题目大意

    +

    给定序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),找到符合下列条件的所有(i,j)(i,j)

    +
      +
    • 1i<jN1\le i < j\le N
    • +
    • AiAj|A_i-A_j|200200的倍数。
    • +
    +

    2N2×1052\le N\le 2\times 10^5
    +1Ai1091\le A_i\le 10^9

    +

    输出格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    AA输出
    (123,223,123,523,200,2000)(123,223,123,523,200,2000)44
    (1,2,3,4,5)(1,2,3,4,5)00
    (199,100,200,400,300,500,600,200)(199,100,200,400,300,500,600,200)99
    +

    分析

    +

    首先,最容易想到的O(n2)\mathcal O(n^2)的暴力算法肯定不行,因为2N2×1052\le N\le 2\times 10^5
    +我们考虑用桶优化:
    +我们有200200个桶,分别如下:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    桶的编号元素11元素22元素33元素44……元素除以200200的余数
    0000200200400400600600……00
    1111201201401401601601……11
    2222202202402402602602……22
    ……………………………………
    198198198198398398598598798798……198198
    199199199199399399599599799799……199199
    这时,我们发现,每个桶中的每个元素都能与这个同种的其他元素组成一对,所以我们只要在将元素加入桶中前将答案加上桶目前的大小即可。
    +

    总时间复杂度O(n)\mathcal O(n)

    +

    代码

    +

    我们的桶中不需要真正的元素,只需要记录桶的大小即可。
    +注意:答案的数据类型一定要用long long

    +
    #include <cstdio>
    +#define MOD 200
    +using namespace std;
    +
    +int cnt[MOD];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	long long ans = 0LL;
    +	while(n--)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		ans += cnt[x %= MOD] ++;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Happy Birthday! 2

    +

    题目大意

    +

    给定序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)。你要从中选出两个子序列BBCC(下标不同,不要求连续),使得BC(mod200)\sum B\equiv \sum C\pmod{200}

    +

    2N2002\le N\le 200
    +1Ai1091\le A_i\le 10^9

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出

    +

    如果没有合法的BBCC,输出No
    +如果有合法的BBCC,按下列格式输出,其中xxBB的长度、yyCC的长度,BB'BB中元素对应的下标,CC'CC中元素对应的下标:
    +Yes\text{Yes}
    +x B1 B2  Bxx~B'_1~B'_2~\dots~B'_x
    +y C1 C2  Cyy~C'_1~C'_2~\dots~C'_y

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    我们可以证明,只要N8N\ge 8,那么就一定有解。证明如下:

    +
      +
    • 88个元素能组成的子序列有281=2552^8-1=255种。(每个元素可以选或不选,去掉全不选的情况)
    • +
    • 根据抽屉原理,我们将这255255种子序列按照他们除以200200的余数分别放入抽屉中,则至少有两个子序列在一个抽屉中,即必定有合法的AABB
    • +
    +

    N<8N<8时,我们暴力枚举所有可能;
    +当N8N\ge8时,我们暴力枚举其中任意88个元素组成的所有可能即可找到解。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 10
    +#define MOD 200
    +using namespace std;
    +
    +int a[maxn];
    +vector<int> bkt[MOD];
    +
    +inline void print(const vector<int>& v)
    +{
    +	printf("%llu", v.size());
    +	for(int x: v)
    +		printf(" %d", x + 1);
    +	putchar('\n');
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	if(n > 8) n = 8;
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	int lim = 1 << n;
    +	for(int st=0; st<lim; st++)
    +	{
    +		int s = 0;
    +		vector<int> pos;
    +		for(int i=0; i<n; i++)
    +			if(st >> i & 1)
    +				s = (s + a[i]) % MOD, pos.push_back(i);
    +		if(!bkt[s].empty())
    +		{
    +			puts("Yes");
    +			print(bkt[s]);
    +			print(pos);
    +			return 0;
    +		}
    +		else bkt[s] = pos;
    +	}
    +	puts("No");
    +	return 0;
    +}
    +
    +
    +

    E - Patisserie ABC 2

    +

    题目大意

    +

    N3N^3个三元组(i,j,k)(i,j,k)1i,j,kN1\le i,j,k\le N),按如下排序:

    +
      +
    • i+j+ki+j+k小的排在前面。
    • +
    • 对于i+j+ki+j+k相同的三元组,ii小的排在前面,对于ii相同的,jj小的排在前面。
    • +
    +

    求第KK(i,j,k)(i,j,k)

    +

    1N1061\le N\le 10^6
    +1KN31\le K\le N^3

    +

    输入格式

    +

    N KN~K

    +

    输出格式

    +

    输出第KK(i,j,k)(i,j,k),用空格分隔。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NNKK输出
    22551 2 21~2~2
    10000001000000100000000000000000010000000000000000001000000 1000000 10000001000000~1000000~1000000
    9947473 1 43~1~4
    +

    分析

    +

    由于每个三元组的和都不会超过3N3N,所以我们考虑暴力枚举三元组的和,这样就能快速算出第KK个三元组的和。那么,问题来了:符合i+j+k=ni+j+k=n的三元组(i,j,k)(i,j,k)i,j,ki,j,k均不超过NN)有多少个?
    +这可以用容斥原理解决。首先,我们发现,上述问题实际上就是在求如下方程解的个数:

    +

    {i+j+k=n1i,j,kN\begin{cases}i+j+k=n\\1\le i,j,k\le N\end{cases} +

    +

    如果我们将问题改成求如下方程解的个数(注意nnNN的区别):

    +

    {i+j+k=n1i,j,kn\begin{cases}i+j+k=n\\1\le i,j,k\le n\end{cases} +

    +

    这个可以用挡板法解决,在n1n-1个位置上任选22个插入挡板,挡板分开的就是i,j,ki,j,k,则公式为Cn12C_{n-1}^2。我们设f(n)= f(n)=~上述方程解的个数(Cn12=(n1)(n2)C_{n-1}^2=(n-1)(n-2)),则总方程解的个数为f(n)f(n)
    +我们考虑一个、两个(不可能有三个)数大于NN的情况,这样{i+j+k=n1i,j,kN\begin{cases}i+j+k=n\\1\le i,j,k\le N\end{cases}这个方程解的个数就为f(n)+3f(n2N)3f(nN)f(n)+3f(n-2N)-3f(n-N)

    +

    代码

    +

    计算f(n)f(n)时注意特判n2n\le 2的情况,否则可能会出现负数!

    +
    #include <cstdio>
    +using namespace std;
    +
    +using LL = long long;
    +int n;
    +
    +inline int max(int x, int y) { return x > y? x: y; }
    +inline int min(int x, int y) { return x < y? x: y; }
    +
    +inline LL f(LL n) { return n-- > 2? n * (n - 1LL) >> 1LL: 0LL; }
    +inline LL count(int s) { return f(s) - 3 * (f(s - n) - f(s - (n << 1))); }
    +
    +int main()
    +{
    +	LL k;
    +	scanf("%d%lld", &n, &k);
    +	int lim = n * 3;
    +	for(int sum=3; sum<=lim; sum++)
    +	{
    +		LL cnt = count(sum);
    +		if(k > cnt) { k -= cnt; continue; }
    +		for(int a=1; a<=n; a++)
    +		{
    +			int minb = max(1, sum - a - n), maxb = min(n, sum - a - 1);
    +			if(minb > maxb) continue;
    +			int num = maxb - minb + 1;
    +			if(k <= num)
    +			{
    +				int b = minb + k - 1;
    +				int c = sum - a - b;
    +				printf("%d %d %d\n", a, b, c);
    +				return 0;
    +			}
    +			k -= num;
    +		}
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc201/index.html b/post/abc201/index.html new file mode 100644 index 00000000..8fb56610 --- /dev/null +++ b/post/abc201/index.html @@ -0,0 +1,773 @@ + + + + + +Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解 +

    + +
    +
    + 2021-05-18 · 17 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Tiny Arithmetic Sequence

    +

    题目大意

    +

    给定序列A=(A1,A2,A3)A=(A_1,A_2,A_3)。能否将AA重新排列,使得A3A2=A2A1A_3-A_2=A_2-A_1

    +

    1Ai1001\le A_i\le 100

    +

    输入格式

    +

    A1 A2 A3A_1~A_2~A_3

    +

    输出格式

    +

    如果能将AA重新排列使得A3A2=A2A1A_3-A_2=A_2-A_1,输出Yes;如果不能,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    AA输出
    (5,1,3)(5,1,3)Yes
    (1,4,3)(1,4,3)No
    (5,5,5)(5,5,5)Yes
    +

    分析

    +

    很容易想到,如果A3A2=A2A1A_3-A_2=A_2-A_1,则A1A2A3A_1\le A_2\le A_3A3A2A1A_3\le A_2\le A_1必定成立。
    +因此,我们可以先把AA按升序排列,再A3A2=A2A1A_3-A_2=A_2-A_1是否成立即可。

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +using namespace std;
    +
    +int main()
    +{
    +	int a[3];
    +	scanf("%d%d%d", a, a + 1, a + 2);
    +	sort(a, a + 3);
    +	puts(a[2] - a[1] == a[1] - a[0]? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Do you know the second highest mountain?

    +

    题目大意

    +

    NN坐山。第ii坐山有一个名字SiS_i和高度TiT_i
    +输出第二高的山的名字。

    +

    2N10002\le N\le 1000
    +1Si151\le |S_i|\le 15
    +1Ti1051\le T_i\le 10^5
    +SiSj (ij)S_i\ne S_j~(i\ne j)
    +TiTj (ij)T_i\ne T_j~(i\ne j)
    +SiS_i由大小写英文字母和数字组成。

    +

    输入格式

    +

    NN
    +S1 T1S_1~T_1
    +S2 T2S_2~T_2
    +\vdots
    +SN TNS_N~T_N

    +

    输出格式

    +

    输出第二高的山的名字。

    +

    样例

    +

    样例输入1

    +
    3
    +Everest 8849
    +K2 8611
    +Kangchenjunga 8586
    +
    +

    样例输出1

    +
    K2
    +
    +

    第二高的山是K2

    +

    样例输入2

    +
    4
    +Kita 3193
    +Aino 3189
    +Fuji 3776
    +Okuhotaka 3190
    +
    +

    样例输出2

    +
    Kita
    +
    +

    第二高的山是Kita

    +

    样例输入3

    +
    4
    +QCFium 2846
    +chokudai 2992
    +kyoprofriends 2432
    +penguinman 2390
    +
    +

    样例输出3

    +
    QCFium
    +
    +

    第二高的山是QCFium

    +

    分析

    +

    这道题其实就是给定求数组TT中第二大的元素的SiS_i。我们可以利用优先队列实现求第二大的元素。

    +

    代码

    +
    #include <iostream>
    +#include <queue>
    +#include <string>
    +using namespace std;
    +
    +using pis = pair<int, string>;
    +
    +int main()
    +{
    +	ios::sync_with_stdio(false); cin.tie(0);
    +	int n;
    +	cin >> n;
    +	priority_queue<pis, vector<pis>, greater<pis> > q;
    +	while(n--)
    +	{
    +		string s;
    +		int h;
    +		cin >> s >> h;
    +		q.emplace(h, s);
    +		if(q.size() > 2) q.pop();
    +	}
    +	cout << q.top().second << endl;
    +	return 0;
    +}
    +
    +
    +

    C - Secret Number

    +

    题目大意

    +

    有一个四位的PIN。这个PIN由0~9组成,也可能以0开头。
    +有一个字符串S0S1S9S_0S_1\dots S_9,代表每一种数字是否在这个PIN中出现:

    +
      +
    • 如果Si= S_i=~o,这个PIN肯定包含数字ii
    • +
    • 如果Si= S_i=~x,这个PIN肯定不包含数字ii
    • +
    • 如果Si= S_i=~?,这个PIN可能包含(也可能不包含)数字ii
    • +
    +

    有多少个合法的PIN?

    +

    SS是一个由ox?组成的长度为1010的字符串。

    +

    输入格式

    +

    SS

    +

    输出格式

    +

    将答案输出为一个整数。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    SS答案
    ooo???xxxx108108
    o?oo?oxoxo00
    xxxxx?xxxo1515
    极端测试点:S= S=~??????????,正确输出:1000010000
    +

    分析

    +

    因为可能的PIN数量非常少(最多只有1000010000个),所以我们考虑暴力枚举所有可能的PIN,即尝试00009999之间所有的PIN。对于每个可能的PIN,我们可以在O(S)\mathcal O(|S|)的时间内判断出它是否合法。
    +程序的总时间复杂度为O(10000S)\mathcal O(10000|S|),由于1000010000S|S|都是常数,所以也可以看作O(1)\mathcal O(1)

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +char s[15];
    +
    +inline bool valid(int a, int b, int c, int d)
    +{
    +	bool used[10] = {false};
    +	used[a] = used[b] = used[c] = used[d] = true;
    +	for(int i=0; i<10; i++)
    +		if(s[i] == 'o')
    +		{
    +			if(!used[i])
    +				return false;
    +		}
    +		else if(s[i] == 'x' && used[i])
    +			return false;
    +	return true;
    +}
    +
    +int main()
    +{
    +	scanf("%s", s);
    +	int ans = 0;
    +	for(int a=0; a<10; a++)
    +		for(int b=0; b<10; b++)
    +			for(int c=0; c<10; c++)
    +				for(int d=0; d<10; d++)
    +					ans += valid(a, b, c, d);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Game in Momotetsu World

    +

    题目大意

    +

    我们有一个H×WH\times W的棋盘,它上面每个小格子都是蓝色或红色的。棋盘上(i,j)(i,j)这个点的颜色取决于Ai,jA_{i,j}。如果Ai,j= A_{i,j}=~+,则(i,j)(i,j)为蓝;如果Ai,j= A_{i,j}=~-,则(i,j)(i,j)为红。
    +在棋盘上有一颗棋子,它的初始位置在左上角,也就是(1,1)(1,1)。Takahashi和Aoki要用这颗棋子对战。两人一开始都有00分,他们要轮流执行如下操作,Takahashi先走:

    +
      +
    • 将棋子往右或下移动(不能移出棋盘)。然后,如果移到的点是蓝色的,对应的玩家得一分;否则,玩家扣一分。
    • +
    +

    当棋子走到(H,W)(H,W)时,游戏结束。此时,如果两人得分相等,则视为平局;否则,得分多的人胜利。
    +当两人都按最优操作进行游戏时,求最终的游戏结果。

    +

    1H,W20001\le H,W\le 2000
    +Ai,jA_{i,j}+-

    +

    输入格式

    +

    H WH~W
    +A1,1A1,2A1,3A1,WA_{1,1}A_{1,2}A_{1,3}\dots A_{1,W}
    +A2,1A2,2A2,3A2,WA_{2,1}A_{2,2}A_{2,3}\dots A_{2,W}
    +\vdots
    +AH,1AH,2AH,3AH,WA_{H,1}A_{H,2}A_{H,3}\dots A_{H,W}

    +

    输出格式

    +

    如果Takahashi会赢,输出Takahashi;如果Aoki,输出Aoki;否则,游戏平局,输出Draw

    +

    样例

    +

    略,请自行前往AtCoder查看。

    +

    分析

    +

    本题可以使用动态规划的思想。
    +我们设dd(Takahashi目前的得分)(Aoki目前的得分)(\text{Takahashi目前的得分})-(\text{Aoki目前的得分}),则Takahashi的目标是最大化dd、Aoki的目标是最小化dd。我们很容易想到,对于棋子在(i,j)(i,j)时,如果(i+j)(i+j)是奇数,则Aoki走棋,如果它是偶数,则Takahashi走棋。
    +所以,对于棋盘上的每个点(i,j)(i,j)我们考虑如下dp\text{dp}

    +
      +
    • 如果(i+j)(i+j)是偶数:棋子在(i,j)(i,j)时最小的dd(这是Aoki走棋)。
    • +
    • 如果(i+j)(i+j)是奇数:棋子在(i,j)(i,j)时最大的dd(这是Takahashi走棋)。
    • +
    +

    我们设add(i,j)add(i,j)为玩家把棋子走到(i,j)(i,j)获得的分数,则有如下dp\text{dp}状态:

    +
      +
    • 如果(i+j)(i+j)是偶数:dp(i,j)=min(dp(i+1,j)add(i+1,j),dp(i,j+1)add(i,j+1))dp(i,j)=\min(dp(i+1,j)-add(i+1,j),dp(i,j+1)-add(i, j+1))
    • +
    • 如果(i+j)(i+j)是奇数:dp(i,j)=max(dp(i+1,j)+add(i+1,j),dp(i,j+1)+add(i,j+1))dp(i,j)=\max(dp(i+1,j)+add(i+1,j),dp(i,j+1)+add(i, j+1))
    • +
    +

    所以,最终我们只需要通过dp(0,0)dp(0,0)判断结果即可。如果dp(0,0)>0dp(0,0)>0,则Takahashi胜;如果dp(0,0)<0dp(0,0)<0,Aoki胜;否则,游戏平局。
    +程序的总时间复杂度为O(NM)\mathcal O(NM)

    +

    代码

    +

    注意:我这里的dp运用了滚动表的技巧,所以是一维的,当然也可以使用普通的二维dp。

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 2005
    +using namespace std;
    +
    +int dp[maxn], add[maxn][maxn];
    +
    +int main()
    +{
    +	int h, w;
    +	scanf("%d%d", &h, &w);
    +	for(int i=0; i<h; i++)
    +	{
    +		char tmp[maxn];
    +		scanf("%s", tmp);
    +		for(int j=0; j<w; j++)
    +			add[i][j] = tmp[j] == '+'? 1: -1;
    +	}
    +	dp[w - 1] = 0;
    +	for(int j=w-2; j>=0; j--)
    +		dp[j] = j + h & 1? dp[j + 1] + add[h - 1][j + 1]: dp[j + 1] - add[h - 1][j + 1];
    +	for(int i=h-2; i>=0; i--)
    +	{
    +		dp[w - 1] = i + w & 1? dp[w - 1] + add[i + 1][w - 1]: dp[w - 1] - add[i + 1][w - 1];
    +		for(int j=w-2; j>=0; j--)
    +			if(i + j & 1)
    +				dp[j] = min(dp[j] - add[i + 1][j], dp[j + 1] - add[i][j + 1]);
    +			else dp[j] = max(dp[j] + add[i + 1][j], dp[j + 1] + add[i][j + 1]);
    +	}
    +	if(dp[0] > 0) puts("Takahashi");
    +	else if(dp[0] < 0) puts("Aoki");
    +	else puts("Draw");
    +	return 0;
    +}
    +
    +
    +

    E - Xor Distances

    +

    题目大意

    +

    我们有一棵由NN个顶点组成的加权树。第ii条边双向连接着顶点uiu_iviv_i且有一个权值wiw_i
    +对于一对顶点(x,y)(x,y)xyx\ne y),我们如下定义dist(x,y)\mathrm{dist}(x,y)

    +
      +
    • dist(x,y)=x\mathrm{dist}(x,y)=xyy之间的最短路径经过的所有边权值的异或结果。
    • +
    +

    输出每对点(i,j)(i,j)dist(i,j)\mathrm{dist}(i,j)之和,对(109+7)(10^9+7)取模,即i=1N1j=i+1Ndist(i,j)mod(109+7)\sum\limits_{i=1}^{N-1}\sum\limits_{j=i+1}^N \mathrm{dist}(i,j)\bmod(10^9+7)

    +

    1N2×1051\le N\le 2\times10^5
    +1ui<viN1\le u_i < v_i\le N
    +0wi<2600\le w_i < 2^{60}

    +

    输入格式

    +

    NN
    +u1 v1 w1u_1~v_1~w_1
    +u2 v2 w2u_2~v_2~w_2
    +\vdots
    +uN1 vN1 wN1u_{N-1}~v_{N-1}~w_{N-1}

    +

    输出格式

    +

    输出每对点(i,j)(i,j)dist(i,j)\mathrm{dist}(i,j)之和,对(109+7)(10^9+7)取模。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    首先,我们先看数据范围。
    +1N2×1051\le N\le 2\times10^5
    +这样一来,最暴力的O(n3)\mathcal O(n^3)解法,即枚举所有对点O(n2)\mathcal O(n^2)、找最短路O(n)\mathcal O(n)就肯定不行了。
    +其次,我们尝试优化暴力过程,考虑异或(\oplus)的几个特征:

    +
      +
    • 0A=A0\oplus A = A
    • +
    • AA=0A\oplus A = 0
    • +
    • AB=BAA\oplus B = B\oplus A
    • +
    • ABB=AA\oplus B\oplus B = A
    • +
    +

    最后一个特征(异或再异或会抵消掉)实际上就是在告诉我们,dist(x,y)=dist(n,x)dist(n,y)\mathrm{dist}(x,y)=\mathrm{dist}(n,x)\oplus\mathrm{dist}(n,y),因为(n,y)(n,y)的最短路径中到nn的多余的一部分直接被最后一次异或抵消掉了。如果不能理解上面的证明,可以用下面的方法证明(设kkxxyy的最小共同祖先):

    +

    dist(x,y)=dist(x,k)dist(y,k)=dist(x,k)dist(y,k)(dist(n,k)dist(n,k))=(dist(x,k)dist(n,k))(dist(y,k)dist(n,k))=dist(x,n)dist(y,n)\begin{aligned}\mathrm{dist}(x,y)&=\mathrm{dist}(x,k)\oplus\mathrm{dist}(y,k)\\&=\mathrm{dist}(x,k)\oplus\mathrm{dist}(y,k)\oplus(\mathrm{dist}(n,k)\oplus\mathrm{dist}(n,k))\\&=(\mathrm{dist}(x,k)\oplus\mathrm{dist}(n,k))\oplus(\mathrm{dist}(y,k)\oplus\mathrm{dist}(n,k))\\&=\mathrm{dist}(x,n)\oplus\mathrm{dist}(y,n)\end{aligned} +

    +

    这时,我们可以令n=1n=1,并从nn开始跑一遍搜索,计算出所有的dist(n,x)\mathrm{dist}(n,x)(时间复杂度O(n)\mathcal O(n)),再对所有的(i,j)(i,j)求出所有的dist(n,i)dist(n,j)\mathrm{dist}(n,i)\oplus\mathrm{dist}(n,j)并求和(时间复杂度O(n2)\mathcal O(n^2)),算出结果。这样做的总时间复杂度为O(n2)\mathcal O(n^2)。可惜,这样还是过不去。
    +我们考虑进一步优化。我们发现,对于每个二进制位,在异或的操作下,一个11和一个00就能组成一个11。所以,我们可以统计每一位的0011的个数,计算它们的乘积并相加即可。

    +

    代码

    +

    这里的搜索推荐BFS\text{BFS},因为这道题中它比DFS\text{DFS}好写且更快,当然DFS\text{DFS}也可以实现。

    +
    #include <cstdio>
    +#include <queue>
    +#pragma GCC optimize("Ofast")
    +#define maxn 200005
    +#define MOD 1000000007LL
    +using namespace std;
    +
    +using LL = long long;
    +vector<pair<int, LL>> G[maxn];
    +LL d[maxn];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=1; i<n; i++)
    +	{
    +		int u, v;
    +		LL w;
    +		scanf("%d%d%lld", &u, &v, &w);
    +		G[--u].emplace_back(--v, w);
    +		G[v].emplace_back(u, w);
    +	}
    +	queue<int> q;
    +	q.push(0);
    +	for(int i=1; i<n; i++) d[i] = -1;
    +	while(!q.empty())
    +	{
    +		int v = q.front(); q.pop();
    +		for(auto [u, w]: G[v])
    +			if(d[u] == -1)
    +				q.push(u), d[u] = d[v] ^ w;
    +	}
    +	LL ans = 0LL;
    +	for(int i=0; i<60; i++)
    +	{
    +		int cnt = 0;
    +		for(int j=0; j<n; j++)
    +			if(d[j] >> i & 1LL)
    +				cnt ++;
    +		if((ans += (1LL << i) % MOD * cnt % MOD * (n - cnt) % MOD) > MOD)
    +			ans -= MOD;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc202/index.html b/post/abc202/index.html new file mode 100644 index 00000000..e1cf0bb8 --- /dev/null +++ b/post/abc202/index.html @@ -0,0 +1,771 @@ + + + + + +AISing Programming Contest 2021 (AtCoder Beginner Contest 202) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AISing Programming Contest 2021 (AtCoder Beginner Contest 202) A~E 题解 +

    + +
    +
    + 2021-06-06 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Three Dice

    +

    一个人抛了三个骰子,它们的顶面分别是a,b,ca,b,c。求它们的底面之和。
    +这里用的骰子是标准骰子,即两个相对的面之和为77

    +

    1a,b,c61\le a,b,c\le 6

    +

    输入格式

    +

    a b ca~b~c

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + +
    aabbcc答案
    1144331313
    55664466
    +

    分析

    +

    因为两个相对的面之和为77,所以本题的答案为(7a)+(7b)+(7c)=21abc(7-a)+(7-b)+(7-c)=21-a-b-c

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	printf("%d\n", 21 - a - b - c);
    +	return 0;
    +}
    +
    +
    +

    B - 180°

    +

    给定一个由01689组成的字符串SS。将其旋转180°180\degree并输出。

    +
    +

    一个字符串旋转180°180\degree的方法:

    +
      +
    • 将其翻转(reverse)。
    • +
    • 将其中的6替换为99替换为6
    • +
    +
    +

    1S1051\le |S|\le10^5

    +

    输入格式

    +

    SS

    +

    输出格式

    +

    输出SS旋转180°180\degree后的字符串。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    SS输出
    06018896881090
    8691001698
    0101001010
    +

    分析

    +

    本题直接按要求模拟即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +char s[maxn];
    +
    +int main()
    +{
    +	int n = 0;
    +	char c;
    +	while((c = getchar()) != '\n')
    +		s[n++] = c;
    +	while(n--)
    +		putchar(s[n] == '6'? '9': s[n] == '9'? '6': s[n]);
    +	putchar('\n');
    +	return 0;
    +}
    +
    +
    +

    C - Made Up

    +

    给定三个长度为NN的序列:A,B,CA,B,C
    +有多少对(i,j)(i,j)符合Ai=BCjA_i=B_{C_j}

    +

    1N1051\le N\le 10^5
    +1Ai,Bi,CiN1\le A_i,B_i,C_i\le N

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N
    +B1 B2  BNB_1~B_2~\dots~B_N
    +C1 C2  CNC_1~C_2~\dots~C_N

    +

    输出格式

    +

    输出符合Ai=BCjA_i=B_{C_j}(i,j)(i,j)的对数。

    +

    样例

    +

    样例输入1

    +
    3
    +1 2 2
    +3 1 2
    +2 3 2
    +
    +

    样例输出1

    +
    4
    +
    +

    44(i,j)(i,j)符合条件:(1,1),(1,3),(2,2),(3,2)(1,1),(1,3),(2,2),(3,2)

    +

    样例输入2

    +
    4
    +1 1 1 1
    +1 1 1 1
    +1 2 3 4
    +
    +

    样例输出2

    +
    16
    +
    +

    所有(i,j)(i,j)都符合条件。

    +

    样例输入3

    +
    3
    +2 3 3
    +1 3 3
    +1 1 1
    +
    +

    样例输出3

    +
    0
    +
    +

    没有(i,j)(i,j)符合条件。

    +

    分析

    +

    我们很容易想到O(n2)O(n^2)的算法:暴力枚举所有(i,j)(i,j),并统计符合条件的对数。
    +可惜,这样会TLE
    +我们考虑将所有的AiA_iBCjB_{C_j}分别放入两个桶acnt\mathrm{acnt}bcnt\mathrm{bcnt}
    +根据乘法原理我们得出答案为i=1nacntibcnti\sum\limits_{i=1}^n\mathrm{acnt}_i\mathrm{bcnt}_i

    +

    代码

    +

    注意:不要忘记使用long long

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +using LL = long long;
    +int acnt[maxn], b[maxn], bcnt[maxn];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		acnt[a] ++;
    +	}
    +	for(int i=0; i<n; i++)
    +		scanf("%d", b + i);
    +	for(int i=0; i<n; i++)
    +	{
    +		int c;
    +		scanf("%d", &c);
    +		bcnt[b[--c]] ++;
    +	}
    +	LL ans = 0LL;
    +	for(int i=1; i<=n; i++)
    +		ans += LL(acnt[i]) * LL(bcnt[i]);
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - aab aba baa

    +

    在由AAaBBb(均不要求连续)组成的字符串中,求字典序第KK小的。

    +

    1A,B301\le A,B\le 30
    +1KS1\le K\le SSS为由AAaBBb组成的字符串的个数)

    +

    输入格式

    +

    A B KA~B~K

    +

    输出格式

    +

    输出由AAaBBb组成的字符串中字典序第KK小的。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + +
    AABBKK输出
    222244baab
    303030301182645815648614241182645815648614243030b+30+30a)
    +

    分析

    +

    我们令dp(a,b)\mathrm{dp}(a,b)为由aaabbb组成的字符串的个数,则:

    +
      +
    • 我们在长度为a+b1a+b-1的字符串上再添上一个ab
    • +
    • dp(a,b)=dp(a1,b)+dp(a,b1)\mathrm{dp}(a,b)=\mathrm{dp}(a-1,b)+\mathrm{dp}(a,b-1)
    • +
    +

    我们令f(a,b,k)f(a,b,k)为由AAaBBb组成的字符串中字典序第KK小的字符串,则有如下递推式(这里的加法表示字符串连接):

    +

    f(a,b,k)={"(a=b=0)a"+f(a1,b,k)(b=0)b"+f(a,b1,k)(a=0)a"+f(a1,b,k)(kdp(a1,b))b"+f(a,b1,kdp(a1,b))(k>dp(a1,b))f(a,b,k)=\begin{cases} +``" & (a=b=0)\\ +``a"+f(a-1,b,k) & (b=0)\\ +``b"+f(a,b-1,k) & (a=0)\\ +``a"+f(a-1,b,k) & (k\le \mathrm{dp}(a-1,b))\\ +``b"+f(a,b-1,k- \mathrm{dp}(a-1,b)) & (k>\mathrm{dp}(a-1,b)) +\end{cases}

    +

    代码

    +

    写代码时,可以用递归形式,也可以使用非递归形式(更快):

    +
    #include <cstdio>
    +#define maxn 35
    +using namespace std;
    +
    +using LL = long long;
    +LL dp[maxn][maxn];
    +
    +int main()
    +{
    +	int a, b;
    +	LL k;
    +	scanf("%d%d%lld", &a, &b, &k);
    +	for(int i=0; i<=a; i++) dp[i][0] = 1;
    +	for(int i=0; i<=b; i++) dp[0][i] = 1;
    +	for(int i=1; i<=a; i++)
    +		for(int j=1; j<=b; j++)
    +			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    +	while(a && b)
    +	{
    +		LL t = dp[a - 1][b];
    +		if(k <= t) putchar('a'), a --;
    +		else putchar('b'), b --, k -= t;
    +	}
    +	while(a--) putchar('a');
    +	while(b--) putchar('b');
    +	putchar('\n');
    +	return 0;
    +}
    +
    +
    +

    E - Count Descendants

    +

    我们有一棵NN个节点的树,节点的编号分别为1,2,,N1,2,\dots,N
    +11号点是根节点,且第ii个点(2iN2\le i\le N)的父亲节点是PiP_i
    +给你QQ个查询,第ii个查询包含两个整数UiU_iDiD_i,求符合下列条件的点uu的个数:

    +
      +
    • uu到根节点的最短路径正好DiD_i条边;
    • +
    • UiU_iuu到根节点的最短路径中(包含两端)。
    • +
    +

    1N2×1051\le N\le 2\times10^5
    +1Pi<i1\le P_i < i
    +1Q2×1051\le Q\le 2\times10^5
    +1UiN1\le U_i\le N
    +0Di<N0\le D_i < N

    +

    输入格式

    +

    NN
    +P2 P3  PNP_2~P_3~\dots~P_N
    +QQ
    +U1 D1U_1~D_1
    +U2 D2U_2~D_2
    +\vdots
    +UQ DQU_Q~D_Q

    +

    输出格式

    +

    输出QQ行。第ii行包含对第ii个查询的回应。

    +

    样例

    +

    样例输入

    +
    7
    +1 1 2 2 4 2
    +4
    +1 2
    +7 2
    +4 1
    +5 5
    +
    +

    样例输出

    +
    3
    +1
    +0
    +0
    +
    +

    在第一个查询中,节点4,5,74,5,7符合条件。
    +在第二个查询中,只有节点77符合条件。
    +在最后两个查询中,没有节点符合条件。
    +样例说明

    +

    分析

    +

    我们可以先在整棵树上从根节点开始跑一遍DFS\text{DFS},对于节点ii预处理出ini\mathrm{in}_iouti\mathrm{out}_i,分别表示进入和走出这个节点的时间,同时将第ii层节点的所有in\mathrm{in}放入depini\mathrm{depin}_i
    +如果节点uu到根节点的路径中有vv,则invinu<outv\mathrm{in}_v\le\mathrm{in}_u < \mathrm{out}_v
    +因此,对于每个查询,我们利用二分查找即可快速算出符合条件的节点个数。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#include <algorithm>
    +#define maxn 200005
    +using namespace std;
    +
    +int in[maxn], out[maxn], dep[maxn], cnt;
    +vector<int> G[maxn], depin[maxn];
    +
    +void dfs(int v)
    +{
    +	depin[dep[v]].push_back(in[v] = cnt++);
    +	for(int u: G[v])
    +		dfs(u);
    +	out[v] = cnt++;
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	dep[0] = cnt = 0;
    +	for(int i=1; i<n; i++)
    +	{
    +		int p;
    +		scanf("%d", &p);
    +		dep[i] = dep[--p] + 1;
    +		G[p].push_back(i);
    +	}
    +	dfs(0);
    +	int q;
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		int u, d;
    +		scanf("%d%d", &u, &d);
    +		const auto& din = depin[d];
    +		auto first = lower_bound(din.begin(), din.end(), in[--u]);
    +		auto last = lower_bound(din.begin(), din.end(), out[u]);
    +		printf("%lld\n", last - first);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc203/index.html b/post/abc203/index.html new file mode 100644 index 00000000..6512cbac --- /dev/null +++ b/post/abc203/index.html @@ -0,0 +1,842 @@ + + + + + +AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解 +

    + +
    +
    + 2021-06-03 · 16 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Chinchirorin

    +

    题目大意

    +

    给定三个整数a,b,ca,b,c,如果它们中有两个相等,输出另一个;否则,输出00

    +

    1a,b,c61\le a,b,c\le 6

    +

    输入格式

    +

    a b ca~b~c

    +

    输出格式

    +

    如果a,b,ca,b,c中有两个相等,输出另一个;否则,输出00

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    aabbcc输出
    22552255
    44556600
    11111111
    +

    分析

    +

    AA题还是一如既往的水……直接暴力判断三种相等的情况即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	if(a == b) printf("%d\n", c);
    +	else if(b == c) printf("%d\n", a);
    +	else if(a == c) printf("%d\n", b);
    +	else puts("0");
    +	return 0;
    +}
    +
    +
    +

    B - AtCoder Condominium

    +

    题目大意

    +

    给定NNKK,求i=1Nj=1Ki0j\sum\limits_{i=1}^N\sum\limits_{j=1}^K \overline{i0j}
    +1N,K91\le N,K\le 9

    +

    输入格式

    +

    N KN~K

    +

    输出格式

    +

    输出i=1Nj=1Ki0j\sum\limits_{i=1}^N\sum\limits_{j=1}^K \overline{i0j}

    +

    样例

    + + + + + + + + + + + + + + + + + + + + +
    NNKK输出
    1122203203
    333318181818
    +

    分析

    +

    本题可以直接暴力,但我使用的是如下O(1)\mathcal O(1)算法:
    +根据i0j=100i+j\overline{i0j}=100i+j1+2++N=N(N+1)21+2+\dots+N=\frac{N(N+1)}2,则有如下推导:

    +
      +
    • i=1Nj=1Ki0j=i=1Nj=1K100i+i=1Nj=1Kj\sum\limits_{i=1}^N\sum\limits_{j=1}^K \overline{i0j}=\sum\limits_{i=1}^N\sum\limits_{j=1}^K 100i+\sum\limits_{i=1}^N\sum\limits_{j=1}^K j
    • +
    • i=1Nj=1K100i=i=1N100iK=100Ki=1Ni=100N(N+1)K2\sum\limits_{i=1}^N\sum\limits_{j=1}^K 100i=\sum\limits_{i=1}^N 100iK=100K\sum\limits_{i=1}^N i=\frac{100N(N+1)K}2
    • +
    • i=1Nj=1Kj=i=1NK(K+1)2=K(K+1)N2\sum\limits_{i=1}^N\sum\limits_{j=1}^K j=\sum\limits_{i=1}^N\frac{K(K+1)}2=\frac{K(K+1)N}2
    • +
    • i=1Nj=1Ki0j=100N(N+1)K2+K(K+1)N2=100N(N+1)K+K(K+1)N2\sum\limits_{i=1}^N\sum\limits_{j=1}^K \overline{i0j}=\frac{100N(N+1)K}2+\frac{K(K+1)N}2=\frac{100N(N+1)K+K(K+1)N}2
    • +
    +

    这样,我们就可以直接通过公式100N(N+1)K+K(K+1)N2\frac{100N(N+1)K+K(K+1)N}2计算出结果了。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +inline int sum(int x) { return x * (x + 1) >> 1; }
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	printf("%d\n", sum(n) * k * 100 + sum(k) * n);
    +	return 0;
    +}
    +
    +
    +

    C - Friends and Travel costs

    +

    题目大意

    +

    10100+110^{100}+1个村庄,分别为村庄0,1,,101000,1,\dots,10^{100},相邻两个村庄之间的过路费是11元。
    +Taro一开始有KK元且在村庄00。他想要到达编号尽可能大的村庄。
    +他有NN个朋友。第ii个朋友会在Taro到达村庄AiA_i时给他BiB_i元。
    +求Taro最后到达的村庄的编号。

    +

    1N2×1051\le N\le 2\times10^5
    +1K1091\le K\le 10^9
    +1Ai10181\le A_i\le 10^{18}
    +1Bi1091\le B_i\le 10^9

    +

    输入格式

    +

    N KN~K
    +A1 B1A_1~B_1
    +A2 B2A_2~B_2
    +\dots
    +AN BNA_N~B_N

    +

    输出

    +

    输出Taro最后到达的村庄的编号。

    +

    样例

    +

    样例输入1

    +
    2 3
    +2 1
    +5 10
    +
    +

    样例输出1

    +
    4
    +
    +

    样例输入2

    +
    5 1000000000
    +1 1000000000
    +2 1000000000
    +3 1000000000
    +4 1000000000
    +5 1000000000
    +
    +

    样例输出2

    +
    6000000000
    +
    +

    请不要使用3232位整数。

    +

    样例输入3

    +
    3 2
    +5 5
    +2 1
    +2 2
    +
    +

    样例输出3

    +
    10
    +
    +

    Taro在一个村庄可能有多个朋友。

    +

    分析

    +

    根据题目中的数据范围,我们可以证明答案严格小于2642^{64},所以我们使用unsigned long long作为存储数据类型。
    +可是,由于村庄数量还是太多,我们仍然无法依次模拟到达每个村庄。
    +我们发现NN较小,所以我们可以从朋友的角度考虑。
    +我们可以按AiA_i排序所有朋友(BiB_i的顺序不重要),这样就能把整个行程形成分成若干个区间,并依次判断每个区间是否能走完即可。

    +

    代码

    +

    注意:我这里排序使用的是优先队列(priority_queue

    +
    #include <cstdio>
    +#include <queue>
    +#define maxn 200005
    +#define INF 18446744073709551615ULL
    +using namespace std;
    +
    +using ULL = unsigned long long;
    +using pll = pair<ULL, ULL>;
    +
    +int main()
    +{
    +	int n;
    +	ULL k;
    +	scanf("%d%llu", &n, &k);
    +	priority_queue<pll, vector<pll>, greater<pll> > q;
    +	for(int i=0; i<n; i++)
    +	{
    +		ULL a, b;
    +		scanf("%llu%llu", &a, &b);
    +		q.emplace(a, b);
    +	}
    +	ULL lastv = 0ULL;
    +	q.emplace(INF, 0ULL);
    +	while(!q.empty())
    +	{
    +		auto [a, b] = q.top(); q.pop();
    +		ULL cost = a - lastv;
    +		if(k < cost)
    +		{
    +			printf("%llu\n", lastv + k);
    +			return 0;
    +		}
    +		k -= cost;
    +		lastv = a, k += b;
    +	}
    +	return 0;
    +}
    +
    +
    +

    D - Pond

    +

    题目大意

    +

    给定一个N×NN\times N的正方形矩阵AA,第ii行第jj列的元素是Ai,jA_{i,j}
    +求AA中所有的K×KK\times K的子矩阵的中间值的最小值。
    +一个K×KK\times K的正方形的中间值为其中第(K22+1)(\left\lfloor\frac{K^2}2\right\rfloor+1)大的值。

    +

    1KN8001\le K\le N\le 800
    +1Ai,j1091\le A_{i,j}\le 10^9

    +

    如果不能理解题意,请看下图:
    +

    +

    对应的输入输出:

    +
    3 2
    +5 9 8
    +2 1 3
    +7 4 6
    +
    +

    /

    +
    2
    +
    +

    输入格式

    +

    N KN~K
    +A1,1 A1,2  A1,NA_{1,1}~A_{1,2}~\dots~A_{1,N}
    +A2,1 A2,2  A2,NA_{2,1}~A_{2,2}~\dots~A_{2,N}
    +AN,1 AN,2  AN,NA_{N,1}~A_{N,2}~\dots~A_{N,N}

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    3 2
    +1 7 0
    +5 8 11
    +10 4 2
    +
    +

    样例输出1

    +
    4
    +
    +

    N=3     K=2A=[17058111042]N=3~~~~~K=2\\ +A=\begin{bmatrix} +1 & 7 & 0\\ +5 & 8 & 11\\ +10 & 4 & 2 +\end{bmatrix}

    +

    我们有四个2×22\times2的正方形:{8,7,5,1}, {11,8,7,0}, {10,8,5,4}, {11,8,4,2}\{8, 7, 5, 1\}, ~\{11,8,7,0\},~ \{10,8,5,4\}, ~\{11,8,4,2\}
    +我们依次从每个的元素中取第K22+1=3\left\lfloor\frac{K^2}2\right\rfloor+1=3大的:{5,7,5,4}\{5,7,5,4\}
    +最后,我们从{5,7,5,4}\{5,7,5,4\}中选出最小的:44

    +

    样例输入2

    +
    3 3
    +1 2 3
    +4 5 6
    +7 8 9
    +
    +

    样例输出2

    +
    5
    +
    +

    分析

    +

    本题可以二分答案。我们判定一个数是否为一个K×KK\times K的正方形的中间值时,只需要计算这个正方形内严格大于这个数的数的个数是否为K22\left\lfloor\frac{K^2}2\right\rfloor即可。
    +因此,我们可以使用矩阵前缀和快速计算一个正方形内严格大于一个数的数的数的个数。
    +总时间复杂度O(n2logmax{A})\mathcal O(n^2\log\max\{A\})

    +

    代码

    +
    #include <cstdio>
    +#define maxn 805
    +#define INF 2147483647
    +using namespace std;
    +
    +int a[maxn][maxn], dp[maxn][maxn], n, k, target;
    +
    +inline int count(int x1, int y1, int x2, int y2)
    +{
    +	return dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
    +}
    +
    +inline bool check(int x)
    +{
    +	for(int i=1; i<=n; i++)
    +		for(int j=1; j<=n; j++)
    +			dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + (a[i][j] > x);
    +	for(int x2=k; x2<=n; x2++)
    +		for(int y2=k; y2<=n; y2++)
    +		{
    +			int x1 = x2 - k + 1, y1 = y2 - k + 1;
    +			if(count(x1, y1, x2, y2) < target)
    +				return true;
    +		}
    +	return false;
    +}
    +
    +int main()
    +{
    +	scanf("%d%d", &n, &k);
    +	target = (k * k >> 1) + 1;
    +	int l = INF, r = 0, ans = 0;
    +	for(int i=1; i<=n; i++)
    +		for(int j=1; j<=n; j++)
    +		{
    +			scanf("%d", a[i] + j);
    +			if(a[i][j] > r) r = a[i][j];
    +			if(a[i][j] < l) l = a[i][j];
    +		}
    +	while(l <= r)
    +	{
    +		int mid = l + r >> 1;
    +		if(check(mid)) ans = mid, r = mid - 1;
    +		else l = mid + 1;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - White Pawn

    +

    题目大意

    +

    有一个(2N+1)×(2N+1)(2N+1)\times(2N+1)的正方形棋盘,行数、列数下标都依次从002N2N。我们用(i,j)(i,j)表示棋盘上iijj列的位置。
    +我们有一颗棋子,初始位置在(0,N)(0,N)。棋盘上有MM个黑方格,第ii个的位置在(Xi,Yi)(X_i,Y_i),其余都是白方格。
    +当棋子在(i,j)(i,j)时,你可以执行任意下列操作,但不能移出棋盘:

    +
      +
    • (i+1,j)(i+1,j)是白色时,移到(i+1,j)(i+1,j)
    • +
    • (i+1,j1)(i+1,j-1)是黑色时,移到(i+1,j1)(i+1,j-1)
    • +
    • (i+1,j+1)(i+1,j+1)是黑色是,移到(i+1,j+1)(i+1,j+1)
    • +
    +

    棋盘上的方格不能移动。求棋盘的最后一行的能到达的列的个数。

    +

    1N1091\le N\le 10^9
    +0M2×1050\le M\le 2\times 10^5
    +1Xi2N1\le X_i\le 2N
    +0Yi2N0\le Y_i\le 2N
    +(Xi,Yi)(X_i,Y_i)互不相等。

    +

    输入格式

    +

    N MN~M
    +X1 Y1X_1~Y_1
    +X2 Y2X_2~Y_2
    +\vdots
    +XM YMX_M~Y_M

    +

    输出格式

    +

    输出棋盘的最后一行的能到达的列的个数。

    +

    样例

    +

    样例输入1

    +
    2 4
    +1 1
    +1 2
    +2 0
    +4 2
    +
    +

    样例输出1

    +
    3
    +
    +

    我们可以将棋子移动到(4,0)(4,0)(4,1)(4,1)(4,2)(4,2),如下:

    +
      +
    • (0,2)(1,1)(2,1)(3,1)(4,2)(0,2)\to(1,1)\to(2,1)\to(3,1)\to(4,2)
    • +
    • (0,2)(1,1)(2,1)(3,1)(4,1)(0,2)\to(1,1)\to(2,1)\to(3,1)\to(4,1)
    • +
    • (0,2)(1,1)(2,0)(3,0)(4,0)(0,2)\to(1,1)\to(2,0)\to(3,0)\to(4,0)
    • +
    +

    我们不能移动到(4,3)(4,3)(4,4)(4,4),所以输出33

    +

    样例输入2

    +
    1 1
    +1 1
    +
    +

    样例输出2

    +
    0
    +
    +

    我们无法移动棋子。

    +

    分析

    +

    我们发现,当NN较大时,大多数行多是空着的,所以我们从每个XiX_i开始考虑。对于白色的位置(i,j)(i,j),如果不能到达(i1,j)(i-1,j),则不能到达(i,j)(i,j)。相反,对于黑色的(i,j)(i,j),如果能到达(i1,j1)(i-1,j-1)(i1,j+1)(i-1,j+1),则能到达(i,j)(i,j)
    +因此,我们先排序每个(Xi,Yi)(X_i,Y_i),再对于每个有黑色的行,用set维护能到达的列数,再按上述方法判断即可。

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#include <vector>
    +#include <algorithm>
    +#pragma GCC optimize("Ofast")
    +using namespace std;
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	vector<pair<int, int> > black;
    +	black.reserve(m);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		black.emplace_back(x, y);
    +	}
    +	m = black.size();
    +	sort(black.begin(), black.end());
    +	set<int> cols;
    +	cols.insert(n);
    +	for(int l=0, r=0; l<m; l=r)
    +	{
    +		while(r < m && black[r].first == black[l].first) r ++;
    +		vector<int> rem, add;
    +		for(int i=l; i<r; i++)
    +		{
    +			int y = black[i].second;
    +			bool ok = cols.count(y - 1) || cols.count(y + 1);
    +			if(cols.count(y))
    +			{
    +				if(!ok)
    +					rem.push_back(y);
    +			}
    +			else if(ok)
    +				add.push_back(y);
    +		}
    +		for(int y: rem) cols.erase(y);
    +		for(int y: add) cols.insert(y);
    +	}
    +	printf("%llu\n", cols.size());
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc204/index.html b/post/abc204/index.html new file mode 100644 index 00000000..1e829c99 --- /dev/null +++ b/post/abc204/index.html @@ -0,0 +1,795 @@ + + + + + +AtCoder Beginner Contest 204 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 204 A~E 题解 +

    + +
    +
    + 2021-06-07 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Rock-paper-scissors

    +

    三个人玩石头剪刀布平局,其中两个出的分别是x,yx,y,求另一个人出的。

    +

    0x,y20\le x,y\le 20,1,20,1,2分别表示石头,剪刀,布)

    +

    输入格式

    +

    x,yx,y

    +

    输出格式

    +

    用整数格式输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + +
    xxyy输出
    001122
    000000
    +

    分析

    +

    石头剪刀布这个游戏三人平局只有两种情况(设zz为第三个人出的):

    +
      +
    • x=y=zx=y=z
    • +
    • xyzx\ne y\ne z
    • +
    +

    所以,我们得出如下递推式:
    +z={x(x=y)3xy(xy)z=\begin{cases}x & (x=y)\\3-x-y & (x\ne y)\end{cases}

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int x, y;
    +	scanf("%d%d", &x, &y);
    +	printf("%d\n", x == y? x: 3 - x - y);
    +	return 0;
    +}
    +
    +
    +

    B - Nuts

    +

    NN棵树,第ii棵树上有AiA_i颗果实。
    +一个人会从第ii棵树摘下max(0,Ai10)\max(0,A_i-10)颗果实。他一共会得到多少果实?

    +

    1N,Ai10001\le N,A_i\le 1000

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    3
    +6 17 28
    +
    +

    样例输出1

    +
    25
    +
    +

    他会从三棵树上分别摘下0,7,180,7,18颗果实,总共2525颗。

    +

    样例输入2

    +
    4
    +8 9 10 11
    +
    +

    样例输出2

    +
    1
    +
    +

    他只会从最后一棵树上得到一颗果实。

    +

    分析

    +

    我们直接按题意模拟即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, ans = 0;
    +	scanf("%d", &n);
    +	while(n--)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		if(a > 10) ans += a - 10;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    C - Tour

    +

    一个国家有编号为11NNNN座城市和编号为11MMMM条路。
    +第ii条路从城市AiA_iBiB_i,且不能用它从城市BiB_iAiA_i
    +一个人想从起点城市开始旅行并走过若干条路(可以不走,即只游玩一个城市)并到达终点城市。
    +有多少种合法的起点和终点城市?如果XYX\ne Y,则XYX\to YYXY\to X算作两种不同的方案。

    +

    2N20002\le N\le 2000
    +0Mmin(2000,N(N1))0\le M\le \min(2000,N(N-1))
    +1Ai,BiN1\le A_i,B_i\le N
    +AiBiA_i\ne B_i
    +(Ai,Bi)(A_i,B_i)互不相同。

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +\vdots
    +AM BMA_M~B_M

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    3 3
    +1 2
    +2 3
    +3 2
    +
    +

    样例输出1

    +
    7
    +
    +

    有七种可行的旅游方案:111\to1121\to2131\to3222\to2232\to3323\to2333\to3

    +

    样例输入2

    +
    3 0
    +
    +

    样例输出2

    +
    3
    +
    +

    有三种可行的旅游方案:111\to1222\to2333\to3

    +

    分析

    +

    我们可以把这个国家看成一个简单有向无权图,并把每个节点作为起点跑一遍DFS\text{DFS},计算总共能到达的结点数即可。
    +总时间复杂度为O(n2)\mathcal O(n^2)

    +

    代码

    +

    注意:每次DFS\text{DFS}之前一定要将vis\mathrm{vis}数组清零!

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 2005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +bool vis[maxn];
    +
    +int ans;
    +
    +void dfs(int v)
    +{
    +	if(vis[v]) return;
    +	vis[v] = true, ans ++;
    +	for(int u: G[v])
    +		dfs(u);
    +}
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[--x].push_back(--y);
    +	}
    +	ans = 0;
    +	for(int i=0; i<n; i++)
    +	{
    +		for(int j=0; j<n; j++)
    +			vis[j] = false;
    +		dfs(i);
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Cooking

    +

    两个人要洗NN个碗,其中任意一个人洗第ii个碗需要TiT_i分钟。一个人不能同时洗多个碗。
    +两个人一起洗碗,洗完所有碗至少需要多少分钟?

    +

    1N1001\le N\le 100
    +1Ti1031\le T_i\le 10^3

    +

    输入格式

    +

    NN
    +T1 T2  TNT_1~T_2~\dots~T_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    5
    +8 3 7 2 5
    +
    +

    样例输出1

    +
    13
    +
    +

    我们可以让两个人分别洗如下的碗:

    +
      +
    • 第一个人洗编号为5,15,1的碗。总时间为T5+T1=13T_5+T_1=13分钟。
    • +
    • 第二个人洗编号为2,4,32,4,3的碗。总时间为T2+T4+T3=10T_2+T_4+T_3=10分钟。
    • +
    +

    总耗时为max(13,10)=13\max(13,10)=13分钟。

    +

    样例输入2

    +
    2
    +1000 1
    +
    +

    样例输出2

    +
    1000
    +
    +

    样例输入3

    +
    9
    +3 14 15 9 26 5 35 89 79
    +
    +

    样例输出3

    +
    138
    +
    +

    分析

    +

    这是一道经典01背包题。
    +题目可以直接描述为:给定序列TT,将其分成两个子序列AABB(不要求连续),求最小的min(A,B)\min(\sum A,\sum B)
    +这时,我们发现要使min(A,B)\min(\sum A,\sum B)最小,由于A+B=T\sum A+\sum B=\sum T,所以AB|\sum A-\sum B|必须也达到最小。
    +我们可以将T\sum T分成两半,其中一半为T2\lfloor\frac{\sum T}2\rfloor。这时,我们可以用dp背包解决此题:从TT中选出一个子序列AA,使得AT2\sum A\le\lfloor\frac{\sum T}2\rfloor,这样答案就为TA\sum T-\sum A

    +

    代码

    +
    #include <cstdio>
    +#define maxn 105
    +#define maxv 100005
    +using namespace std;
    +
    +int dp[maxv], w[maxn];
    +
    +inline void setmax(int& x, int y)
    +{
    +	if(y > x) x = y;
    +}
    +
    +int main()
    +{
    +	int n, v = 0;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		scanf("%d", w + i);
    +		v += w[i];
    +	}
    +	int t = v;
    +	v >>= 1;
    +	for(int i=0; i<n; i++)
    +		for(int j=v; j>=w[i]; j--)
    +			setmax(dp[j], dp[j - w[i]] + w[i]);
    +	printf("%d\n", t - dp[v]);
    +	return 0;
    +}
    +
    +
    +

    E - Rush Hour 2

    +

    一个国家有NN座城市和MM条路。城市的编号是11NN,路的编号则为11MM。第ii条路双向连接着城市AiA_iBiB_i
    +在这个国家中,初始时间为00。如果你在时间点tt通过公路ii,所需时间为Ci+Dit+1C_i+\lfloor\frac {D_i} {t+1}\rfloor
    +一个人想从城市11到达城市NN。他在每个城市可以停留任意自然数的时间。
    +求这个人最早到达城市NN的时间。如果无法到达城市NN,输出-1

    +

    2N1052\le N\le 10^5
    +2M1052\le M\le 10^5
    +1Ai,BiN1\le A_i,B_i\le N
    +0Ci,Di1090\le C_i,D_i\le 10^9

    +

    输入格式

    +

    N MN~M
    +A1 B1 C1 D1A_1~B_1~C_1~D_1
    +\vdots
    +AM BM CM DMA_M~B_M~C_M~D_M

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    样例输入1

    +
    2 1
    +1 2 2 3
    +
    +

    样例输出1

    +
    4
    +
    +

    我们可以先在城市11停留至时间11。然后,我们出发,最终到达时间1+2+31+1=41+2+\lfloor\frac 3 {1+1}\rfloor=4

    +

    样例输入2

    +
    2 3
    +1 2 2 3
    +1 2 2 1
    +1 1 1 1
    +
    +

    样例输出2

    +
    3
    +
    +

    两个城市之间可能有多条路,一个城市也可能有到自己的路。

    +

    样例输入3

    +
    4 2
    +1 2 3 4
    +3 4 5 6
    +
    +

    样例输出3

    +
    -1
    +
    +

    城市11到城市NN可能没有路径。

    +

    分析

    +

    我们可以把输入当成一幅无向图。其实,从一个城市到它自己的路根本没有用,所以我们直接忽略不计。
    +如果目前时间为TT且我们要从城市AiA_iBiB_i,我们可以证明,最好的整数出发时间应该是D1\lfloor\sqrt D\rceil-1x\lfloor x\rceil表示xx四舍五入)。
    +如果DT\lfloor\sqrt D\rceil\le T,我们应该等到时间D1\lfloor\sqrt D\rceil-1再出发;否则,我们直接出发。
    +这时,我们可以使用Dijkstra最短路算法(使用优先队列优化),这样总时间复杂度就为O(MlogN)\mathcal O(M\log N)

    +

    代码

    +
    #include <cstdio>
    +#include <cmath>
    +#include <vector>
    +#include <queue>
    +#include <tuple>
    +#define maxn 100005
    +#define INF 9223372036854775807LL
    +using namespace std;
    +
    +using Road = tuple<int, int, int>;
    +using LL = long long;
    +using pli = pair<LL, int>;
    +
    +vector<Road> G[maxn];
    +LL dist[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int a, b, c, d;
    +		scanf("%d%d%d%d", &a, &b, &c, &d);
    +		if(--a == --b) continue;
    +		G[a].emplace_back(b, c, d);
    +		G[b].emplace_back(a, c, d);
    +	}
    +	dist[0] = 0LL;
    +	for(int i=1; i<n; i++) dist[i] = INF;
    +	priority_queue<pli, vector<pli>, greater<pli>> q;
    +	q.emplace(0LL, 0);
    +	while(!q.empty())
    +	{
    +		auto [t, u] = q.top(); q.pop();
    +		if(dist[u] != t) continue;
    +		for(auto [v, c, d]: G[u])
    +		{
    +			LL t2 = sqrt((long double) d) - 0.5;
    +			if(t2 < t) t2 = t;
    +			t2 += LL(c) + LL(d) / (t2 + 1LL);
    +			if(t2 < dist[v])
    +				q.emplace(dist[v] = t2, v);
    +		}
    +	}
    +	if(dist[n - 1] == INF) puts("-1");
    +	else printf("%lld\n", dist[n - 1]);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc205/index.html b/post/abc205/index.html new file mode 100644 index 00000000..92ca6e7f --- /dev/null +++ b/post/abc205/index.html @@ -0,0 +1,778 @@ + + + + + +AtCoder Beginner Contest 205 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 205 A~E 题解 +

    + +
    +
    + 2021-07-07 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - kcal

    +

    题目大意

    +

    我们有一种每100100毫升含有AA千卡热量的饮料。BB毫升的这种饮料含有多少千卡热量?

    +

    0A,B10000\le A, B\le 1000

    +

    输入格式

    +

    A BA~B

    +

    输出格式

    +

    输出BB毫升这种饮料包含的的千卡数。最大允许浮点数精度误差10610^{-6}

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABB输出
    45452002009090
    3737450450166.5166.5
    001000100000
    50500000
    +

    分析

    +

    废话不多说,答案就是AB100\frac{AB}{100}~

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b;
    +	scanf("%d%d", &a, &b);
    +	a *= b;
    +	printf("%d.%d\n", a / 100, a % 100);
    +	return 0;
    +}
    +
    +
    +

    B - Permutation Check

    +

    题目大意

    +

    给定长度为NN的序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)
    +判断AA是否为(1,2,,N)(1,2,\dots,N)的一种排列。

    +

    1AiN1031\le A_i\le N\le 10^3

    +

    输入格式

    +

    NN
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出格式

    +

    如果AA(1,2,,N)(1,2,\dots,N)的一种排列,输出Yes;否则,输出No

    +

    样例

    +

    样例输入1

    +
    5
    +3 1 2 4 5
    +
    +

    样例输出1

    +
    Yes
    +
    +

    (3,1,2,4,5)(3,1,2,4,5)(1,2,3,4,5)(1,2,3,4,5)的一种排列,所以我们输出Yes

    +

    样例输入2

    +
    6
    +3 1 4 1 5 2
    +
    +

    样例输出2

    +
    No
    +
    +

    (3,1,4,1,5,2)(3,1,4,1,5,2)不是(1,2,3,4,5,6)(1,2,3,4,5,6)的一种排列,所以我们输出No

    +

    样例输入3

    +
    3
    +1 2 3
    +
    +

    样例输出3

    +
    Yes
    +
    +

    样例输入4

    +
    1
    +1
    +
    +

    样例输出4

    +
    Yes
    +
    +

    分析

    +

    由于题目保证1AiN1\le A_i\le N,所以(1,2,,N)(1,2,\dots,N)的一种排列AA定义如下:

    +
      +
    • AA11NN每个数字不重复出现。
    • +
    +

    因此,我们可以用数组记录每个数字是否出现,所以总时间复杂度为O(n)\mathcal O(n)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 1005
    +using namespace std;
    +
    +bool used[maxn];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		if(used[a])
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +		used[a] = true;
    +	}
    +	puts("Yes");
    +	return 0;
    +}
    +
    +
    +

    C - POW

    +

    题目大意

    +

    给定三个整数A,B,CA,B,C,判断ACA^CBCB^C哪个更大。

    +

    109A,B109-10^9\le A,B\le 10^9
    +1C1091\le C\le 10^9

    +

    输入格式

    +

    A B CA~B~C

    +

    输出格式

    +

    本题分如下三种情况输出:

    +
      +
    • 如果AC<BCA^C<B^C,输出<
    • +
    • 如果AC>BCA^C>B^C,输出>
    • +
    • 如果AC=BCA^C=B^C,输出=
    • +
    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBCC输出
    332244>
    7-77722=
    8-86633<
    +

    分析

    +

    首先,由于负负得正(a)2=a2(-a)^2=a^2
    +这样,我们可以根据奇偶性得出,如果nn为偶数,(a)n=an(-a)^n=a^n;但如果nn为奇数,则(a)n=(an)(-a)^n=-(a^n)
    +因此,我们只需判断如果CC为偶数,将AA替换为A|A|,再将BB替换为B|B|
    +最后,AABB的大小关系就是ACA^CBCB^C的大小关系。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	if(!(c & 1))
    +	{
    +		if(a < 0) a = -a;
    +		if(b < 0) b = -b;
    +	}
    +	puts(a < b? "<": a > b? ">": "=");
    +	return 0;
    +}
    +
    +
    +

    D - Kth Excluded

    +

    题目大意

    +

    给定长度为NN的正整数序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)QQ次查询。
    +在第ii次查询中,给定正整数KiK_i,求第KiK_i小的不在AA中的正整数。

    +

    1N,Q1051\le N,Q\le 10^5
    +1A1<A2<<AN10181\le A_1<A_2<\dots<A_N\le10^{18}
    +1Ki10181\le K_i\le 10^{18}

    +

    输入格式

    +

    N QN~Q
    +A1 A2  ANA_1~A_2~\dots~A_N
    +K1K_1
    +K2K_2
    +\hspace{5pt}\vdots
    +KNK_N

    +

    输出格式

    +

    输出QQ行。第ii行应该包含第KiK_i小的不在AA中的正整数。

    +

    样例

    +

    样例输入1

    +
    4 3
    +3 5 6 7
    +2
    +5
    +3
    +
    +

    样例输出1

    +
    2
    +9
    +4
    +
    +

    不在AA中的正整数有1,2,4,8,9,10,11,1,2,4,8,9,10,11,\dots,其中有:

    +
      +
    • 22小的22
    • +
    • 55小的99
    • +
    • 33小的44
    • +
    +

    因此,我们应该依次输出294

    +

    样例输入2

    +
    5 2
    +1 2 3 4 5
    +1
    +10
    +
    +

    样例输出2

    +
    6
    +15
    +
    +

    分析

    +

    本题我们可以先预处理出AA中每个元素比它小的元素的数量,再二分查找即可。

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 100005
    +using namespace std;
    +
    +using LL = long long;
    +LL a[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +	{
    +		scanf("%lld", a + i);
    +		a[i] -= i;
    +	}
    +	while(q--)
    +	{
    +		LL k;
    +		scanf("%lld", &k);
    +		printf("%lld\n", k + (upper_bound(a, a + n, k) - a));
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - White and Black Balls

    +

    题目大意

    +

    有多少种排列NN个白球和MM个黑球的方法使得下列条件成立?

    +
      +
    • 对于每个ii (1iN+M1\le i\le N+M),设wiw_ibib_i分别是最左边ii个球中白球和黑球的数量,wibi+Kw_i\le b_i+K成立。
    • +
    +

    答案对(109+7)(10^9+7)取模。

    +

    0N,M1060\le N,M\le10^6
    +1N+M1\le N+M
    +0KN0\le K\le N

    +

    输入格式

    +

    N M KN~M~K

    +

    输出格式

    +

    输出答案,对(109+7)(10^9+7)取模。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NNMMKK输出
    22331199
    11000000
    100000010000001000000100000010000001000000192151600192151600
    +

    分析

    +

    首先,本题中合法排列数就是如下符合任意yx+Ky\le x+K(0,0)(M,N)(0,0)\to(M,N)最短路径的数量:
    +路径解释图

    +

    由此可见,如果N>M+KN>M+K(即终点超出限制),答案一定为00
    +我们还可以发现,如果没有yx+Ky\le x+K这个限制,答案为(N+MN)\binom{N + M}{N}
    +我们再考虑不合法的路径数,数量为(N+MM+K+1)\binom{N + M}{M + K + 1}
    +因此,答案为(N+MN)(N+MM+K+1)\binom{N + M}{N}-\binom{N + M}{M + K + 1}

    +

    代码

    +

    这里用AtCoder Library好像比较方便唉~

    +
    #include <iostream>
    +#include <atcoder/modint>
    +using namespace std;
    +
    +using modint = atcoder::modint1000000007;
    +
    +modint f(int n, int m)
    +{
    +	if(n < 0 || m < 0)
    +		return 0;
    +	modint ret = 1;
    +	for(int i=1; i<=m; i++)
    +		ret = ret * (n + i) / i;
    +	return ret;
    +}
    +
    +int main()
    +{
    +	int n, m, k;
    +	scanf("%d%d%d", &n, &m, &k);
    +	if(n > m + k) puts("0");
    +	else printf("%d\n", (f(n, m) - f(n - k - 1, m + k + 1)).val());
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc239/index.html b/post/abc239/index.html new file mode 100644 index 00000000..a28fca98 --- /dev/null +++ b/post/abc239/index.html @@ -0,0 +1,669 @@ + + + + + +Denso Create Programming Contest 2022 (AtCoder Beginner Contest 239) C~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Denso Create Programming Contest 2022 (AtCoder Beginner Contest 239) C~E 题解 +

    + +
    +
    + 2022-02-25 · 7 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    C - Knight Fork

    +

    题目大意

    +

    在二维平面上是否有一个整数坐标点到(x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2)的欧几里得距离都是5\sqrt5

    +

    输入格式

    +

    x1 y1 x2 y2x_1~y_1~x_2~y_2

    +

    输出格式

    +

    如果存在符合条件的点,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    x1x_1y1y_1x2x_2y2y_2输出
    00003333Yes
    00112233No
    1000000000100000000010000000001000000000999999999999999999999999999999999999Yes
    +

    分析

    +

    我们首先要知道,什么是“距离为5\sqrt5”。设(ac)2+(bd)2=5\sqrt{(a-c)^2+(b-d)^2}=\sqrt5a,b,c,da,b,c,d均为整数),则有:

    +

    (ac)2+(bd)2=5{ac,bd}={1,2}(a-c)^2+(b-d)^2=5\\ +\{a-c,b-d\}=\{1,2\} +

    +

    所以,对于(0,0)(0,0)这个点,有如下距离为5\sqrt5的点(其他点都类似):
    +距离sqrt5解释图

    +

    所以,我们对找到(x1,y1)(x_1,y_1)所有的距离为5\sqrt5的点,并对计算与(x2,y2)(x_2,y_2)的距离即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +using LL = long long;
    +const int d[8] = {-1, 1, 2, 2, 1, -1, -2, -2};
    +
    +inline LL sqr2(const LL& x, const LL& y)
    +{
    +	return x * x + y * y;
    +}
    +
    +int main()
    +{
    +	LL x1, y1, x2, y2;
    +	scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
    +	x1 -= x2, y1 -= y2;
    +	for(int i=0; i<8; i++)
    +		if(sqr2(x1 + d[i], y1 + d[(i + 2) & 7]) == 5)
    +		{
    +			puts("Yes");
    +			return 0;
    +		}
    +	puts("No");
    +	return 0;
    +}
    +
    +
    +

    D - Prime Sum Game

    +

    水题警告

    +

    题目大意

    +

    Takahashi和Aoki在玩一个游戏。游戏过程如下:

    +
      +
    1. Takahashi在中选择一个整数ANBA\le N\le B
    2. +
    3. Aoki中选择一个整数CMDC\le M\le D
    4. +
    5. 如果N+MN+M是质数,Aoki获胜。否则,Takahashi获胜。
    6. +
    +

    当两人都按最优策略游戏时,谁会赢得比赛?

    +

    1AB1001\le A\le B\le 100
    +1CD1001\le C\le D\le 100

    +

    输入格式

    +

    A B C DA~B~C~D

    +

    输出格式

    +

    输出胜者的名字,即TakahashiAoki

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBCCDD输出
    22333344Aoki
    1110010050506060Takahashi
    3314141155Aoki
    +

    分析

    +

    要解决这道题,首先要知道什么是“最优策略”。
    +显然,当Takahashi选择的NN加上任意的MM都不是质数时,Takahashi胜利;
    +否则,当任意的NN加上某一个MM都得到质数时,Aoki胜利。
    +因为数据范围较小,我们可以暴力枚举所有NNMM,质数判断耗时可以忽略不计。因此,总时间复杂度约为O(BD)\mathcal O(BD)

    +

    代码

    +

    P.S. 不可思议,运行时间居然是4ms4\mathrm{ms}..(本来以为至少也有30ms30\mathrm{ms}的..)

    +
    #include <cstdio>
    +using namespace std;
    +
    +inline bool isprime(int x)
    +{
    +	for(int t=__builtin_sqrt(x), i=2; i<=t; i++)
    +		if(x % i == 0)
    +			return false;
    +	return true;
    +}
    +
    +int main()
    +{
    +	int a, b, c, d;
    +	scanf("%d%d%d%d", &a, &b, &c, &d);
    +	for(int i=a; i<=b; i++)
    +	{
    +		int j = c;
    +		for(; j<=d; j++)
    +			if(isprime(i + j))
    +				break;
    +		if(j > d) { puts("Takahashi"); return 0; }
    +	}
    +	puts("Aoki");
    +	return 0;
    +}
    +
    +
    +

    E - Subtree K-th Max

    +

    题目大意

    +

    有一个由NN个节点(节点11,..,节点NN)组成的树(根节点为节点11)。
    +第ii条边连接节点AiA_iBiB_i。节点vv有一个数值XvX_v
    +给定QQ个询问,第ii个询问由(Vi,Ki)(V_i,K_i)组成:

    +
      +
    • 在以节点ViV_i为根的子树当中,求所有节点的数值的第KK大值(不去重)。
    • +
    +

    2N,Q1052\le N,Q\le 10^5
    +0Xi1090\le X_i\le 10^9
    +1Ai,Bi,ViN1\le A_i,B_i,V_i\le N
    +1Ki201\le K_i\le 20

    +

    输入格式

    +

    N QN~Q
    +X1  XNX_1~\dots~X_N
    +A1 B1A_1~B_1
    +\vdots
    +AN1 BN1A_{N-1}~B_{N-1}
    +V1 K1V_1~K_1
    +\vdots
    +VQ KQV_Q~K_Q

    +

    输出格式

    +

    输出QQ行。第ii行应包含对第ii个询问的回答。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    我们首先发现题面中,1K201\le K\le 20。于是我们对每个节点分别存储以它为根的子树中前2020的数值。
    +于是,我们按照拓扑序(或直接DFS\text{DFS}),执行如下操作:

    +
      +
    • 对于叶子节点,我们只存储一个当前的数值。
    • +
    • 对于其他的节点,先排序当前节点数值和所有孩子的前2020,排序后取前2020即可。
    • +
    +

    排序建议用priority_queue,时间复杂度O(N+Q)\mathcal O(N+Q)O(NlogN+Q)\mathcal O(N\log N+Q)(直接排序)。

    +

    代码

    +

    示例代码实现方式为DFS + priority_queue,用时190ms190\mathrm{ms}

    +
    #include <cstdio>
    +#include <queue>
    +#define maxn 100005
    +using namespace std;
    +
    +int x[maxn];
    +vector<int> G[maxn], dp[maxn];
    +
    +void dfs(int v, int par)
    +{
    +	priority_queue<int, vector<int>, greater<int>> q;
    +	q.push(x[v]);
    +	for(int u: G[v])
    +		if(u != par)
    +		{
    +			dfs(u, v);
    +			for(int val: dp[u])
    +			{
    +				q.push(val);
    +				if(q.size() > 20) q.pop();
    +			}
    +		}
    +	while(!q.empty())
    +	{
    +		dp[v].push_back(q.top());
    +		q.pop();
    +	}
    +}
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", x + i);
    +	for(int i=1; i<n; i++)
    +	{
    +		int a, b;
    +		scanf("%d%d", &a, &b);
    +		G[--a].push_back(--b);
    +		G[b].push_back(a);
    +	}
    +	dfs(0, -1);
    +	while(q--)
    +	{
    +		int v, k;
    +		scanf("%d%d", &v, &k);
    +		const auto& d = dp[--v];
    +		printf("%d\n", d[d.size() - k]);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc241/index.html b/post/abc241/index.html new file mode 100644 index 00000000..1fbcb1f2 --- /dev/null +++ b/post/abc241/index.html @@ -0,0 +1,571 @@ + + + + + +AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解 +

    + +
    +
    + 2022-03-05 · 8 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    D - Sequence Query

    +

    题目大意

    +

    我们有一个空序列AA。请依次处理QQ个命令,每个命令有三种类型,每种类型的格式如下:

    +
      +
    • 1 x:将xx加入AA不去重
    • +
    • 2 x k:求在AAx\le x的元素中,第kk大的值。
    • +
    • 3 x k:求在AAx\ge x的元素中,第kk小的值。
    • +
    +

    1Q2×1051\le Q\le 2\times 10^5
    +1x10181\le x\le 10^{18}
    +1k51\le k\le 5

    +

    分析

    +

    注意题面中的1k51\le k\le 5,我们可以用multiset解决问题。
    +multiset顾名思义,就是不去重的set,支持二分查找操作。关于multiset的具体用法,请看这里
    +对于每个查询,我们作如下处理:

    +
      +
    1. 1 x:直接加入multiset
    2. +
    3. 2 x k:先upper_bound,再将iterator向前移动kk
    4. +
    5. 3 x k:先lower_bound,再将iterator向后移动kk
    6. +
    +

    前面提到,因为kk的值很小,所以移动iterator的时间复杂度可以忽略不计。
    +因此,总时间复杂度最优为O(Q)\mathcal O(Q),平均O(QlogQ)\mathcal O(Q\log Q),最坏O(QlogQ)\mathcal O(Q\log Q)

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +using namespace std;
    +
    +int main()
    +{
    +	multiset<long long> s;
    +	int q;
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		int op;
    +		long long x;
    +		scanf("%d%lld", &op, &x);
    +		if(op == 1) s.insert(x);
    +		else
    +		{
    +			int k;
    +			scanf("%d", &k);
    +			if(op == 2)
    +			{
    +				bool bad = false;
    +				auto it = s.upper_bound(x);
    +				for(; k--; --it)
    +					if(it == s.begin())
    +					{
    +						bad = true;
    +						break;
    +					}
    +				if(bad) puts("-1");
    +				else printf("%lld\n", *it);
    +			}
    +			else
    +			{
    +				auto it = s.lower_bound(x);
    +				for(; --k; ++it)
    +					if(it == s.end())
    +						break;
    +				if(it == s.end()) puts("-1");
    +				else printf("%lld\n", *it);
    +			}
    +		}
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - Putting Candies

    +

    题目大意

    +

    给定长度为NN的序列A=(A0,A1,,AN1)A=(A_0,A_1,\dots,A_{N-1})
    +有一个空盘子。Takahashi每次会在其中加入A(XmodN)A_{(X\bmod N)}颗糖果(XX是当前盘子中糖果的数量)。
    +求KK次操作后的糖果总数。

    +

    2N2×1052\le N\le 2\times 10^5
    +1K10121\le K\le 10^{12}
    +1Ai1061\le A_i\le 10^6

    +

    分析

    +

    根据鸽笼原理(又称抽屉原理),A(XmodN)A_{(X\bmod N)}的结果在最多NN次操作后一定会重复。
    +因此,这道题可以看作数学上的一道周期问题。(又是数学题?!
    +我们只需分别记录结果对应的时间和时间对应的结果即可。
    +最终总时间复杂度O(n)\mathcal O(n),空间复杂度O(n)\mathcal O(n)

    +

    代码

    +

    代码参考:AtCoder官方题解

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +using LL = long long;
    +LL A[maxn], S[maxn];
    +int pre[maxn];
    +
    +int main()
    +{
    +	int n;
    +	LL k;
    +	scanf("%d%lld", &n, &k);
    +	for(int i=0; i<n; i++)
    +		scanf("%lld", A + i);
    +	for(int i=1; i<n; i++)
    +		pre[i] = -1;
    +	int time, s;
    +	for(int i=0; i<n; i++)
    +	{
    +		S[i + 1] = S[i] + A[S[i] % n];
    +		if(pre[S[i + 1] % n] != -1)
    +		{
    +			s = pre[S[i + 1] % n];
    +			time = i + 1;
    +			break;
    +		}
    +		pre[S[i + 1] % n] = i + 1;
    +	}
    +	if(k <= s) printf("%lld\n", S[k]);
    +	else
    +	{
    +		int p = time - s;
    +		LL X = S[time] - S[s], t = k - s - 1;
    +		printf("%lld\n", S[s + t % p + 1] + t / p * X);
    +	}
    +	return 0;
    +}
    +
    +
    +

    F - Skate

    +

    题目大意

    +

    有一个H×WH\times W的网格。网格上有NN个障碍物,第ii个的位置是(Xi,Yi)(X_i,Y_i)
    +我们从(sx,sy)(s_x,s_y)开始,每一步向上、下、左、右中的一个方向行走,直到撞上障碍物,停在它前面的方格中。求到达(gx,gy)(g_x,g_y)所用的最少步数。若无法到达终点,输出-1

    +

    1H,W1091\le H,W\le 10^9
    +1N1051\le N\le 10^5
    +1sx,gx,XiH1\le s_x,g_x,X_i\le H
    +1sy,gy,YiW1\le s_y,g_y,Y_i\le W
    +(sx,gx)(gx,gy)(Xi,Yi)(s_x,g_x)\ne(g_x,g_y)\ne(X_i,Y_i)
    +(Xi,Yi)(Xj,Yj)(X_i,Y_i)\ne(X_j,Y_j)iji\ne j

    +

    分析

    +

    这道题看似数据范围很大,实则不然。因为NN只有10510^5,所以我们很容易想到使用BFS\text{BFS},用map存储每行每列,对于每个坐标,二分查找当前行/列中的位置即可。

    +

    代码

    +

    写代码时注意事项主要有两点:

    +
      +
    1. 行和列的坐标一定要排序,也可以用set
    2. +
    3. 注意二分边界情况
    4. +
    +
    #include <cstdio>
    +#include <queue>
    +#include <set>
    +#include <unordered_map>
    +using namespace std;
    +
    +using LL = long long;
    +unordered_map<int, set<int>> row, col;
    +unordered_map<LL, int> dis;
    +
    +inline LL pack(LL x, int y) { return x << 31LL | y; }
    +inline void unpack(const LL& b, int& x, int& y) { x = b >> 31LL, y = b & 0x7fffffff; }
    +
    +int main()
    +{
    +	int h, w, n, sx, sy, gx, gy;
    +	scanf("%d%d%d%d%d%d%d", &h, &w, &n, &sx, &sy, &gx, &gy);
    +	for(int i=0; i<n; i++)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		row[x].insert(y);
    +		col[y].insert(x);
    +	}
    +	LL target = pack(gx, gy);
    +	queue<pair<LL, int>> q;
    +	q.emplace(pack(sx, sy), 0);
    +	while(!q.empty())
    +	{
    +		auto [p, d] = q.front(); q.pop();
    +		if(!dis.emplace(p, d).second) continue;
    +		if(p == target) { printf("%d\n", d); return 0; }
    +		int x, y;
    +		unpack(p, x, y), ++d;
    +		if(row.count(x))
    +		{
    +			auto& s = row[x];
    +			auto it = s.lower_bound(y);
    +			if(it != s.end()) q.emplace(pack(x, *it - 1), d);
    +			if(it != s.begin()) q.emplace(pack(x, *--it + 1), d);
    +		}
    +		if(col.count(y))
    +		{
    +			auto& s = col[y];
    +			auto it = s.lower_bound(x);
    +			if(it != s.end()) q.emplace(pack(*it - 1, y), d);
    +			if(it != s.begin()) q.emplace(pack(*--it + 1, y), d);
    +		}
    +	}
    +	puts("-1");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc242/index.html b/post/abc242/index.html new file mode 100644 index 00000000..6e3e85d2 --- /dev/null +++ b/post/abc242/index.html @@ -0,0 +1,657 @@ + + + + + +AtCoder Beginner Contest 242 C~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 242 C~E 题解 +

    + +
    +
    + 2022-03-08 · 9 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    C - 1111gal password

    +

    题目大意

    +

    给定正整数NN,求符合下列条件的整数XX的个数,对998244353998244353取模:

    +
      +
    • XXNN位的正整数
    • +
    • XX每一位数都在[1,9][1,9]之间(0不行
    • +
    • XX的相邻两位数之差的绝对值不超过11
    • +
    +

    2N1062\le N\le 10^6

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    NN输出
    44203203
    222525
    10000001000000248860093248860093
    +

    分析

    +

    根据乘法原理可得,符合条件的NN位数最多有9N9^N个,显然不能暴力求解。
    +但是,由于每一位会被上一位所限制,所以我们很容易想到使用DP\text{DP}求解。
    +令f(i,j)=Xf(i,j)=X的第ii位上出现jj的可能数,易得:

    +

    f(i,j)={1(i=1)f(i1,1)+f(i1,2)(j=1)f(i1,8)+f(i1,9)(j=9)f(i1,j1)+f(i1,j)+f(i1,j+1)(i>1,2j8)f(i,j)=\begin{cases} +1&(i=1)\\ +f(i-1,1)+f(i-1,2)&(j=1)\\ +f(i-1,8)+f(i-1,9)&(j=9)\\ +f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)&(i>1,2\le j\le8) +\end{cases} +

    +

    因此,直接输出i=19f(n,i)\sum\limits_{i=1}^9f(n,i)即可。

    +

    代码

    +

    本代码运用了滚动表的优化,当然也可以直接开N×9N\times9大小的数组,但这样会导致内存占用大,不建议使用。

    +
    #include <cstdio>
    +#define MOD 998244353
    +using namespace std;
    +
    +inline void mod(int& x)
    +{
    +	if(x >= MOD) x -= MOD;
    +}
    +
    +int dp[9], ldp[9];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<9; i++)
    +		dp[i] = 1;
    +	while(--n)
    +	{
    +		for(int i=0; i<9; i++)
    +			ldp[i] = dp[i];
    +		mod(dp[0] += dp[1]), mod(dp[8] += dp[7]);
    +		for(int i=1; i<8; i++)
    +			mod(dp[i] += ldp[i - 1]),
    +			mod(dp[i] += ldp[i + 1]);
    +	}
    +	int ans = 0;
    +	for(int i=0; i<9; i++)
    +		mod(ans += dp[i]);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - ABC Transform

    +

    题目大意

    +

    给定由ABC组成的字符串SS。令S0=SS_0=SSi=Si1S_i=S_{i-1}ABC分别替换为BCCAAB的新字符串。
    +回答QQ个查询,第ii个查询的问题如下:

    +
      +
    • StiS_{t_i}的第kik_i个字母。
    • +
    +

    1S1051\le |S|\le 10^5
    +1Q1051\le Q\le 10^5
    +1ti10181\le t_i\le 10^{18}
    +1kimin(1018,Sti1\le k_i\le min(10^{18},S_{t_i}的长度))

    +

    输入格式

    +

    SS
    +QQ
    +t1 k1t_1~k_1
    +\vdots
    +tQ kQt_Q~k_Q

    +

    样例

    +

    样例输入1

    +
    ABC
    +4
    +0 1
    +1 1
    +1 3
    +1 6
    +
    +

    样例输出1

    +
    A
    +B
    +C
    +B
    +
    +
      +
    • S0= S_0=~ABC
    • +
    • S1= S_1=~AABCB
    • +
    +

    样例输入2

    +
    CBBAACCCCC
    +5
    +57530144230160008 659279164847814847
    +29622990657296329 861239705300265164
    +509705228051901259 994708708957785197
    +176678501072691541 655134104344481648
    +827291290937314275 407121144297426665
    +
    +

    样例输出2

    +
    A
    +A
    +C
    +A
    +A
    +
    +

    注意小心整数溢出问题。

    +

    分析

    +

    f(t,k)=(S0f(t,k)=(S_0AAA..StS_t的第kk个字母,其中ABC分别对应0,1,20,1,2kk00开始)),则通过找规律可得:

    +

    f(t,k)={0(t=0)g(0,t)(k=0)g(f(t1,k2),(kmod2)+1)(t>0,k>0)f(t,k)=\begin{cases} +0 & (t=0)\\ +g(0,t) & (k=0)\\ +g(f(t-1,\lfloor\frac k2\rfloor),(k\bmod2)+1) & (t>0,k>0) +\end{cases} +

    +

    其中g(c,x)g(c,x)为字符ccA,B,C,A,...这个环中cc后面的第xx个字符,即g(c,x)=(c+x)mod3g(c,x)=(c+x)\bmod3
    +因此,我们只要求出xxSS的哪个字符分解后的结果中,再计算ff即可。
    +答案为ans=g(f(t,(k1)mod2t),Sk12t)\mathrm{ans}=g(f(t,(k-1)\bmod2^t),S_{\lfloor\frac {k-1}{2t}\rfloor})

    +

    代码

    +

    以下两种示范代码均使用非递归形式,当然也可使用递归形式。

    +

    代码1(标准)

    +
    #include <cstdio>
    +using namespace std;
    +
    +char s[100005];
    +
    +int main()
    +{
    +	scanf("%s", s);
    +	int q;
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		long long t, k;
    +		scanf("%lld%lld", &t, &k);
    +		k --;
    +		int x = s[t < 64? k >> t: 0] - 'A'; // 防止t太大导致RE
    +		while(t > 0 && k > 0)
    +		{
    +			x = (x + int(k & 1LL) + 1) % 3;
    +			k >>= 1LL, t --;
    +		}
    +		putchar((t + x) % 3 + 'A');
    +		putchar('\n');
    +	}
    +	return 0;
    +}
    +
    +

    代码2(优化)

    +
    #include <cstdio>
    +using namespace std;
    +
    +char s[100005];
    +
    +int main()
    +{
    +	scanf("%s", s);
    +	int q;
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		long long t, k;
    +		scanf("%lld%lld", &t, &k);
    +		k --;
    +		int c = 0;
    +		if(t < 64)
    +		{
    +			c = s[k >> t] - 'A';
    +			k &= (1LL << t) - 1LL;
    +		}
    +		else c = s[0] - 'A';
    +		for(c+=t%3; k>0; k&=k-1) c ++;
    +		putchar(c % 3 + 'A');
    +		putchar('\n');
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - (∀x∀)

    +

    题目大意

    +

    对于TT个测试点,分别解决下列问题:
    +给定整数NN和字符串SS,求合法字符串XX的个数,使其符合下列条件:

    +
      +
    • X=N|X|=N
    • +
    • XX由大写英文字母组成,是一个回文串
    • +
    • 按字典序,XSX\le S
    • +
    +

    1T2500001\le T\le 250000
    +1N1061\le N\le 10^6
    +1N1061\le \sum N\le 10^6
    +S=N|S|=N且由大写英文字母组成。

    +

    分析

    +

    显然,通过XX的前N2\lceil\frac N2\rceil个字符就可以确定唯一的XX。下面,我们以ABCDE为例:

    +
      +
    • ABCDE的前N2\lceil\frac N2\rceil个字符分别为ABC
    • +
    • 字典序小于ABC的字符串有2828个(可看作一个2626进制数来计算)
    • +
    • 判断ABCBA是否可行,与ABCDE比较
    • +
    • 可行,答案增加11得到2929
    • +
    +

    因此,我们输出2929。其他情况类似。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 1000005
    +#define MOD 998244353
    +using namespace std;
    +
    +using LL = long long;
    +char s[maxn];
    +
    +int main()
    +{
    +	int T;
    +	scanf("%d", &T);
    +	while(T--)
    +	{
    +		int n;
    +		scanf("%d%s", &n, s);
    +		long long x = 0LL;
    +		int j = n - 1 >> 1;
    +		for(int i=0; i<=j; i++)
    +			(x = x * 26LL + s[i] - 'A') %= MOD;
    +		bool ok = true;
    +		while(j >= 0)
    +		{
    +			if(s[j] < s[n - 1 - j]) break;
    +			if(s[j] > s[n - 1 - j]) { ok = false; break;}
    +			j --;
    +		}
    +		if(ok && ++x == MOD) x -= MOD;
    +		printf("%lld\n", x);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc244/index.html b/post/abc244/index.html new file mode 100644 index 00000000..85cd5020 --- /dev/null +++ b/post/abc244/index.html @@ -0,0 +1,604 @@ + + + + + +AtCoder Beginner Contest 244 D~F 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 244 D~F 题解 +

    + +
    +
    + 2022-03-20 · 7 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    D - Swap Hats

    +

    题目大意

    +

    33个Takahashi,他们帽子的颜色分别为S1,S2,S3S_1,S_2,S_3
    +我们现在想通过正好101810^{18}次操作,使得Si=TiS_i=T_i
    +每次操作如下:

    +
      +
    • 选择(i,j)(i,j),交换SiS_iSjS_j
    • +
    +

    试问能否达成目标?

    +

    输入格式

    +

    S1 S2 S3S_1~S_2~S_3
    +T1 T2 T3T_1~T_2~T_3

    +

    输出格式

    +

    如果能达成目标,输出Yes;否则,输出No

    +

    样例

    +

    样例输入

    +
    R G B
    +R G B
    +
    +

    样例输出

    +
    Yes
    +
    +

    分析

    +

    本题情况不多,可以手动枚举所有可能的情况,最终发现所有Si=TiS_i=T_i或者所有SiTiS_i\ne T_i时输出Yes,否则输出No

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	char a, b, c, d, e, f;
    +	scanf("%c %c %c %c %c %c", &a, &b, &c, &d, &e, &f);
    +	puts(((a == d) + (b == e) + (c == f)) == 1? "No": "Yes");
    +	return 0;
    +}
    +
    +
    +

    E - King Bombee

    +

    题目大意

    +

    给定由NN个点、MM条边组成的简单无向图。第ii条边连接顶点UiU_iViV_i
    +求图中从SSTT、长度为KK经过顶点XX偶数次的路径的数量,998244353998244353取模

    +

    2N20002\le N\le 2000
    +1M20001\le M\le 2000
    +1K20001\le K\le 2000
    +1S,T,XN1\le S,T,X\le N
    +XS,XTX\ne S,X\ne T
    +1Ui<ViN1\le U_i<V_i\le N
    +(Ui,Vi)(Uj,Vj)(U_i,V_i)\ne(U_j,V_j)iji\ne j

    +

    输入格式

    +

    N M K S T XN~M~K~S~T~X
    +U1 V1U_1~V_1
    +\vdots
    +UN VNU_N~V_N

    +

    输出格式

    +

    输出图中从SSTT、长度为KK经过顶点XX偶数次的路径的数量,998244353998244353取模

    +

    样例

    +

    样例输入1

    +
    4 4 4 1 3 2
    +1 2
    +2 3
    +3 4
    +1 4
    +
    +

    样例输出1

    +
    4
    +
    +

    44条符合条件的路径:

    +
      +
    • 121231\to2\to1\to2\to3
    • +
    • 123231\to2\to3\to2\to3
    • +
    • 141431\to4\to1\to4\to3
    • +
    • 143431\to4\to3\to4\to3
    • +
    +

    注意X=2X=2必须出现偶数次。

    +

    样例输入2

    +
    6 5 10 1 2 3
    +2 3
    +2 4
    +4 6
    +3 6
    +1 5
    +
    +

    样例输出2

    +
    0
    +
    +

    这张图没有连通。

    +

    样例输入3

    +
    10 15 20 4 4 6
    +2 6
    +2 7
    +5 7
    +4 5
    +2 4
    +3 7
    +1 7
    +1 4
    +2 9
    +5 10
    +1 3
    +7 8
    +7 9
    +1 6
    +1 2
    +
    +

    样例输出3

    +
    952504739
    +
    +

    注意998244353998244353取模

    +

    分析

    +

    我们先不考虑XX的限制条件,则可以令dp(i,j)= \mathrm{dp}(i,j)=~ii步走到jj的可能数,则因为点jj可以从GjG_j中的任意一点走过来(GG为邻接表存储),所以我们得到

    +

    dp(i,j)=k=1Gjdp(i1,Gjk)\mathrm{dp}(i,j)=\sum_{k=1}^{|G_j|} \mathrm{dp}(i-1,{G_j}_k) +

    +

    再考虑XX必须是偶数的情况,令dp(i,j,k)= \mathrm{dp}(i,j,k)=~ii步走到jjXX的出现次数除以22的余数为kk的情况,则每次额外判断Gjk{G_j}_k是否等于XX即可。
    +DP\mathrm{DP}状态转移方程详见代码。

    +

    代码

    +

    注意:代码中运用了滚动表的优化,可以节省空间,当然也可以使用普通写法。

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 2005
    +#define MOD 998244353
    +using namespace std;
    +
    +inline void mod(int& x)
    +{
    +	if(x >= MOD) x -= MOD;
    +}
    +
    +vector<int> G[maxn];
    +int dp[2][maxn][2];
    +
    +int main()
    +{
    +	int n, m, k, s, t, x;
    +	scanf("%d%d%d%d%d%d", &n, &m, &k, &s, &t, &x);
    +	x --;
    +	while(m--)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[--u].push_back(--v);
    +		G[v].push_back(u);
    +	}
    +	dp[0][--s][0] = 1;
    +	for(int i=1; i<=k; i++)
    +	{
    +		bool c = i & 1, p = i & 1 ^ 1;
    +		for(int v=0; v<n; v++)
    +		{
    +			dp[c][v][0] = dp[c][v][1] = 0;
    +			for(int u: G[v])
    +				mod(dp[c][v][0] += dp[p][u][u == x]),
    +				mod(dp[c][v][1] += dp[p][u][u != x]);
    +		}
    +	}
    +	printf("%d\n", dp[k & 1][--t][0]);
    +    return 0;
    +}
    +
    +
    +

    F - Shortest Good Path

    +

    分析

    +

    dis[S][j]= \mathrm{dis}[S][j]=~于点jj结束的good path with respest to S的最短长度,跑一遍BFS\text{BFS}即可。具体实现时可将SS按位压缩为二进制,加快运算速度。

    +

    代码

    +
    #include <cstdio>
    +#include <queue>
    +#define INF 2147483647
    +#define maxn 17
    +using namespace std;
    +
    +using ULL = unsigned long long;
    +
    +int dis[1 << maxn][maxn];
    +vector<int> G[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[--u].push_back(--v);
    +		G[v].push_back(u);
    +	}
    +	queue<ULL> q;
    +	for(int i=0; i<n; i++)
    +		dis[1 << i][i] = 1, q.push(1ULL<<i+32^i);
    +	while(!q.empty())
    +	{
    +		ULL pkg = q.front(); q.pop();
    +		int st = pkg >> 32ULL, v = pkg & 0x7fffffff;
    +		int nd = dis[st][v] + 1;
    +		for(int u: G[v])
    +		{
    +			int nst = st ^ (1 << u);
    +			if(dis[nst][u] == 0)
    +			{
    +				dis[nst][u] = nd;
    +				q.push(ULL(nst) << 32ULL ^ u);
    +			}
    +		}
    +	}
    +	long long ans = 0LL;
    +	for(int i=1, lim=1<<n; i<lim; i++)
    +	{
    +		int cur = INF;
    +		for(int j=0; j<n; j++)
    +			if(dis[i][j] > 0 && dis[i][j] < cur)
    +				cur = dis[i][j];
    +		ans += cur;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc245/index.html b/post/abc245/index.html new file mode 100644 index 00000000..f5ece882 --- /dev/null +++ b/post/abc245/index.html @@ -0,0 +1,687 @@ + + + + + +AtCoder Beginner Contest 245 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 245 A~E 题解 +

    + +
    +
    + 2022-03-28 · 10 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Good morning

    +

    题目大意

    +

    在同一天里,Takahashi在AABB分起床,Aoki在CCDD11秒起床,请问谁起床更早?

    +

    0A,C<240\le A,C<24
    +0B,D<600\le B,D<60

    +

    输入格式

    +

    A B C DA~B~C~D

    +

    输出格式

    +

    输出起得更早的人的名字(TakahashiAoki)。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBCCDD输出
    7700663030Aoki
    773030773030Takahashi
    000023235959Takahashi
    +

    分析

    +

    思路很明显,直接判断(A,B)(C,D)(A,B)\le(C,D)是否成立即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c, d;
    +	scanf("%d%d%d%d", &a, &b, &c, &d);
    +	puts((a == c? b <= d: a < c)? "Takahashi": "Aoki");
    +	return 0;
    +}
    +
    +
    +

    B - Mex

    +

    题目大意

    +

    给定整数序列A=(A1,,AN)A=(A_1,\dots,A_N)。求最小的不在AA中的自然数。

    +

    1N20001\le N\le 2000
    +0Ai20000\le A_i\le 2000

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N

    +

    输出格式

    +

    输出一行,即最小的不在AA中的自然数。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    由于题面中有限制0Ai20000\le A_i\le 2000,所以我们直接开一个数组记录[0,2001][0,2001]中每个数是否出现过即可。
    +本题方法很多,这里介绍的是最快的算法,时间复杂度O(N)\mathcal O(N)

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +bool used[2005];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	while(n--)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		used[a] = true;
    +	}
    +	int i = -1;
    +	while(used[++i]);
    +	printf("%d\n", i);
    +	return 0;
    +}
    +
    +
    +

    C - Choose Elements

    +

    题目大意

    +

    给定两个长度为NN的整数序列A=(A1,,AN)A=(A_1,\dots,A_N)B=(B1,,BN)B=(B_1,\dots,B_N)
    +问是否存在序列X=(X1,,XN)X=(X_1,\dots,X_N),满足如下条件:

    +
      +
    • Xi=AiX_i=A_iXi=BiX_i=B_i
    • +
    • XiXi+1K|X_i-X_{i+1}|\le K,其中1i<N1\le i<N
    • +
    +

    1N2×1051\le N\le 2\times 10^5
    +1K1091\le K\le 10^9
    +1Ai,Bi1091\le A_i,B_i\le 10^9

    +

    输入格式

    +

    N KN~K
    +A1  ANA_1~\dots~A_N
    +B1  BNB_1~\dots~B_N

    +

    输出格式

    +

    如果存在符合全部条件的XX,输出Yes;否则,输出No

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    好家伙,C题都要用dp……
    +本题普通的方法貌似不太好做,因此我们考虑DP\text{DP}
    +令f(i)=Xif(i)=X_i选择能否等于AiA_ig(i)=Xig(i)=X_i能否等于BiB_i
    +然后状态转移方程就简单了,详见代码。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +int a[maxn], b[maxn];
    +bool f[maxn], g[maxn];
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", b + i);
    +	f[0] = g[0] = true;
    +#define set(x, y, z) x |= y - z <= k && z - y <= k
    +	for(int i=1; i<n; i++)
    +	{
    +		if(f[i - 1])
    +			set(f[i], a[i - 1], a[i]),
    +			set(g[i], a[i - 1], b[i]);
    +		if(g[i - 1])
    +			set(f[i], b[i - 1], a[i]),
    +			set(g[i], b[i - 1], b[i]);
    +	}
    +	puts(f[n - 1] || g[n - 1]? "Yes": "No");
    +	return 0;
    +}
    +
    +

    注:本题还有一种很奇怪的解法,就是直接判断相邻的四种连接方式是否有至少一种能连通,比如#30453703,如果有大佬能证明这种方法的正确性,欢迎在评论区留言告诉我,谢谢!

    +
    +

    D - Polynomial division

    +

    题目大意

    +

    我们有三个多项式

    +

    A(x)=i=0NAiXiB(x)=i=0MBiXiC(x)=i=0N+MBiXiA(x)=\sum_{i=0}^N A_iX^i\\ +B(x)=\sum_{i=0}^M B_iX^i\\ +C(x)=\sum_{i=0}^{N+M} B_iX^i +

    +

    已知A0,,ANA_0,\dots,A_NC0,,CNC_0,\dots,C_NA(x)×B(x)=C(x)A(x)\times B(x)=C(x)xRx\in R),求B0,,BMB_0,\dots,B_M
    +换句话说,给定多项式AACC每一项的系数,求多项式B=CAB=\frac C A

    +

    1N,M<1001\le N,M<100
    +Ai100|A_i|\le 100
    +Ci106|C_i|\le 10^6
    +AN0,CN+M0A_N\ne0,C_{N+M}\ne0
    +题目保证存在合法的(B0,,BM)(B_0,\dots,B_M)

    +

    输入格式

    +

    N MN~M
    +A0  ANA_0~\dots~A_N
    +C0  CN+MC_0~\dots~C_{N+M}

    +

    输出格式

    +

    输出B0,,BMB_0,\dots,B_M,用空格分隔。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    本题可以直接模拟多项式的大除法运算,运算时只需记录系数即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 105
    +using namespace std;
    +
    +int a[maxn], b[maxn], c[maxn << 1];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<=n; i++) scanf("%d", a + i);
    +	for(int i=0; i<=n+m; i++) scanf("%d", c + i);
    +	for(int i=m; i>=0; i--) // NOTE: 必须倒推!
    +	{
    +		b[i] = c[n + i] / a[n];
    +		for(int j=0; j<=n; j++)
    +			c[i + j] -= a[j] * b[i];
    +	}
    +	for(int i=0; i<=m; i++)
    +		printf("%d ", b[i]);
    +	return 0;
    +}
    +
    +
    +

    E - Wrapping Chocolate

    +

    题目大意

    +

    我们有NN块巧克力和MM个盒子。第ii块巧克力长AiA_i厘米,宽BiB_i厘米;第ii个盒子长CiC_i厘米,宽DiD_i厘米。
    +问是否能把巧克力分别装在盒子里,使其满足如下条件:

    +
      +
    • 每个盒子里只能有一块巧克力。
    • +
    • 当我们将第ii块巧克力放入第jj个盒子里时,AiCjA_i\le C_jBiDjB_i\le D_j必须都成立。
    • +
    +

    1NM2×1051\le N\le M\le 2\times10^5
    +1Ai,Bi,Ci,Di1091\le A_i,B_i,C_i,D_i\le 10^9

    +

    输入格式

    +

    N MN~M
    +A1  ANA_1~\dots~A_N
    +B1  BNB_1~\dots~B_N
    +C1  CNC_1~\dots~C_N
    +D1  DND_1~\dots~D_N

    +

    输出格式

    +

    如果有合法的方法,输出Yes;否则,输出No

    +

    分析

    +

    本题可以考虑如下贪心算法:

    +
      +
    1. 将所有的巧克力和盒子放入一个数组,按长度AiA_iCiC_i的降序排序,长度相等的把盒子排在前面。
    2. +
    3. 准备好一个空序列S=()S=(),按如下规则遍历每个元素: +
        +
      • 如果当前遍历的是一个盒子(Ci,Di)(C_i,D_i)
        +将DiD_i加入SS
      • +
      • 如果当前遍历的是一块巧克力(Ai,Bi)(A_i,B_i)
        +从SS中删除不超过BiB_i的最小元素,如果没有元素可删除,输出No
      • +
      +
    4. +
    5. 如果顺利地遍历了所有元素,输出Yes;否则,输出No
    6. +
    +

    本算法的时间复杂度是O(MN)\mathcal O(MN),但经过multiset优化后可降为O((M+N)log(M+N)\mathcal O((M+N)\log(M+N),具体实现详见代码。

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#include <algorithm>
    +using namespace std;
    +
    +struct Item {
    +	int w, h;
    +	bool type;
    +	inline bool operator <(const Item& i2) const {
    +		return w == i2.w? type > i2.type: w > i2.w;
    +		//                ^^^^^^^^^^^^^^
    +		// 注意sort必须有严格顺序,一开始我这里写成了type==1导致RE,详见:
    +		// https://atcoder.jp/contests/abc245/submissions/30526563
    +	}
    +} v[400005];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	// Chocolate
    +	for(int i=0; i<n; i++) scanf("%d", &v[i].w);
    +	for(int i=0; i<n; i++) scanf("%d", &v[i].h);
    +	// Box
    +	m += n;
    +	for(int i=n; i<m; i++) scanf("%d", &v[i].w);
    +	for(int i=n; i<m; i++) scanf("%d", &v[i].h);
    +	for(int i=n; i<m; i++) v[i].type = 1;
    +	// Algorithm
    +	sort(v, v + m);
    +	multiset<int> s;
    +	for(int i=0; i<m; i++)
    +	{
    +		const Item& it = v[i];
    +		if(it.type) s.insert(it.h); // Box
    +		else
    +		{
    +			auto itr = s.lower_bound(it.h);
    +			if(itr == s.end())
    +			{
    +				puts("No");
    +				return 0;
    +			}
    +			s.erase(itr);
    +		}
    +	}
    +	puts("Yes");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc248/index.html b/post/abc248/index.html new file mode 100644 index 00000000..bf9db7fa --- /dev/null +++ b/post/abc248/index.html @@ -0,0 +1,493 @@ + + + + + +UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248)C~D 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248)C~D 题解 +

    + +
    +
    + 2022-04-17 · 5 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    C - Dice Sum

    +

    题目大意

    +

    有多少个整数序列A=(A1,,AN)A=(A_1,\dots,A_N)符合如下条件:

    +
      +
    • 1AiM1\le A_i\le M
    • +
    • i=1NAiK\sum\limits_{i=1}^NA_i\le K
    • +
    +

    输出答案,对998244353998244353取模。

    +

    1N,M501\le N,M\le 50
    +NKNMN\le K\le NM

    +

    输入格式

    +

    N M KN~M~K

    +

    输出格式

    +

    输出答案,对998244353998244353取模。

    +

    分析

    +

    艹C题又要dp
    +考虑DP\text{DP}思想,令dp(i,j):=A\text{dp}(i,j):=A的前ii个元素中和为jj的总可能数(1AxM1\le A_x\le M),则可得伪代码:

    +
    dp[0][0] = 1
    +for i = 0 to N-1 // 逐个位置考虑
    +	for j = 0 to K-1 // 考虑所有和的情况,无需考虑K
    +		for k = 1 to M // 1-M的每个选择
    +			if j + k <= K: // 限制条件
    +				dp[i + 1][j + k] += dp[i][j] // 更新dp[i+1]
    +
    +

    时间复杂度为O(NMK)\mathcal O(NMK),可以通过

    +
    +

    其实还可以利用前缀和优化
    +不难发现dp(i,j)=k=LRdp(i1,k)\mathrm{dp}(i,j)=\displaystyle\sum_{k=L}^R\text{dp}(i-1,k)
    +其中LRL\le R,具体的值请自行推导。
    +因此,我们可以记录dp[i1]\mathrm{dp}[i-1]的前缀和pre\mathrm{pre}

    +
      +
    • prej=k=1jdp(i1,k)\mathrm{pre}_j=\displaystyle\sum_{k=1}^j\mathrm{dp}(i-1,k)
    • +
    +

    dp(i,j)=preRpreL1\mathrm{dp}(i,j)=\mathrm{pre}_R-\mathrm{pre}_{L-1}
    +因此,时间复杂度为O(NK)\mathcal O(NK)
    +强烈建议读者独立推导并实现该方法。 前缀和优化DP\text{DP}的算法在E、F题中很常见。

    +
    +

    代码

    +
    #include <cstdio>
    +#define MOD 998244353
    +#define maxn 200005
    +using namespace std;
    +
    +inline void mod(int& x) { if(x >= MOD) x -= MOD; }
    +int dp[2][maxn];
    +
    +int main()
    +{
    +	int n, m, k;
    +	scanf("%d%d%d", &n, &m, &k);
    +	dp[0][0] = 1;
    +	for(int i=0; i<n; i++)
    +	{
    +		int c = i & 1, p = c ^ 1;
    +		for(int j=0; j<=k; j++)
    +			dp[p][j] = 0;
    +		for(int j=0; j<k; j++)
    +			for(int d=1; d<=m && d<=k-j; d++)
    +				mod(dp[p][j + d] += dp[c][j]);
    +	}
    +	int ans = 0;
    +	for(int i=1; i<=k; i++)
    +		mod(ans += dp[n & 1][i]);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Range Count Query

    +

    题目大意

    +

    给定整数序列A=(A1,,AN)A=(A_1,\dots,A_N)
    +有QQ个查询。每个查询的格式如下:

    +
      +
    • 给定三个整数L,R,XL,R,X,求AL,,ARA_L,\dots,A_RXX的出现次数。
    • +
    +

    1Ai,XN2×1051\le A_i,X\le N\le 2\times10^5
    +1LRN1\le L\le R\le N

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N
    +QQ
    +L1 R1 X1L_1~R_1~X_1
    +\vdots
    +LQ RQ XQL_Q~R_Q~X_Q

    +

    输出格式

    +

    输出QQ行,第ii行是第ii个查询的答案。

    +

    分析

    +

    题目换句话说就是:求XX出现的位置中,在[L,R][L,R]区间内的有多少个?
    +因此,我们很容易想到先预处理1,,N1,\dots,N中每个数出现的位置,存入vector,查询时二分即可。

    +

    代码

    +

    注意二分边界。

    +
    #include <cstdio>
    +#include <vector>
    +#include <algorithm>
    +#define maxn 200005
    +using namespace std;
    +
    +vector<int> pos[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a; scanf("%d", &a);
    +		pos[a].push_back(i);
    +	}
    +	scanf("%d", &q);
    +	while(q--)
    +	{
    +		int l, r, x;
    +		scanf("%d%d%d", &l, &r, &x);
    +		printf("%d\n", int(
    +			lower_bound(pos[x].begin(), pos[x].end(), r) -
    +			lower_bound(pos[x].begin(), pos[x].end(), --l)
    +		));
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc250/index.html b/post/abc250/index.html new file mode 100644 index 00000000..e0946f4a --- /dev/null +++ b/post/abc250/index.html @@ -0,0 +1,649 @@ + + + + + +AtCoder Beginner Contest 250 C~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 250 C~E 题解 +

    + +
    +
    + 2022-05-11 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    C - Adjacent Swaps

    +

    题目大意

    +

    NN个球从左到右排成一列。开始时,从左往右的第ii个球上写着数字ii
    +请执行QQ个操作,第ii个操作如下:

    +
      +
    • j= Nj=~N个球中写着数字xix_i的球的位置
    • +
    • 如果j=Nj=N,将其与第j1j-1个球交换;否则,与第j+1j+1个球交换。
    • +
    +

    求所有操作后的球上分别写的数字。详见输出格式。

    +

    2N2×1052\le N\le 2\times 10^5
    +1Q2×1051\le Q\le 2\times 10^5
    +1xiN1\le x_i\le N

    +

    输入格式

    +

    N QN~Q
    +x1x_1
    +\vdots
    +xQx_Q

    +

    输出格式

    +

    ai=Na_i=N个球中从左往右的第ii在所有操作结束后写的数,则按如下格式输出:
    +a1 a2  ana_1~a_2~\dots~a_n
    +即a1,,ana_1,\dots,a_n按顺序输出到一行,用空格隔开

    +

    样例

    +

    略,请自行前往AtCoder查看。

    +

    分析

    +

    根据数据范围可得,本题只能使用时间复杂度不超过O(N+Qlogn)\mathcal O(N+Q\log n)的算法
    +因此,暴力模拟,即查找每个球对应的位置jjO(NQ)\mathcal O(NQ))肯定是行不通的。

    +

    但是很容易想到可以设置索引数组pp,使当ai=xa_i=x时,px=ip_x=i
    +这样,对于每一个操作,只需O(1)\mathcal O(1)的时间复杂度就能找到xix_i出现的位置。
    +交换时注意同时交换一下aapp中的元素即可。总时间复杂度O(N+Q)\mathcal O(N+Q)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +inline void swap(int& x, int& y) { x ^= y ^= x ^= y; }
    +
    +int pos[maxn], ans[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=1; i<=n; i++)
    +		ans[i] = pos[i] = i;
    +	while(q--)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		int p1 = pos[x];
    +		int p2 = p1 == n? p1 - 1: p1 + 1;
    +		swap(pos[x], pos[ans[p2]]);
    +		swap(ans[p1], ans[p2]);
    +	}
    +	for(int i=1; i<=n; i++)
    +		printf("%d ", ans[i]);
    +	return 0;
    +}
    +
    +
    +

    D - 250-like Number

    +

    题目大意

    +

    当一个正整数kk满足以下条件时,我们称其为“与250250相似的”:

    +
      +
    • k=p×q3k=p\times q^3,其中p,qp,q均为质数,且p<qp<q
    • +
    +

    求不超过NN的“与250250相似的”kk的个数。

    +

    1N10181\le N\le 10^{18}

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    将答案输出为一个整数。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    NN输出
    25025022
    1100
    123456789012345123456789012345226863226863
    +

    分析

    +

    看到数据范围后我们发现NN太大,不能盲目下手。
    +由k=p×q3,kNk=p\times q^3,k\le N可知,p×q3N1018p\times q^3\le N\le 10^{18}
    +又因为p,qp,q是质数,且p<qp<q可得,2p<q2\le p<q
    +因此,当pp最小时qq最大,所以qN=1018p=23794000q\le \sqrt[3]{\frac {N=10^{18}} {p=2}}\approx794000

    +

    这时,可以想到筛出质数表,并对于每个质数pp计算最大的qq,此时质数p<xqp<x\le q都能作为qq,因此将答案加上p<xqp<x\le q的质数数量即可。当pqp\ge q时,退出循环,输出结果即可。

    +

    计算qq时可以使用二分查找或者双指针算法快速处理。
    +总时间复杂度大约在O(n722)\mathcal O(n^{\frac 7 {22}})

    +

    代码

    +

    本代码使用双指针实现。

    +
    #include <cstdio>
    +#include <cmath>
    +#include <vector>
    +#define maxp 794000
    +using namespace std;
    +
    +using LL = long long;
    +
    +bool bad[maxp];
    +vector<int> primes;
    +
    +inline LL pow3(LL x) { return x * x * x; }
    +
    +int main()
    +{
    +	bad[0] = bad[1] = true;
    +	for(int i=2; i<maxp; i++)
    +		if(!bad[i])
    +		{
    +			primes.push_back(i);
    +			for(int j=i<<1; j<maxp; j+=i)
    +				bad[j] = true;
    +		}
    +	LL n;
    +	scanf("%lld", &n);
    +	LL ans = 0LL;
    +	for(int i=0, j=primes.size()-1; i<j; i++)
    +	{
    +		while(j >= 0 && primes[i] * pow3(primes[j]) > n) j --;
    +		if(i >= j) break;
    +		ans += j - i;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Prefix Equality

    +

    题目大意

    +

    给定长度为NN的正整数序列A=(A1,,AN)A=(A_1,\dots,A_N)B=(B1,,BN)B=(B_1,\dots,B_N)
    +对于每个1iQ1\le i\le Q,给定两个正整数xi,yix_i,y_i,回答如下格式的查询:

    +
      +
    • 判断集合{A1,,Axi}\{A_1,\dots,A_{x_i}\}{B1,,Byi}\{B_1,\dots,B_{y_i}\}是否相等。
    • +
    +
    +

    集合可以说成是序列排序并去重的结果,如序列(9,3,5,3,4)(9,3,5,3,4)对应的集合是{3,4,5,9}\{3,4,5,9\}

    +
    +

    1N,Q2×1051\le N,Q\le 2\times 10^5
    +1AiBi1091\le A_i\le B_i\le 10^9
    +1xi,yiN1\le x_i,y_i\le N

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N
    +B1  BNB_1~\dots~B_N
    +QQ
    +x1 y1x_1~y_1
    +\vdots
    +xQ yQx_Q~y_Q

    +

    样例

    +

    样例输入

    +
    5
    +1 2 3 4 5
    +1 2 2 4 3
    +7
    +1 1
    +2 2
    +2 3
    +3 3
    +4 4
    +4 5
    +5 5
    +
    +

    样例输出

    +
    Yes
    +Yes
    +Yes
    +No
    +No
    +Yes
    +No
    +
    +

    分析

    +

    本题做法很多。这里我们介绍使用哈希(Hash)的算法。
    +现在我们有一个很简单但明显错误的思路:
    +将AABB做一个前缀和,只计算不重复的元素,即

    +

    PA(i)={A1,,Ai}PB(i)={B1,,Bi}P_A(i)=\sum\{A_1,\dots,A_i\}\\ +P_B(i)=\sum\{B_1,\dots,B_i\} +

    +

    此时,只需判断PA(xi)P_A(x_i)PB(yi)P_B(y_i)是否相等即可。时间复杂度为O(N+Q)\mathcal O(N+Q)O(Q+NlogN)\mathcal O(Q+N\log N)
    +构造hack数据也很简单,只需部分前缀和相等即可,如:

    +
    5
    +1 3 5 6 7
    +3 2 4 1 5
    +1
    +3 3
    +
    +

    这样,因为1+3+5=3+2+4=91+3+5=3+2+4=9,所以这样的程序会认为这是相等的序列,从而输出Yes,但显然{1,3,5}{3,2,4}\{1,3,5\}\ne\{3,2,4\},因此答案为No,程序错误。

    +

    现在考虑改进这个思路,使其不容易被hack,可以使用一个哈希函数:

    +

    H(x)=x(x+A)(x+B)modPH(x)=x(x+A)(x+B)\bmod P +

    +

    其中A,B,PA,B,P一般取质数,H(x)H(x)即为xx对应的哈希值。(对PP取模是为了防止哈希值太大导致溢出)
    +显然,这样有一个很小的概率会产生哈希冲突(即不同的数得到相同的哈希值),但因为A,B,PA,B,P的取值太多,评测机没法针对性的hack,所以正常情况下都能通过(CF的Hack机制除外)。如果真担心有问题,可以采取双哈希,即对于一个xx,用两个不同的哈希函数计算哈希值,这样就几乎不可能出现哈希冲突了。

    +

    现在,前缀和变为:

    +

    PA(i)={H(A1),,H(Ai)}modPPB(i)={H(B1),,H(Bi)}modPP_A(i)=\sum\{H(A_1),\dots,H(A_i)\}\bmod P\\ +P_B(i)=\sum\{H(B_1),\dots,H(B_i)\}\bmod P +

    +

    还是按原来的思路,判断前缀和是否相等即可。
    +总时间复杂度为O(n)\mathcal O(n)unordered_set/HashSet)或O(nlogn)\mathcal O(n\log n)set/TreeSet)。

    +

    代码

    +

    这里还是要提一点,就是使用哈希时有一个小技巧,即直接取P=2321P=2^{32}-1unsigned int)或者P=2641P=2^{64}-1unsigned long long),使整数自然溢出,省去了麻烦又耗时间的取模步骤。CodeForces上还是建议取较大的质数(常用的有109+7,99824435310^9+7,998244353)作为PP,以免被hack导致丢分。

    +

    这里我用的哈希函数为H(x)=x(x+93)(x+117)mod(2321)H(x)=x(x+93)(x+117)\bmod(2^{32}-1),即A=93,B=117,P=2321A=93,B=117,P=2^{32}-1

    +
    #include <cstdio>
    +#include <unordered_set>
    +#define maxn 200005
    +using namespace std;
    +
    +inline int read()
    +{
    +	char c;
    +	while((c = getchar()) < '0' || c > '9');
    +	int res = c ^ 48;
    +	while((c = getchar()) >= '0' && c <= '9')
    +		res = (res << 3) + (res << 1) + (c ^ 48);
    +	return res;
    +}
    +
    +unsigned suma[maxn], sumb[maxn];
    +inline void hread(unsigned* psum, int n)
    +{
    +	unordered_set<int> s;
    +	for(int i=1, x; i<=n; i++)
    +	{
    +		psum[i] = psum[i - 1];
    +		if(s.insert(x = read()).second)
    +			psum[i] += x * unsigned(x + 93) * unsigned(x + 117);
    +	}
    +}
    +
    +int main()
    +{
    +	int n = read();
    +	hread(suma, n);
    +	hread(sumb, n);
    +	for(int q=read(); q--;)
    +		puts(suma[read()] == sumb[read()]? "Yes": "No");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc252/index.html b/post/abc252/index.html new file mode 100644 index 00000000..2040239a --- /dev/null +++ b/post/abc252/index.html @@ -0,0 +1,920 @@ + + + + + +AtCoder Beginner Contest 252 A~G 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 252 A~G 题解 +

    + +
    +
    + 2022-05-22 · 18 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +
    +

    前言

    +
      +
    • 这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持!
    • +
    +
    +

    A - ASCII code

    +

    题目大意

    +

    给定正整数NN,输出ASCII码是NN的字母。
    +97N12297\le N\le 122

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出ASCII码是NN的字母。

    +

    分析

    +

    注意a对应9797b对应9898,……,z对应122122
    +安上小白专属转换教程:

    +
      +
    • C
      int n = 97;
      +putchar(n); /* 输出:a */
      +
      +putchar函数自动转换为字符,也可以使用printf("%c", n)效果相同
    • +
    • C++
      int n = 97;
      +cout << char(n) << endl; // 输出:a
      +
      +直接cout << n会输出97,需要用char转换为字符
    • +
    • Python
      n = 97
      +print(chr(n)) # 输出:a
      +
      +同样也不能直接输出,需要用chr转换
    • +
    • Java
      int n = 97;
      +char c = (char) n;
      +System.out.print(c);
      +
      +与C++、Python类似,需要转换
    • +
    • JavaScript
      var n = 97;
      +var c = String.fromCharCode(n);
      +console.log(c); // 输出:a
      +
      +同样使用接口转化,需调用String.fromCharCode
    • +
    +

    再不懂你试试……

    +

    代码

    +

    太水,直接走一发py(现场25秒AC)

    +
    print(chr(int(input())))
    +
    +
    +

    B - Takahashi's Failure

    +

    题目大意

    +

    Takahashi的房子里有NN个食物。第ii个食物的美味度是AiA_i
    +其中,他不喜欢KK个食物:B1,B2,,BKB_1,B_2,\dots,B_K
    +已知Takahashi会从NN个食物中随机选取一个美味度最大的食物,并把它吃掉。
    +Takahashi是否有可能迟到不喜欢的食物?

    +

    1KN1001\le K\le N\le 100
    +1Ai1001\le A_i\le 100
    +1BiN1\le B_i\le N

    +

    输入格式

    +

    N KN~K
    +A1  ANA_1~\dots~A_N
    +B1  BKB_1~\dots~B_K

    +

    输出格式

    +

    如果有可能,输出Yes;否则,输出No

    +

    分析

    +

    只要有不喜欢的食物美味度最高就有可能,否则不可能。详见代码。

    +

    代码

    +

    还是水,注意如果是0-indexed\text{0-indexed}的话BiB_i要减11

    +
    #include <cstdio>
    +using namespace std;
    +
    +int a[105];
    +
    +int main()
    +{
    +	int n, k, mx = 0;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<n; i++)
    +	{
    +		scanf("%d", a + i);
    +		if(a[i] > mx) mx = a[i];
    +	}
    +	while(k--)
    +	{
    +		scanf("%d", &n);
    +		if(a[--n] == mx)
    +		{
    +			puts("Yes");
    +			return 0;
    +		}
    +	}
    +	puts("No");
    +	return 0;
    +}
    +
    +
    +

    C - Slot Strategy

    +

    题目大意

    +

    略,请自行前往AtCoder查看。

    +

    2N1002\le N\le 100

    +

    输入格式

    +

    NN
    +S1S_1
    +\vdots
    +SNS_N

    +

    输出格式

    +

    输出答案。

    +

    分析

    +

    cnt[i][j]=(Sk[j]=i\text{cnt}[i][j]=(S_k[j]=i的个数)),对最终变成00-99分别计算代价即可。详见代码。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int cnt[10][10]; // cnt[i][j] = number of (s[j]=i)
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		char s[15];
    +		scanf("%s", s);
    +		for(int j=0; j<10; j++)
    +			cnt[s[j] ^ 48][j] ++;
    +	}
    +	int ans = 1000;
    +	for(int i=0; i<10; i++)
    +	{
    +		int cur = 0;
    +		for(int j=0; j<10; j++)
    +		{
    +			int c = j + (cnt[i][j] - 1) * 10;
    +			if(c > cur) cur = c;
    +		}
    +		if(cur < ans) ans = cur;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Distinct Trio

    +

    题目大意

    +

    给定长为NN的整数序列A=(A1,,AN)A=(A_1,\dots,A_N)
    +求符合以下条件的整数对(i,j,k)(i,j,k)的个数:

    +
      +
    • 1i<j<kN1\le i<j<k\le N
    • +
    • AiAjAkA_i\ne A_j\ne A_k
    • +
    +

    3N2×1053\le N\le 2\times 10^5
    +1Ai2×1051\le A_i\le 2\times 10^5

    +

    输入格式

    +

    NN
    +A1  ANA_1~\dots~A_N

    +

    输出格式

    +

    输出一行,即符合条件的整数对(i,j,k)(i,j,k)的个数。

    +

    分析

    +

    本题主要有两种思路:

    +
      +
    1. 逆向思维,用总数-不符合条件的;
    2. +
    3. 将题目转化为求Ai<Aj<AkA_i<A_j<A_k(i,j,k)(i,j,k)的个数。
    4. +
    +

    这里介绍第一种方法(第二种方法较为简单,不详细说明)。

    +

    首先易得,总共的1i<j<kN1\le i<j<k\le NCn3C_n^3种取法。
    +然后考虑Ai,Aj,AkA_i,A_j,A_k中有重复的个数:

    +
      +
    • 对于AA中每个数xx,我们记录cntx=A\text{cnt}_x=Axx出现的次数;
    • +
    • 然后,如果cntx2\text{cnt}_x\ge 2,则将答案减去Ccntx2×(Ncntx)C_{\text{cnt}_x}^2\times(N-\text{cnt}_x),即x,x,yx,x,y格式出现的次数;
    • +
    • 又如果cntx3\text{cnt}_x\ge 3,将答案减去Ccntx3C_{\text{cnt}_x}^3,即x,x,xx,x,x的次数。
    • +
    +

    总时间复杂度为O(N+maxAminA)\mathcal O(N+\max_A-\min_A),空间复杂度为O(maxAminA)\mathcal O(\max_A-\min_A)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +using LL = long long;
    +int cnt[maxn];
    +
    +inline LL C2(int n) { return n * (n - 1LL) >> 1LL; }
    +inline LL C3(int n) { return C2(n) * (n - 2LL) / 3LL; }
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		cnt[a] ++;
    +	}
    +	LL ans = C3(n);
    +	for(int i=1; i<maxn; i++)
    +		if(cnt[i] > 1)
    +		{
    +			ans -= C2(cnt[i]) * (n - cnt[i]);
    +			if(cnt[i] > 2) ans -= C3(cnt[i]);
    +		}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Road Reduction

    +

    题目大意

    +

    给定一张由NN个点和MM条边组成的简单无向图。
    +第ii条边长度为CiC_i,同时连接点AiA_iBiB_i
    +求任意一颗生成树,使得从点11到其他所有点的距离之和最小。

    +

    2N2×1052\le N\le 2\times 10^5
    +N1M2×105N-1\le M\le 2\times 10^5
    +1Ai<BiN1\le A_i<B_i\le N
    +(Ai,Bi)(Aj,Bj)(A_i,B_i)\ne(A_j,B_j)iji\ne j
    +1Ci1091\le C_i\le 10^9

    +

    输入格式

    +

    N MN~M
    +A1 B1 C1A_1~B_1~C_1
    +\vdots
    +AM BM CMA_M~B_M~C_M

    +

    输出格式

    +

    按任意顺序输出留下来的N1N-1条边的下标,用空格隔开。

    +

    分析

    +

    显然,在生成树中,点11到任意点的距离肯定不少于在原图中到这个点的距离。
    +因此,如果两个距离相等,显然就是最优解。
    +此时可以证明,肯定有这样的解。使用Dijkstra算法求最短路径的同时,记录到每个点之前的最后一条路即可。

    +

    代码

    +

    Dijkstra的两种经典实现方式,O(NlogN+MlogN)\mathcal O(N\log N+M\log N)

    +
      +
    • priority_queue优先队列(182ms182\text{ms}
      #include <cstdio>
      +#include <queue>
      +#define maxn 200005
      +#define INF 9223372036854775807LL
      +using namespace std;
      +
      +using LL = long long;
      +using pli = pair<LL, int>;
      +
      +struct Edge
      +{
      +	int v, id; LL d;
      +	inline Edge(int u, int l, int i): v(u), d(l), id(i) {}
      +};
      +
      +vector<Edge> G[maxn];
      +LL dis[maxn];
      +int ans[maxn];
      +
      +int main()
      +{
      +	int n, m;
      +	scanf("%d%d", &n, &m);
      +	for(int i=1; i<=m; i++)
      +	{
      +		int a, b, c;
      +		scanf("%d%d%d", &a, &b, &c);
      +		G[--a].emplace_back(--b, c, i);
      +		G[b].emplace_back(a, c, i);
      +	}
      +	priority_queue<pli, vector<pli>, greater<pli>> q;
      +	for(int i=1; i<n; i++) dis[i] = INF;
      +	q.emplace(0LL, 0);
      +	while(!q.empty())
      +	{
      +		auto [d, v] = q.top(); q.pop();
      +		if(dis[v] == d)
      +			for(const Edge& e: G[v])
      +			{
      +				LL nd = d + e.d;
      +				if(nd < dis[e.v])
      +					q.emplace(dis[e.v] = nd, e.v),
      +					ans[e.v] = e.id;
      +			}
      +	}
      +	for(int i=1; i<n; i++) printf("%d ", ans[i]);
      +	return 0;
      +}
      +
      +
    • +
    • set集合(202ms202\text{ms}
      #include <cstdio>
      +#include <vector>
      +#include <set>
      +#define maxn 200005
      +#define INF 9223372036854775807LL
      +using namespace std;
      +
      +using LL = long long;
      +using pli = pair<LL, int>;
      +
      +struct Edge
      +{
      +	int v, id; LL d;
      +	inline Edge(int u, int l, int i): v(u), d(l), id(i) {}
      +};
      +
      +vector<Edge> G[maxn];
      +LL dis[maxn];
      +int ans[maxn];
      +
      +int main()
      +{
      +	int n, m;
      +	scanf("%d%d", &n, &m);
      +	for(int i=1; i<=m; i++)
      +	{
      +		int a, b, c;
      +		scanf("%d%d%d", &a, &b, &c);
      +		G[--a].emplace_back(--b, c, i);
      +		G[b].emplace_back(a, c, i);
      +	}
      +	set<pli> s; // <distance, vertex>
      +	for(int i=1; i<n; i++) dis[i] = INF;
      +	s.emplace(0LL, 0);
      +	while(!s.empty())
      +	{
      +		auto [d, v] = *s.begin(); s.erase(s.begin());
      +		for(const Edge& e: G[v])
      +		{
      +			LL nd = d + e.d;
      +			if(nd < dis[e.v])
      +			{
      +				if(dis[e.v] < INF)
      +					s.erase(pli(dis[e.v], e.v));
      +				s.emplace(dis[e.v] = nd, e.v);
      +				ans[e.v] = e.id;
      +			}
      +		}
      +	}
      +	for(int i=1; i<n; i++) printf("%d ", ans[i]);
      +	return 0;
      +}
      +
      +
    • +
    +

    注意使用long long

    +
    +

    F - Bread

    +

    题目大意

    +
    +

    本题翻译已经过简化,部分表示与原题不同,仅供参考,请以原题为准

    +
    +

    有一个的整数序列SS,初始只有一个元素LL,我们可以执行如下操作无限次:

    +
      +
    • SS中删去任意元素kkk>1k>1),同时选取整数xx1xk11\le x\le k-1),将xxkxk-x放入SS此操作的代价为kk
    • +
    +

    求最小的代价,使得AASS中,AA中每个元素的出现次数 S~\le S中对应元素的出现次数

    +

    2N2×1052\le N\le 2\times 10^5
    +1N1091\le N\le 10^9
    +A1+A2++ANL1015A_1+A_2+\dots+A_N\le L\le 10^{15}

    +

    输入格式

    +

    N LN~L
    +A1  ANA_1~\dots~A_N

    +

    输出格式

    +

    输出最小的代价。

    +

    分析

    +

    本题考虑逆向思维,仔细思考后发现题目可以如下转化:

    +
      +
    • S=(A1,,AN,LA)S=(A_1,\dots,A_N,L-\sum A)L=AL=\sum A时不千万不要加上最后一个元素)
    • +
    • 每次操作将AA中任意两个元素合并,它们的和即为合并后新的元素,也是本次操作的代价
    • +
    • 最后发现全部合并完后SS中正好剩下一个LL,此时操作结束,所有代价和即为方案的最终代价。
    • +
    +

    此时,显然每次合并最小的两个数即为最优方案,因此可以使用优先队列实现,总时间复杂度为O(NlogN)\mathcal O(N\log N)

    +

    代码

    +

    注意使用long long

    +
    #include <cstdio>
    +#include <queue>
    +using namespace std;
    +
    +using LL = long long;
    +
    +int main()
    +{
    +	int n;
    +	LL l;
    +	scanf("%d%lld", &n, &l);
    +	priority_queue<LL, vector<LL>, greater<LL>> q;
    +	for(int i=0; i<n; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		q.push(x);
    +		l -= x;
    +	}
    +	if(l > 0) q.push(l);
    +	LL ans = 0LL;
    +	while(q.size() > 1)
    +	{
    +		LL x = q.top(); q.pop();
    +		x += q.top(); q.pop();
    +		ans += x;
    +		q.push(x);
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    G - Pre-Order

    +

    题目大意

    +

    有一颗由NN个节点1,2,,N1,2,\dots,N组成的树,它的根节点为11
    +它的先序遍历序列是(P1,P2,,PN)(P_1,P_2,\dots,P_N)
    +每次搜索时,我们都会优先前往编号小的节点
    +有多少种不同的树,使其符合上述条件?对998244353998244353取模。

    +

    2N5002\le N\le 500
    +1PiN1\le P_i\le N
    +P1=1P_1=1
    +P1P2PNP_1\ne P_2\ne\dots\ne P_N

    +

    输入格式

    +

    NN
    +P1  PNP_1~\dots~P_N

    +

    输出格式

    +

    输出答案,对998244353998244353取模。

    +

    分析

    +

    我们先将PP变为0-indexed\text{0-indexed},即原来的(P1,P2,,PN)(P_1,P_2,\dots,P_N)分别对应(A0,A1,,AN1)(A_0,A_1,\dots,A_{N-1})
    +此时,不妨考虑区间dp\text{dp}的思想,设dp(l,r)= (\mathrm{dp}(l,r)=~(一棵树已经去掉根节点的先序遍历为Al,Al+1,,Ar1A_l,A_{l+1},\dots,A_{r-1}的可能数)),则dp(1,N)\mathrm{dp}(1,N)即为所求。

    +

    下面考虑dp(l,r)\mathrm{dp}(l,r)的动态转移方程。

    +
      +
    • 先考虑AlA_lAl+1,,Ar1A_{l+1},\dots,A_{r-1}的祖宗的情况,如图:
      +情况一示意图
    • +
    +

    易得,此时dp(l,r)\mathrm{dp}(l,r)初始化为dp(l+1,r)\mathrm{dp}(l+1,r)

    +
      +
    • 再考虑区分左右子树,对于每个kkl<k<rl<k<r),将Al,,Ak1A_l,\dots,A_{k-1}当作左子树(可能数为dp(l+1,k)\mathrm{dp}(l+1,k)),再将Ak,,Ar1A_k,\dots,A_{r-1}当作右子树(可能数为dp(k,r)\mathrm{dp}(k,r)),此时如果Al<AkA_l<A_k则符合题意,将dp(l,r)\mathrm{dp}(l,r)加上dp(l+1,k)×dp(k,r)\mathrm{dp}(l+1,k)\times \mathrm{dp}(k,r)即可。
    • +
    +

    至此,本题已结束,时间复杂度为O(N3)\mathcal O(N^3)

    +

    代码

    +

    注意事项:

    +
      +
    1. 乘法操作需要转为long long再取模。
    2. +
    3. 答案为dp(1,N)\mathrm{dp}(1,N),不是dp(0,N)\mathrm{dp}(0,N)
    4. +
    5. 注意区间dp\text{dp}计算顺序,参考代码提供两种写法(先枚举ll和先枚举长度)。
    6. +
    +
      +
    • 写法一(先枚举ll59ms59\text{ms}
      #include <cstdio>
      +#define MOD 998244353
      +#define maxn 505
      +using namespace std;
      +
      +using LL = long long;
      +int p[maxn], dp[maxn][maxn];
      +
      +int main()
      +{
      +	int n;
      +	scanf("%d", &n);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", p + i);
      +	for(int l=n; l>0; l--)
      +	{
      +		dp[l][l] = 1;
      +		for(int r=l+1; r<=n; r++)
      +		{
      +			dp[l][r] = dp[l + 1][r];
      +			for(int k=l+1; k<r; k++)
      +				if(p[l] < p[k] && (dp[l][r] += LL(dp[l + 1][k]) * dp[k][r] % MOD) >= MOD)
      +					dp[l][r] -= MOD;
      +		}
      +	}
      +	printf("%d\n", dp[1][n]);
      +	return 0;
      +}
      +
      +
    • +
    • 写法二(先枚举长度,66ms66\text{ms}
      #include <cstdio>
      +#define MOD 998244353
      +#define maxn 505
      +using namespace std;
      +
      +using LL = long long;
      +int p[maxn], dp[maxn][maxn];
      +
      +int main()
      +{
      +	int n;
      +	scanf("%d", &n);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", p + i);
      +	for(int i=1; i<=n; i++)
      +		dp[i][i] = 1;
      +	for(int d=1; d<=n; d++)
      +		for(int l=1, r=d+1; r<=n; l++, r++)
      +		{
      +			dp[l][r] = dp[l + 1][r];
      +			for(int k=l+1; k<r; k++)
      +				if(p[l] < p[k] && (dp[l][r] += LL(dp[l + 1][k]) * dp[k][r] % MOD) >= MOD)
      +					dp[l][r] -= MOD;
      +		}
      +	printf("%d\n", dp[1][n]);
      +	return 0;
      +}
      +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc253/index.html b/post/abc253/index.html new file mode 100644 index 00000000..e455d3db --- /dev/null +++ b/post/abc253/index.html @@ -0,0 +1,713 @@ + + + + + +AtCoder Beginner Contest 253 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 253 A~E 题解 +

    + +
    +
    + 2022-05-29 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Median?

    +

    题目大意

    +

    给定正整数a,b,ca,b,c,判断bb是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。
    +1a,b,c1001\le a,b,c\le 100

    +

    输入格式

    +

    a b ca~b~c

    +

    输出格式

    +

    如果bb是三个数中的中位数,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    aabbcc输出
    553322Yes
    225533No
    100100100100100100No
    +

    分析

    +

    本来就是A题,其实没什么难的,比赛的时候就是看成平均数WA了..(上面应该讲的够清楚了)

    +

    当然可以直接将三个数排序(简单粗暴),也可以判断abca\le b\le ccbac\le b\le a中是否有至少一个成立。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	puts((a <= b && b <= c) || (c <= b && b <= a)? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Distance Between Tokens

    +

    题目大意

    +

    H×WH\times W的网格上,有恰好两个位置上各有一颗棋子,别的都是空位。
    +你可以从任意一个棋子开始,通过上下左右移动,前往另一个棋子的位置。
    +求至少要移动多少次?

    +

    输入格式

    +

    先是一行H,WH,W,用空格隔开,然后有HH行,每行是一个长度为WW的字符串,-表示这个位置是空位,o表示这里有一颗棋子(详见样例)。

    +

    输出格式

    +

    输出一行,即至少要移动的次数。

    +

    样例

    +

    样例输入1

    +
    2 3
    +--o
    +o--
    +
    +

    样例输出1

    +
    3
    +
    +

    样例输入2

    +
    5 4
    +-o--
    +----
    +----
    +----
    +-o--
    +
    +

    样例输出2

    +
    4
    +
    +

    分析

    +

    本题不需要BFS\text{BFS},由于没有障碍物,直接找到两颗棋子,并输出xdiff+ydiffx_\text{diff}+y_\text{diff}(即x,yx,y的坐标差之和)即可。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +using namespace std;
    +
    +int main()
    +{
    +	int h = 0, w = 0, x1 = -1, y1 = -1, x2 = -1, y2 = -1;
    +	char c;
    +	while((c = getchar()) != ' ')
    +		h = (h << 3) + (h << 1) + (c ^ 48);
    +	while((c = getchar()) != '\n')
    +		w = (w << 3) + (w << 1) + (c ^ 48);
    +	for(; h--; getchar())
    +		for(int i=w; i--; )
    +			if(getchar() == 'o')
    +				if(x1 == -1) x1 = h, y1 = i;
    +				else { x2 = h, y2 = i; break; }
    +	printf("%d\n", x1 - x2 + (y1 > y2? y1 - y2: y2 - y1));
    +	return 0;
    +}
    +
    +
    +

    C - Max - Min Query

    +

    题目大意

    +

    我们有一个序列SS,初始为空。
    +请处理如下QQ个操作:

    +
      +
    • 1 x:将xx插入至SS的末尾。
    • +
    • 2 x c:从SS中删除ccxx,如果不够删就直接删完。
    • +
    • 3:求SS中最大值与最小值的差。
    • +
    +

    1Q2×1051\le Q\le 2\times 10^5
    +0x1090\le x\le 10^9
    +1cQ1\le c\le Q

    +

    输入格式

    +

    QQ
    +query1\text{query}_1
    +query2\text{query}_2
    +\vdots
    +queryQ\text{query}_Q

    +

    输出格式

    +

    对于每个操作33,输出SS中最大值与最小值的差。

    +

    分析

    +

    典型STL练习题

    +

    本题可以用multisetmap解决,这里介绍使用map的方法(仅限C++使用)。
    +C++中,我们需要用到std::map<int, int>的如下方法:

    +
      +
    • mp[x]int& operator[](int&& key)
      +返回key对应的value的引用,如果之前没有用到过则创建并返回00
      +时间复杂度:O(logn)\mathcal O(\log n),其中nnmap中元素总数。
    • +
    • iterator begin()
      +返回最小的元素对应的指针,mp.begin()->first可以获得mp的最小元素
      +时间复杂度:O(1)\mathcal O(1)
    • +
    • iterator rbegin()
      +返回最大的元素对应的指针,mp.rbegin()->first可以获得mp的最大元素
      +时间复杂度:O(1)\mathcal O(1)
    • +
    • size_type erase(const int& key)
      +将key以及对应的valuemap中删除,返回删除的元素个数(0011),返回值一般可以忽略。
      +时间复杂度:O(logn)\mathcal O(\log n),其中nnmap中元素总数。
    • +
    +

    这时,每个查询都可转换为上述操作,详见代码。

    +

    代码

    +
    #include <cstdio>
    +#include <map>
    +using namespace std;
    +
    +int main()
    +{
    +	int q;
    +	scanf("%d", &q);
    +	map<int, int> cnt;
    +	while(q--)
    +	{
    +		int op;
    +		scanf("%d", &op);
    +		if(op == 3) printf("%d\n", cnt.rbegin()->first - cnt.begin()->first);
    +		else if(op == 1)
    +		{
    +			int x;
    +			scanf("%d", &x);
    +			cnt[x] ++;
    +		}
    +		else if(op == 2)
    +		{
    +			int x, m;
    +			scanf("%d%d", &x, &m);
    +			if(cnt[x] > m) cnt[x] -= m;
    +			else cnt.erase(x);
    +		}
    +	}
    +	return 0;
    +}
    +
    +
    +

    D - FizzBuzz Sum Hard

    +

    题目大意

    +

    输出11NN之间不是AABB的倍数的数之和。

    +

    1N,A,B1091\le N,A,B\le 10^9

    +

    输入格式

    +

    N A BN~A~B

    +

    输出格式

    +

    输出答案。

    +

    分析

    +

    根据容斥原理,11NN之间AABB的倍数的数之和为:
    +(A(A的倍数之和)+(B)+(B的倍数之和)()-(同时为A,BA,B的倍数之和))
    +又因为同时为A,BA,B的倍数的数是[A,B][A,B](最小公倍数)的倍数,所以可转化为(A(A的倍数之和)(B)-(B的倍数之和)+([A,B])+([A,B]的倍数之和))

    +

    再设f(N)=1+2++N,g(x,N)=xf(NX)=(Nf(N)=1+2+\dots+N,g(x,N)=xf(\lfloor\frac N X\rfloor)=(N以内所有xx的倍数之和))
    +则答案为

    +

    Ans=f(N)g(A)g(B)+g([A,B])\text{Ans}=f(N)-g(A)-g(B)+g([A,B]) +

    +

    总时间复杂度为求解[A,B][A,B]的复杂度,即O(logmax{A,B})\mathcal O(\log \max\{A,B\})

    +

    代码

    +

    这里使用了另一种g(x,N)g(x,N)的求法,思路类似。

    +
    #include <cstdio>
    +using namespace std;
    +
    +using LL = long long;
    +inline LL sum(const LL& x, const LL& n)
    +{
    +	LL cnt = n / x;
    +	return x * cnt * (cnt + 1LL) >> 1LL;
    +}
    +
    +int main()
    +{
    +	int n, a, b;
    +	scanf("%d%d%d", &n, &a, &b);
    +	LL x = b, y = a;
    +	while(b ^= a ^= b ^= a %= b);
    +	LL t = x / a * y; // t = lcm(a, b)
    +	printf("%lld\n", sum(1, n) - sum(x, n) - sum(y, n) + sum(t, n));
    +	return 0;
    +}
    +
    +
    +

    E - Distance Sequence

    +

    题目大意

    +

    求符合如下条件的A=(A1,,AN)A=(A_1,\dots,A_N)的个数,对998244353998244353取模:

    +
      +
    • 1AiM1\le A_i\le M1iN1\le i\le N
    • +
    • AiAi+1K|A_i-A_{i+1}|\ge K1i<N1\le i<N
    • +
    +

    2N10002\le N\le 1000
    +1M50001\le M\le 5000
    +0K<M0\le K<M

    +

    输入格式

    +

    N M KN~M~K

    +

    输出格式

    +

    输出符合条件的序列的个数,对998244353998244353取模。

    +

    分析

    +

    很明显是DP\text{DP}(动态规划)的思路,仿照01背包的方式,我们设计如下状态:

    +

    dp(i,j)=(Ai=j的可能数)\text{dp}(i,j)=(A_i=j\text{的可能数}) +

    +

    状态转移方程也很简单,即:

    +

    dp(i,j)=p=1jkdp(i1,p)+p=j+kmdp(i1,p)\text{dp}(i,j)=\sum_{p=1}^{j-k}\text{dp}(i-1,p)+\sum_{p=j+k}^m\text{dp}(i-1,p) +

    +

    那么,如果直接暴力循环计算,整个算法的时间复杂度是O(NM2)\mathcal O(NM^2),显然不能通过。

    +

    但是注意到这里有个求和的操作,显然可以用前缀/后缀和优化,用O(1)\mathcal O(1)的时间复杂度求出两个和,因此时间复杂度降到O(NM)\mathcal O(NM),可以通过。

    +

    最后一个坑,需要注意特判K=0K=0的情况,答案为MNmod998244353M^N\bmod 998244353
    +本题到此结束。

    +

    代码

    +

    特判使用快速幂,DP\text{DP}建议使用滚动表(又称数组重复利用)技巧,优化后实测:

    +
      +
    • 时间:49ms39ms49\mathrm{ms}\to39\mathrm{ms}
    • +
    • 空间:21220kb1664kb21220\mathrm{kb}\to1664\mathrm{kb}
    • +
    +
    #include <cstdio>
    +#define maxn 1002
    +#define maxm 5005
    +#define MOD 998244353
    +using namespace std;
    +
    +using LL = long long;
    +int qpow(LL a, LL b)
    +{
    +	LL ans = 1LL;
    +	while(b > 0)
    +	{
    +		if(b & 1LL) ans = ans * a % MOD;
    +		a = a * a % MOD, b >>= 1LL;
    +	}
    +	return ans;
    +}
    +
    +inline void mod(int& x) { if(x >= MOD) x -= MOD; }
    +int dp[2][maxm];
    +
    +int main()
    +{
    +	int n, m, k;
    +	scanf("%d%d%d", &n, &m, &k);
    +	if(k == 0)
    +	{
    +		printf("%d\n", qpow(m, n));
    +		return 0;
    +	}
    +	for(int i=1; i<=m; i++)
    +		dp[0][i] = 1;
    +	for(int i=1; i<n; i++)
    +	{
    +		int c = i & 1, p = c ^ 1, s = 0;
    +		for(int j=k+1; j<=m; j++)
    +			mod(s += dp[p][j]);
    +		for(int j=1; j<=m; j++)
    +		{
    +			if(j > k) mod(s += dp[p][j - k]);
    +			mod(dp[c][j] = s);
    +			if(j + k <= m)
    +			{
    +				mod(s -= dp[p][j + k]);
    +				if(s < 0) s += MOD;
    +			}
    +		}
    +	}
    +	int ans = 0, t = n & 1 ^ 1;
    +	for(int i=1; i<=m; i++)
    +		mod(ans += dp[t][i]);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc254/index.html b/post/abc254/index.html new file mode 100644 index 00000000..c5626050 --- /dev/null +++ b/post/abc254/index.html @@ -0,0 +1,933 @@ + + + + + +AtCoder Beginner Contest 254 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 254 A~E 题解 +

    + +
    +
    + 2022-06-04 · 13 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Last Two Digits

    +

    题目大意

    +

    给定正整数NN,求NN的后两位。
    +100N999100\le N\le 999

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出NN的后两位,注意输出可能有前导0

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    25425454
    10110101
    +

    分析

    +

    题目已经规定NN是三位数,因此无需使用整数输入,直接将输入看成字符串,输出后两位即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	getchar();
    +	putchar(getchar());
    +	putchar(getchar());
    +	return 0;
    +}
    +
    +
    +

    B - Practical Computing

    +

    题目大意

    +

    输出NN个整数序列A0,,AN1A_0,\dots,A_{N-1}。它们按如下定义:

    +
      +
    • AiA_i的长为i+1i+1
    • +
    • AiA_i的第j+1j+1个元素记为ai,ja_{i,j}0ji<N0\le j\le i<N),即: +
        +
      • j=0j=0j=ij=i时,ai,j=1a_{i,j}=1
      • +
      • 否则,ai,j=ai1,j1+ai1,ja_{i,j}=a_{i-1,j-1}+a_{i-1,j}
      • +
      +
    • +
    +

    1N301\le N\le 30

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出NN行。第ii行上有Ai1A_{i-1}中的ii个数,用空格分隔。

    +

    样例

    +

    样例输入1

    +
    3
    +
    +

    样例输出1

    +
    1
    +1 1
    +1 2 1
    +
    +

    样例输入2

    +
    10
    +
    +

    样例输出2

    +
    1
    +1 1
    +1 2 1
    +1 3 3 1
    +1 4 6 4 1
    +1 5 10 10 5 1
    +1 6 15 20 15 6 1
    +1 7 21 35 35 21 7 1
    +1 8 28 56 70 56 28 8 1
    +1 9 36 84 126 126 84 36 9 1
    +
    +

    分析

    +

    其实不用读题,看一眼样例,是不是很眼熟?没错,就是著名的杨辉三角
    +不知道也没关系(不过应该也没人不知道),直接按题目要求(i,ji,j正序)依次计算即可。时间复杂度O(n2)\mathcal O(n^2),空间复杂度O(n)\mathcal O(n)O(n2)\mathcal O(n^2)。详见代码1,21,2

    +

    继续考虑,杨辉三角中ai,j=Cjia_{i,j}=C_j^i,所以可以用O(1)\mathcal O(1)的空间计算,时间不变,代码待会补。

    +

    代码

    +
      +
    • 代码11(普通方法+无优化+cin/cout7ms 3604KB7\text{ms}~3604\text{KB}
      +时间:O(n2)\mathcal O(n^2)
      +空间:O(n2)\mathcal O(n^2)
      +难度:
      #include <iostream>
      +using namespace std;
      +
      +int arr[35][35];
      +
      +int main()
      +{
      +   int n;
      +   cin >> n;
      +   for (int i = 0; i < n; i++)
      +   {
      +       arr[i][0] = 1;
      +       arr[i][i] = 1;
      +   }
      +   for (int i = 2; i < n; i++)
      +   {
      +       for (int j = 1; j < i; j++)
      +       {
      +           arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
      +       }
      +   }
      +   for (int i = 0; i < n; i++)
      +   {
      +       for (int j = 0; j <= i; j++)
      +       {
      +           cout << arr[i][j] << " ";
      +       }
      +       cout << endl;
      +   }
      +   return 0;
      +}
      +
      +
    • +
    • 代码22(普通方法+滚动表+scanf/printf6ms 1656KB6\text{ms}~1656\text{KB}
      +时间:O(n2)\mathcal O(n^2)
      +空间:O(n)\mathcal O(n)
      +难度:中低
      #include <cstdio>
      +using namespace std;
      +
      +int a[35];
      +
      +int main()
      +{
      +   int n;
      +   scanf("%d", &n);
      +   a[0] = 1, puts("1");
      +   for(int i=1; i<n; i++)
      +   {
      +   	putchar('1');
      +   	for(int j=i-1; j>0; j--)
      +   		a[j] += a[j - 1];
      +   	for(int j=1; j<i; j++)
      +           printf(" %d", a[j]);
      +       a[i] = 1, puts(" 1");
      +   }
      +   return 0;
      +}
      +
      +
    • +
    +
    +

    C - K Swap

    +

    题目大意

    +

    给定长度为NN的序列A=(a1,a2,,aN)A=(a_1,a_2,\dots,a_N)和整数KK,你可以重复下列操作任意次:

    +
      +
    • 选择整数1iNK1\le i\le N-K,交换aia_iai+Ka_{i+K}
    • +
    +

    问:是否能通过上述操作将AA按升序排列?

    +

    2N2×1052\le N\le 2\times 10^5
    +1KN11\le K\le N-1
    +1ai1091\le a_i\le 10^9

    +

    输入格式

    +

    N KN~K
    +a1  aNa_1~\dots~a_N

    +

    输出格式

    +

    如果可以达到目标,输出Yes;否则,输出No

    +

    样例

    +

    样例输入1

    +
    5 2
    +3 4 1 3 4
    +
    +

    样例输出1

    +
    Yes
    +
    +

    该样例中,A=(3,4,1,3,4),K=2A=(3,4,1,3,4),K=2。一种完成任务的操作如下:

    +
      +
    • 交换a1a_1a3a_3,此时A=(1,4,3,3,4)A=(1,4,3,3,4)
    • +
    • 交换a2a_2a4a_4,此时A=(1,3,3,4,4)A=(1,3,3,4,4),排序完成。
    • +
    +

    样例输入2

    +
    5 3
    +3 4 1 3 4
    +
    +

    样例输出2

    +
    No
    +
    +

    K=3K=3,无法将AA排序。

    +

    样例输入3

    +
    7 5
    +1 2 3 4 5 5 10
    +
    +

    样例输出3

    +
    Yes
    +
    +

    可以不进行操作。

    +

    分析

    +

    题目可以看成:在ai,aK+i,a2K+i,a_i,a_{K+i},a_{2K+i},\dots1i<K1\le i<K)中的元素是可以两两相邻交换的。那么,根据冒泡排序的原理,这些元素是可以直接排序并放入原位置上的。此时,只需依次对于i=1,2,,K1i=1,2,\dots,K-1的上述序列并排序、放回原位,最终检查是否已被排成升序即可。

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#include <algorithm>
    +#define maxn 200005
    +using namespace std;
    +
    +int a[maxn], b[maxn];
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<n; i++)
    +	{
    +		scanf("%d", a + i);
    +		b[i] = a[i];
    +	}
    +	sort(b, b + n);
    +	for(int i=0; i<k; i++)
    +	{
    +		multiset<int> s1, s2;
    +		for(int j=i; j<n; j+=k)
    +		{
    +			s1.insert(a[j]);
    +			s2.insert(b[j]);
    +		}
    +		if(s1 != s2)
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +	}
    +	puts("Yes");
    +	return 0;
    +}
    +
    +

    特别: 本题涉及到很多数组操作,使用Python代码量非常小(使用数组切片和sorted()),所以也是一道很好的Python数组练习题。因此,这里破例提供Python示例代码:

    +
    n, k = map(int, input().split())
    +a = list(map(int, input().split()))
    +for i in range(k):
    +	a[i::k] = sorted(a[i::k])
    +print('Yes' if a == sorted(a) else 'No')
    +
    +
    +

    D - Together Square

    +

    题目大意

    +

    给定整数NN。求正整数对(i,j)(i,j)的个数,满足:

    +
      +
    • 1i,jN1\le i,j\le N
    • +
    • i×ji\times j是一个完全平方数(即12,22,32,1^2,2^2,3^2,\dots
    • +
    +

    1N2×1051\le N\le 2\times 10^5

    +

    输入格式

    +

    NN

    +

    输出格式

    +

    输出答案。

    +

    样例

    + + + + + + + + + + + + + + + + + +
    NN输出
    4466
    254254896896
    +

    分析

    +

    注意NN较大,所以最容易想到的O(n2)\mathcal O(n^2)暴力枚举肯定是不行的,然后仔细思考后发现可以枚举整数对(x,y)(x,y)1x,yN1\le x,y\le\lfloor\sqrt N\rfloor),当x,yx,y互质时将答案加上Nmax{x2,y2}\frac N {\max\{x^2,y^2\}},这样答案正确,建议读者自行思考原因。

    +

    时间复杂度计算:

    +
      +
    • 循环(次数N\sqrt N,枚举xx) +
        +
      • 循环(次数N\sqrt N,枚举yy) +
          +
        • gcd最大公约数算法(辗转相除法logmax{x,y}logN\log\max\{x,y\}\approx\log\sqrt N,判断互质)
        • +
        +
      • +
      +
    • +
    +

    综上,总时间复杂度为O(N×N×logN)=O(NlogN)\mathcal O(\sqrt N\times\sqrt N\times\log\sqrt N)=\mathcal O(N\log\sqrt N)

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +inline int gcd(int a, int b)
    +{
    +	while(b ^= a ^= b ^= a %= b);
    +	return a;
    +}
    +
    +int main()
    +{
    +	int n = 0; char c;
    +	while((c = getchar()) != '\n')
    +		n = (n << 3) + (n << 1) + (c ^ 48);
    +	int t = __builtin_sqrt(n);
    +	long long ans = 0LL, x;
    +	for(int i=1; i<=t; i++)
    +		for(int j=i; j<=t; j++)
    +			if(gcd(i, j) == 1)
    +			{
    +				ans += (x = n / (i > j? i * i: j * j));
    +				if(i != j) ans += x;
    +			}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Small d and k

    +

    题目大意

    +

    给定一个由NN个点和MM条边组成的简单无向图。
    +对于每个i=1,2,,Mi=1,2,\dots,M,第ii条边连接顶点aia_ibib_i

    +

    已知 每个顶点的度数不超过3,回答下列QQ个查询,第ii个查询为:

    +
      +
    • 求与顶点xix_i距离不超过kik_i的点的下标之和
    • +
    +

    1N,Q1.5×1051\le N,Q\le 1.5\times 10^5
    +0Mmin{N(N1)2,32N}0\le M\le \min\{\frac{N(N-1)}2,\frac32N\}
    +1ai<biN1\le a_i<b_i\le N(ai,bi)(a_i,b_i)互不相同。
    +1xiN1\le x_i\le N0ki30\le k_i\le 3

    +

    输入格式

    +

    N MN~M
    +a1 b1a_1~b_1
    +\vdots
    +aM bMa_M~b_M
    +QQ
    +x1 k1x_1~k_1
    +\vdots
    +xQ kQx_Q~k_Q

    +

    输出格式

    +

    输出QQ行。第ii行应包含第ii个查询的答案。

    +

    样例

    +

    样例输入

    +
    6 5
    +2 3
    +3 4
    +3 5
    +5 6
    +2 6
    +7
    +1 1
    +2 2
    +2 0
    +2 3
    +4 1
    +6 0
    +4 3
    +
    +

    样例输出

    +
    1
    +20
    +2
    +20
    +7
    +6
    +20
    +
    +

    样例解释:AtCoder 254E - Small d and k #sample

    +

    分析

    +

    注意这题数据范围,这是解体的关键:

    +
      +
    • 减少算法耗时: +
        +
      • 0k30\le k\le 3
      • +
      • 顶点度数 3~\le3
      • +
      • 根据乘法原理,一次查询最大符合条件的顶点数为33+1=283^3+1=28
      • +
      +
    • +
    • 防止常数问题: +
        +
      • 1N1.5×1051\le N\le \textbf{1.5}\times 10^5
      • +
      • 时间限制3.5s3.5\text{s}
      • +
      +
    • +
    +

    因此,使用简单的暴力BFS\text{BFS}正好符合题目数据范围。详见代码。

    +

    代码

    +

    注意dis数组的清零操作,无需全部清零,只需把刚刚改过的清零即可。

    +
    #include <cstdio>
    +#include <queue>
    +#define maxn 150005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +int dis[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int a, b;
    +		scanf("%d%d", &a, &b);
    +		G[a].push_back(b);
    +		G[b].push_back(a);
    +	}
    +	int Q; scanf("%d", &Q);
    +	for(int i=1; i<=n; i++) dis[i] = -1;
    +	while(Q--)
    +	{
    +		int x, k;
    +		scanf("%d%d", &x, &k);
    +		vector<int> ans;
    +		queue<int> q;
    +		q.push(x);
    +		dis[x] = 0;
    +		while(!q.empty())
    +		{
    +			int v = q.front(); q.pop();
    +			int d = dis[v];
    +			if(d <= k) ans.push_back(v);
    +			if(++d > k) continue;
    +			for(int u: G[v])
    +				if(dis[u] == -1)
    +				{
    +					dis[u] = d;
    +					q.push(u);
    +				}
    +		}
    +		int res = 0;
    +		for(int v: ans)
    +			res += v, dis[v] = -1;
    +		printf("%d\n", res);
    +	}
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc258/index.html b/post/abc258/index.html new file mode 100644 index 00000000..a3c072b9 --- /dev/null +++ b/post/abc258/index.html @@ -0,0 +1,644 @@ + + + + + +AtCoder Beginner Contest 258 A~Ex 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 258 A~Ex 题解 +

    + +
    +
    + 2022-07-04 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    D - Trophy

    +

    题目大意

    +

    有一个游戏,由NN个关卡组成。第ii个关卡由一个数对(Ai,Bi)(A_i,B_i)组成。

    +

    要通过一个关卡,你必须先花AiA_i的时间看一次介绍。然后,用BiB_i的时间打通这个关卡。若想多次通过同一个关卡,则第一次需要看介绍,后面无需再看(即如果想打通第iiNN次,则所需时间为Ai+N×BiA_i+N\times B_i)。

    +

    开始时,只有第一关被解锁。当你每打通一关,其下一关会自动解锁(最后一关除外)。求总共打通XX关的最少时间(重复通关也算)。

    +

    1N2×1051\le N\le 2\times 10^5
    +1Ai,Bi1091\le A_i,B_i\le 10^9
    +1XN1\le X\le N

    +

    输入格式

    +

    N XN~X
    +A1 B1A_1~B_1
    +\vdots
    +AN BNA_N~B_N

    +

    输出格式

    +

    输出答案。

    +

    样例

    +

    略,请自行前往AtCoder查看。

    +

    分析

    +

    仔细想想会发现,通过的方式都是先不重复通过某一关前所有关卡,再通过这一关一定次数,最终达到正好XX次。因此,我们利用前缀和,依次枚举每个关卡,最终时间复杂度可达O(n)\mathcal O(n)

    +

    代码

    +
    #include <cstdio>
    +#define INF 0x7FFFFFFFFFFFFFFFLL
    +using namespace std;
    +
    +int main()
    +{
    +	int n, x;
    +	scanf("%d%d", &n, &x);
    +	if(x < n) n = x;
    +	long long s = 0LL, ans = INF, cur;
    +	for(int i=1; i<=n; i++)
    +	{
    +		int a, b;
    +		scanf("%d%d", &a, &b);
    +		if((cur = (s += a + b) + (long long)(x - i) * b) < ans)
    +			ans = cur;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Packing Potatoes

    +

    题目大意

    +

    1010010^{100}个土豆排成一列。它们的重量分别是W0,W1,,WN1,W0,W_0,W_1,\dots,W_{N-1},W_0,\dots,即第ii个土豆的重量是WimodNW_{i\bmod N}i=0,1,2,i=0,1,2,\dots)。

    +

    Takahashi会往一个盒子里依次放入每个土豆,当放入的土豆总重量 X~\ge X的时候他会换一个新盒子。

    +

    给定QQ个询问。第ii个询问:给定整数KiK_i,求第KiK_i个盒子中土豆的个数

    +

    1N,Q2×1051\le N,Q\le 2\times 10^5
    +1X,Wi1091\le X,W_i\le 10^9
    +1Ki10121\le K_i\le 10^{12}

    +

    输入格式

    +

    N Q XN~Q~X
    +W0  WN1W_0~\dots~W_{N-1}
    +K1K_1
    +\vdots
    +KQK_Q

    +

    输出格式

    +

    输出QQ行,第ii行是第ii个询问的答案。

    +

    样例

    +

    略,请自行前往AtCoder查看。

    +

    分析

    +

    周期问题。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +using LL = long long;
    +int cnt[maxn], ord[maxn], w[maxn << 1];
    +
    +template <typename T>
    +inline T read()
    +{
    +	char c;
    +	while((c = getchar()) < '0' || c > '9');
    +	T res = c ^ 48;
    +	while((c = getchar()) >= '0' && c <= '9')
    +		res = (res << T(3)) + (res << T(1)) + (c ^ 48);
    +	return res;
    +}
    +
    +inline void print(int x)
    +{
    +	if(x > 9) print(x / 10);
    +	putchar(x % 10 ^ 48);
    +}
    +
    +inline void println(int x)
    +{
    +	print(x);
    +	putchar('\n');
    +}
    +
    +int main()
    +{
    +	int n = read<int>(), q = read<int>(), x = read<int>();
    +	LL sum = 0LL;
    +	for(int i=0; i<n; i++)
    +		sum += w[i + n] = w[i] = read<int>();
    +	int fill = x / sum * n;
    +	for(int i=0; i<n; i++)
    +		cnt[i] = fill, ord[i] = -1;
    +	x %= sum;
    +	for(int i=0, j=0, s=0; i<n; i++)
    +	{
    +		if(j < i) j = i, s = 0;
    +		while(s < x)
    +		{
    +			s += w[j];
    +			j += 1;
    +		}
    +		cnt[i] += j - i;
    +		s -= w[i];
    +	}
    +	vector<int> path;
    +	int loop = -1;
    +	for(int u=0, k=0; ; k++)
    +	{
    +		if(ord[u] != -1)
    +		{
    +			loop = k - ord[u];
    +			break;
    +		}
    +		ord[u] = k;
    +		path.push_back(u);
    +		(u += cnt[u]) %= n;
    +	}
    +	int non_loop = path.size() - loop;
    +	while(q--)
    +	{
    +		LL k = read<LL>();
    +		println(cnt[path[--k < non_loop? k:
    +				non_loop + (k - non_loop) % loop]]);
    +	}
    +	return 0;
    +}
    +
    +
    +

    F - Main Street

    +

    WJ...

    +
    +

    G - Triangle

    +

    题目大意

    +

    给定一张由NN个点组成的简单无向图GG和它的邻接矩阵AA

    +
    +

    什么是邻接矩阵

    +
      +
    • 邻接矩阵,顾名思义,即表示图中每两点之间关系的矩阵。
    • +
    • 如本题中Ai,jA_{i,j}表示i,ji,j两点之间是否有边。Ai,j=0A_{i,j}=0表示无边,11表示有边。
    • +
    • 一般来说,对于任意简单无向图Ai,i=0A_{i,i}=0Ai,j=Aj,iA_{i,j}=A_{j,i} (iji\ne j)。
    • +
    +
    +

    求数对(i,j,k)(i,j,k)的个数,使得:

    +
      +
    • 1i<j<kN1\le i<j<k\le N
    • +
    • (i,j,k)(i,j,k)三个点在图中组成一个三角形,即i,j,ki,j,k中任意两点之间有一条连边。
    • +
    +

    3N30003\le N\le 3000

    +

    输入格式

    +

    NN
    +A1,1A1,2A1,NA_{1,1}A_{1,2}\dots A_{1,N}
    +A2,1A2,2A2,NA_{2,1}A_{2,2}\dots A_{2,N}
    +\vdots
    +AN,1AN,2AN,NA_{N,1}A_{N,2}\dots A_{N,N}(注意没有空格,如10110

    +

    输出格式

    +

    输出一个整数,即符合条件的数对(i,j,k)(i,j,k)的个数。

    +

    样例

    +

    略,请自行前往AtCoder查看。

    +

    分析

    +
    +

    前言

    +
      +
    • 个人感觉这题其实是这场比赛中最有意思的题。题目不难,但很具有研究意义。
      +这里我将从各个角度分析题目,也期待大家在评论区中分享其他方法。
    • +
    +
    +
    +

    废话不多说,题解开始!

    +
    +

    题目说得太啰嗦,其实不用管什么图论,可以看成是给定N×NN\times N0101矩阵AA,求Ai,j=Ai,k=Aj,k=1A_{i,j}=A_{i,k}=A_{j,k}=1(i,j,k)(i,j,k)的个数。

    +

    再来看数据范围。N3000N\le 3000,则O(N3)\mathcal O(N^3)的朴素算法时间可达到T(2.7×1010)T(2.7\times 10^{10}),显然无法通过。

    +
    +

    然而,事实并非如此。
    +在仔细研究后发现,时间限制为3s3\mathrm{s}的题目可以使用复杂度稍高的算法。
    +但是一般来说,极端情况下超过T(1010)T(10^{10})的算法无法通过。
    +因此,也许是数据不够强吧,使用如下的优化可以恰好通过(#32949139 37764KB,2755ms37764\mathrm{KB},2755 \mathrm{ms}):

    +
    #pragma GCC optimize("Ofast") // -Ofast 预编译优化
    +#include <cstdio>
    +#define maxn 3000 // 数组大小设置正好,减少内存占用
    +using namespace std;
    +
    +// 题目中正常的邻接矩阵
    +bool a[maxn][maxn];
    +
    +// 特殊邻接表存储,减少尝试次数
    +// 这里不使用vector,会拖慢速度
    +int G[maxn][maxn], sz[maxn];
    +
    +inline void print(const long long& x) // 快写-输出优化
    +{
    +	if(x > 9LL) print(x / 10);
    +	putchar(x % 10 ^ 48);
    +}
    +
    +int main()
    +{
    +	// getchar快读输入优化
    +	int n = 0; char c;
    +	while((c = getchar()) != '\n')
    +		n = (n << 3) + (n << 1) + (c ^ 48);
    +	for(int i=0; i<n; i++, getchar())
    +		for(int j=0; j<n; j++)
    +			if(getchar() == '1' && j > i) // j > i:只存一半,去掉重复
    +				a[i][j] = 1, G[i][sz[i]++] = j;
    +
    +	// 注意答案数据类型使用long long
    +	long long ans = 0LL;
    +	for(int v=0; v<n; ++v)
    +		for(int i=0; i<sz[v]; ++i) // 直接调取邻接表,省去不必要判断
    +		{
    +			int u = G[v][i];
    +			for(int j=0; j<sz[u]; ++j)
    +				if(a[v][G[u][j]])
    +					ans ++;
    +		}
    +	print(ans);
    +	return 0;
    +}
    +
    +

    当然,这种方法并非每道题都能用,因此还是建议大家继续看正解。

    +
    +

    正解还是基于上面的朴素算法,可看作:

    +
      +
    • 依次遍历Ai,j=1A_{i,j}=1(i,j)(i,j)i<ji<j
    • +
    • => 将答案加上A[i]A[i]A[j]A[j]对应位置上都是11的位置个数
    • +
    • 输出答案,除以3(去掉每个重复算的三次)
    • +
    +

    那么别的地方都没办法,只有第二步可以使用bitset并集(&)操作进行优化。此时时间复杂度为O(n3w)\mathcal O(\frac{n^3}w),其中w=64w=64。详见代码。

    +

    代码

    +
    #include <cstdio>
    +#include <bitset>
    +#define maxn 3000
    +using namespace std;
    +
    +bitset<maxn> a[maxn];
    +
    +int main()
    +{
    +	int n = 0; char c;
    +	while((c = getchar()) != '\n')
    +		n = (n << 3) + (n << 1) + (c ^ 48);
    +	for(int i=0; i<n; i++, getchar())
    +		for(int j=0; j<n; j++)
    +			if(getchar() == '1')
    +				a[i].set(j); // a[i][j] = 1
    +	long long ans = 0LL;
    +	for(int i=0; i+1<n; i++)
    +		for(int j=i+1; j<n; j++)
    +			if(a[i][j])
    +				ans += (a[i] & a[j]).count(); // 取交集,数1的个数
    +	printf("%lld\n", ans / 3LL);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc260/index.html b/post/abc260/index.html new file mode 100644 index 00000000..7197e601 --- /dev/null +++ b/post/abc260/index.html @@ -0,0 +1,950 @@ + + + + + +AtCoder Beginner Contest 260 A~F 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 260 A~F 题解 +

    + +
    +
    + 2022-07-19 · 20 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - A Unique Letter

    +

    题目大意

    +

    给定一个长度为33的字符串SS
    +输出SS中出现正好一次的字母(任意,如abc中,三个字母都可为答案)。

    +

    如果没有,输出-1

    +

    数据保证SS的长为33,且由小写英文字母组成。

    +

    输入格式

    +

    SS

    +

    输出格式

    +

    输出任意符合条件的答案。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + +
    SS输出
    popo
    abca/b/c
    xxx-1
    +

    分析

    +

    我们设输入的3个字母分别为abc
    +首先,如果a=b=ca=b=c,那么输出1-1
    +其次,我们依次尝试找到两个相同的字母:

    +
      +
    • xxy形式(a=ba=b):输出cc
    • +
    • xyx形式(a=ca=c):输出bb
    • +
    • yxx形式(b=cb=c):输出aa
    • +
    • xyz形式(abca\ne b\ne c):输出任意一个
    • +
    +

    代码

    +

    这里,我把最后两种情况合并了(一个else搞定,都输出aa):

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	char a = getchar(), b = getchar(), c = getchar();
    +	if(a == b && b == c) puts("-1");
    +	else if(a == c) putchar(b);
    +	else if(a == b) putchar(c);
    +	else putchar(a);
    +	return 0;
    +}
    +
    +
    +

    B - Better Students Are Needed!

    +

    题目大意

    +

    NN个员工参加了一场选聘考试。
    +第ii个员工数学考了AiA_i分,英语BiB_i分。

    +

    公司按如下的方式选聘员工:

    +
      +
    1. 数学分数在前XX的被直接录取;
    2. +
    3. 剩下的人中,英语分数在前YY的被录取;
    4. +
    5. 最后,总分在前ZZ的被录取,剩下的人被淘汰。
    6. +
    +

    注意:分数相同的员工按编号排序。

    +

    输出被录取的所有员工的编号,按升序排列。

    +

    1N10001\le N\le 1000
    +0X,Y,ZN0\le X,Y,Z\le N
    +1X+Y+ZN1\le X+Y+Z\le N
    +0Ai,Bi1000\le A_i,B_i\le 100

    +

    输入格式

    +

    N X Y ZN~X~Y~Z
    +A1 A2  ANA_1~A_2~\dots~A_N
    +B1 B2  BNB_1~B_2~\dots~B_N

    +

    输出格式

    +

    输出被录取的所有员工的编号,按升序排列,每行一个。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    本题主要有两种思路:

    +
      +
    1. pair<int, int>代表一个员工,再使用vector+sortpriority_queue执行三次分别排序数学、英语、总分;
    2. +
    3. struct { int math, english, id; }表示员工,存储一次,排序三次(使用不同的排序依据)
    4. +
    +

    详见代码1、代码2。

    +

    代码

    +

    代码1

    +
      +
    • vector+sort实现
      #include <cstdio>
      +#include <vector>
      +#include <algorithm>
      +#define maxn 1005
      +using namespace std;
      +
      +int a[maxn], b[maxn];
      +bool used[maxn];
      +
      +int main()
      +{
      +	int n, x, y, z;
      +	scanf("%d%d%d%d", &n, &x, &y, &z);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", a + i);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", b + i);
      +	
      +	// Math
      +	vector<pair<int, int>> sel_a;
      +	for(int i=0; i<n; i++)
      +		sel_a.emplace_back(-a[i], i);
      +	sort(sel_a.begin(), sel_a.end());
      +	for(int i=0; i<x; i++)
      +		used[sel_a[i].second] = true;
      +	
      +	// English
      +	vector<pair<int, int>> sel_b;
      +	for(int i=0; i<n; i++)
      +		if(!used[i])
      +			sel_b.emplace_back(-b[i], i);
      +	sort(sel_b.begin(), sel_b.end());
      +	for(int i=0; i<y; i++)
      +		used[sel_b[i].second] = true;
      +	
      +	// Total
      +	vector<pair<int, int>> sel_t;
      +	for(int i=0; i<n; i++)
      +		if(!used[i])
      +			sel_t.emplace_back(-(a[i] + b[i]), i);
      +	sort(sel_t.begin(), sel_t.end());
      +	for(int i=0; i<z; i++)
      +		used[sel_t[i].second] = true;
      +	
      +	for(int i=0; i<n; i++)
      +		if(used[i])
      +			printf("%d\n", i + 1);
      +	return 0;
      +}
      +
      +
    • +
    • priority_queue实现
      #include <cstdio>
      +#include <queue>
      +#define maxn 1005
      +using namespace std;
      +
      +int a[maxn], b[maxn], c[maxn];
      +bool used[maxn];
      +
      +inline void selectOnce(int* scores, int n, int snum)
      +{
      +	priority_queue<pair<int, int>> sel;
      +	for(int i=0; i<n; i++)
      +		if(!used[i])
      +		{
      +			sel.emplace(-scores[i], i);
      +			if(sel.size() > snum) sel.pop();
      +		}
      +	while(!sel.empty())
      +		used[sel.top().second] = true, sel.pop();
      +}
      +
      +int main()
      +{
      +	int n, x, y, z;
      +	scanf("%d%d%d%d", &n, &x, &y, &z);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", a + i);
      +	for(int i=0; i<n; i++)
      +		scanf("%d", b + i);
      +	for(int i=0; i<n; i++)
      +		c[i] = a[i] + b[i];
      +	selectOnce(a, n, x);
      +	selectOnce(b, n, y);
      +	selectOnce(c, n, z);
      +	for(int i=0; i<n; i++)
      +		if(used[i])
      +			printf("%d\n", i + 1);
      +	return 0;
      +}
      +
      +
    • +
    +

    代码2

    +
    #include <cstdio>
    +#include <vector>
    +#include <algorithm>
    +#define maxn 1005
    +using namespace std;
    +
    +struct Emp { // Employee
    +	int math, eng, id;
    +} emps[maxn];
    +
    +inline bool cmp1(const Emp& e1, const Emp& e2) {
    +	return e1.math == e2.math?
    +			e1.id < e2.id:
    +			e1.math > e2.math;
    +}
    +
    +inline bool cmp2(const Emp& e1, const Emp& e2) {
    +	return e1.eng == e2.eng?
    +			e1.id < e2.id:
    +			e1.eng > e2.eng;
    +}
    +
    +inline bool cmp3(const Emp& e1, const Emp& e2) {
    +	int tot1 = e1.math + e1.eng, tot2 = e2.eng + e2.math;
    +	return tot1 == tot2?
    +			e1.id < e2.id:
    +			tot1 > tot2;
    +}
    +
    +inline bool cmp4(const Emp& e1, const Emp& e2) {
    +	return e1.id < e2.id;
    +}
    +
    +int main()
    +{
    +	// Input
    +	int n, x, y, z;
    +	scanf("%d%d%d%d", &n, &x, &y, &z);
    +	
    +	for(int i=0; i<n; i++)
    +		scanf("%d", &emps[i].math),
    +		emps[i].id = i;
    +	for(int i=0; i<n; i++)
    +		scanf("%d", &emps[i].eng);
    +	
    +	// Sort
    +	auto last = emps + n;
    +	sort(emps, last, cmp1);
    +	sort(emps + x, last, cmp2);
    +	sort(emps + x + y, last, cmp3);
    +	sort(emps, emps + x + y + z, cmp4); // 按编号升序排序
    +	
    +	// Output
    +	for(int i=0; i<x+y+z; i++)
    +		printf("%d\n", emps[i].id + 1);
    +	return 0;
    +}
    +
    +
    +

    C - Changing Jewels

    +

    题目大意

    +

    Takahashi有一个NN级的红色宝石。
    +他可以重复下列操作任意次数:

    +
      +
    • 将一个NN级的红色宝石转换为“一个(N1)(N-1)级的红色宝石和XXNN级的蓝色宝石”。
    • +
    • 将一个NN级的蓝色宝石转换为“一个(N1)(N-1)级的红色宝石和YYN1N-1级的蓝色宝石”。
    • +
    +

    Takahashi最后最多能得到几个11级的蓝色宝石?

    +

    1N101\le N\le 10
    +1X,Y51\le X,Y\le 5

    +

    输入格式

    +

    N X YN~X~Y

    +

    输出格式

    +

    输出一个整数,即最终蓝色宝石的数量。

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + +
    NNXXYY输出
    2233441212
    1010555539423499003942349900
    +

    注意小心3232位整数(int/int32)溢出。

    +

    分析

    +

    要获得(N1)(N-1)级的蓝宝石,必须先尽可能多的获得NN级的蓝宝石。
    +而要达到这个目的,就需要有尽可能多的NN级红宝石。

    +

    以此类推,我们可以按顺序进行操作11,操作22……直到所有宝石全部为11级(也就是循环(N1)(N-1)次)。维护两个变量red\text{red}(初始为11)和blue\text{blue}(初始为00),分别表示当前的红、蓝宝石的数目。
    +每次循环,先将blue\text{blue}加上red×X\text{red}\times X(操作11),再将red\text{red}加上blue\text{blue}blue\text{blue}乘上YY(操作22)。

    +

    时间复杂度O(n)\mathcal O(n),如有读不懂的地方,可参考代码。

    +

    代码

    +

    注意使用long long

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, x, y;
    +	scanf("%d%d%d", &n, &x, &y);
    +	long long red = 1LL, blue = 0LL;
    +	while(--n)
    +	{
    +		blue += red * x;
    +		red += blue, blue *= y;
    +	}
    +	printf("%lld\n", blue);
    +	return 0;
    +}
    +
    +
    +

    D - Draw Your Cards

    +

    题目大意

    +

    NN张牌,上面分别写着数字P1,P2,,PNP_1,P_2,\dots,P_N
    +按照这个顺序,我们进行NN个操作,第ii个操作的具体步骤如下:

    +
      +
    • 取出第ii张牌,令X=PiX=P_i
    • +
    • 找到存堆中顶牌 X~\ge X的最小一张,将这张牌置于其上;
    • +
    • 如果没有符合条件的牌,将XX放入一新堆;
    • +
    • 当某堆牌数达到KK时,把这堆的牌全部吃掉。
    • +
    +

    求每张牌被吃掉的时间(若没有被吃掉,输出-1,详见输出格式)。

    +

    1KN2×1051\le K\le N \le 2\times 10^5
    +PP(1,2,,N)(1,2,\dots,N)的一种排列。

    +

    输入格式

    +

    N KN~K
    +P1 P2  PNP_1~P_2~\dots~P_N

    +

    输出格式

    +

    输出NN行,第ii行表示卡片ii被吃掉的时间(如果没被吃掉,输出-1)。

    +

    样例

    +

    略,就是懒

    +

    分析

    +

    首先肯定不能用vector<stack<int>>这种数据结构,效率太低,容易写错,还不好用。可以用一个类似于并查集的数据结构,每次叠放操作都可看作“把下面的牌的父亲设置为上面的牌”。我们还需要记录并查集中每个连通分量的大小,方便模拟“吃掉”操作。

    +

    最终对于每个节点,输出其祖宗被吃掉的时间(咋听起来有点怪)。

    +

    目前的时间复杂度是O(N2)\mathcal O(N^2),因为每次操作都需要用O(n)\mathcal O(n)的时间,找到最小的符合条件的牌堆。
    +很容易想到,可以使用set优化。

    +

    set是自动排序的集合,常用的的操作有插入(insert)、删除(erase)、二分查找(lower_bound/upper_bound),一次操作的时间复杂度均为O(logn)\mathcal O(\log n)

    +

    这时,使用一个set<int>维护每个堆顶的卡牌编号,就可以把时间复杂度降到O(nlogn)\mathcal O(n\log n)以内。

    +

    至此,此题完。注意对K=1K=1的特判。

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#define maxn 200005
    +using namespace std;
    +
    +int fa[maxn], eat[maxn], sz[maxn];
    +
    +int find(int x) {
    +	return fa[x] == x? x: fa[x] = find(fa[x]);
    +}
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	set<int> cards;
    +	for(int i=0; i<n; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		x --;
    +		eat[x] = -1, fa[x] = x;
    +		if(k == 1)
    +		{
    +			eat[x] = i + 1;
    +			continue;
    +		}
    +		auto it = cards.upper_bound(x);
    +		if(it == cards.end())
    +			cards.insert(x), sz[x] = 1;
    +		else
    +		{
    +			fa[*it] = x;
    +			cards.erase(it);
    +			if((sz[x] = sz[*it] + 1) == k)
    +				eat[x] = i + 1;
    +			else cards.insert(x);
    +		}
    +	}
    +	for(int i=0; i<n; i++)
    +		printf("%d\n", eat[find(i)]);
    +	return 0;
    +}
    +
    +
    +

    E - At Least One

    +

    题目大意

    +

    给定整数MMNN对整数:(A1,B1),(A2,B2),,(AN,BN)(A_1,B_1),(A_2,B_2),\dots,(A_N,B_N)
    +题目保证对于任意ii1Ai<BiM1\le A_i<B_i\le M

    +

    符合如下条件的整数序列SS被称作好的序列

    +
      +
    • SS(1,2,,M)(1,2,\dots,M)的连续子序列;
    • +
    • 对于每个iiSS中包含AiA_iBiB_i(或同时包含)。
    • +
    +

    f(k)=(f(k)=(长为kk的好序列的个数))。求f(1),f(2),,f(M)f(1),f(2),\dots,f(M)

    +

    1N2×1051\le N\le 2\times 10^5
    +2M2×1052\le M\le 2\times 10^5
    +1Ai<BiM1\le A_i<B_i\le M

    +

    输入格式

    +

    N MN~M
    +A1 B1A_1~B_1
    +A2 B2A_2~B_2
    +\vdots
    +AN BNA_N~B_N

    +

    输出格式

    +

    输出一行,即f(1),f(2),,f(M)f(1),f(2),\dots,f(M),用空格分隔。

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    首先,根据题意,SS可被表示为一个区间[l,r][l,r],其中1lrM1\le l\le r\le M
    +当对于每个iilAirl\le A_i\le rlBirl\le B_i\le r时,区间[l,r][l,r]符合条件。
    +若按这样直接暴力枚举,时间复杂度为O(N2M)\mathcal O(N^2M),明显超时,不可取。

    +

    仔细想想会发现,对于两个区间[l,r][l,r][a,b][a,b],若alrba\le l\le r\le b,且[l,r][l,r]符合条件,则[a,b][a,b]也肯定符合条件。

    +

    此时,可以考虑使用滑动窗口优化,则时间复杂度降至O(MN)\mathcal O(MN)

    +

    继续优化。在窗口滑动的过程中,每次移动左/右端点时考虑一次移动对当前符合条件的ii的数量的贡献,需要两个数组cnt[N]\mathrm{cnt}[N](记录每个AiA_iBiB_i符合条件的个数)和inv[M+1][]\mathrm{inv}[M+1][\dots](预处理每个数值对应的所有元素下标)。

    +

    总时间复杂度为O(N+M)\mathcal O(N+M),详见代码。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +vector<int> inv[maxn];
    +int cnt[maxn], ans[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<n; i++)
    +	{
    +		int a, b;
    +		scanf("%d%d", &a, &b);
    +		inv[a].push_back(i);
    +		inv[b].push_back(i);
    +	}
    +	int left = n;
    +	for(int i=1, j=1; i<=m; i++)
    +	{
    +		for(; j <= m && left > 0; j++)
    +			for(int x: inv[j])
    +				if(++cnt[x] == 1)
    +					left --;
    +		if(left > 0) break;
    +		ans[j - i] ++, ans[m - i + 2] --;
    +		for(int x: inv[i])
    +			if(--cnt[x] == 0)
    +				left ++;
    +	}
    +	for(int i=1; i<=m; i++)
    +		printf("%d ", ans[i] += ans[i - 1]);
    +	return 0;
    +}
    +
    +
    +

    F - Find 4-cycle

    +

    给定一个二分图GG,形如下:
    +二分图

    +
    图片来源:二分图_百度百科
    +

    其中顶点集UU中的顶点数为SSVV的顶点数为TT,总边数为MM(第ii条边连接uiu_iviv_i)。
    +请找出此图中任意长为44的环。如果没有,输出-1

    +

    2S3×1052\le S\le 3\times 10^5
    +2T30002\le T\le 3000
    +4Mmin(S×T,3×105)4\le M\le \min(S\times T,3\times 10^5)
    +1uiS<viS+T1\le u_i\le S<v_i\le S+T

    +

    输入格式

    +

    S T MS~T~M
    +u1 V1u_1~V_1
    +u2 V2u_2~V_2
    +\vdots
    +uM VMu_M~V_M

    +

    输出格式

    +

    如果有长为44的环,输出其中四个顶点的编号(顺序随意,用空格分隔)。
    +如果没有,输出-1

    +

    样例

    +

    略,请自行前往AtCoder查看

    +

    分析

    +

    注意到样例中TT只有30003000O(T2)=9×106\mathcal O(T^2)=9\times 10^6可以接受。
    +然后因为是二分图,所以长为44的环肯定是在两个顶点集中各有两个点。

    +

    f(x,y)f(x,y)为目前发现的与点x,yx,y都相连的点,初始化为1-1(表示未发现)。
    +输入使用邻接表存储,G[v]G[v]存储连到vv的所有点,注意只需存顶点集UUG[v]G[v]即可。
    +再对于每个vv,依次枚举G[v]G[v]中的两个点(x,y)(x,y),如果f(x,y)=1f(x,y)=-1,则执行f(x,y):=vf(x,y):=v,如果不是1-1,则输出{x} {y} {v} {f(x,y)},结束程序。

    +

    时间复杂度约为O(T2)\mathcal O(T^2)

    +
    +

    本题中的时间复杂度怎么算?
    +f(x,y)\to f(x,y)中不同(x,y)(x,y)的组合只有T(T1)=T2TT2T(T-1)=T^2-T\approx T^2种。
    + \to~ 根据鸽笼原理(又称抽屉原理),在最坏情况下,T2T^2种组合都记录过ff之后,下一种组合无论是什么肯定都已经记录过ff,因此最坏时间复杂度为O(T2)\mathcal O(T^2),对于随机数据的平均时间复杂度远远小于这个值。

    +
    +

    代码

    +
    #include <cstdio>
    +#include <cstring>
    +#include <vector>
    +#define maxs 300005
    +#define maxt 3005
    +using namespace std;
    +
    +vector<int> G[maxs];
    +int f[maxt][maxt];
    +
    +int main()
    +{
    +	int s, t, m;
    +	scanf("%d%d%d", &s, &t, &m);
    +	while(m--)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[--u].push_back(--v - s);
    +	}
    +	memset(f, -1, sizeof(f));
    +	for(int i=0; i<s; i++)
    +		for(int j=0; j+1<G[i].size(); j++)
    +			for(int k=j+1; k<G[i].size(); k++)
    +			{
    +				int u = G[i][j], v = G[i][k];
    +				if(u > v) u ^= v ^= u ^= v;
    +				if(f[u][v] != -1)
    +				{
    +					printf("%d %d %d %d\n", f[u][v] + 1, i + 1, u + s + 1, v + s + 1);
    +					return 0;
    +				}
    +				f[u][v] = i;
    +			}
    +	puts("-1");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc263/index.html b/post/abc263/index.html new file mode 100644 index 00000000..a308b018 --- /dev/null +++ b/post/abc263/index.html @@ -0,0 +1,670 @@ + + + + + +LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解 +

    + +
    +
    + 2022-08-07 · 12 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Full House

    +

    题目大意

    +

    来自一个掼蛋爱好者的翻译qwq

    +

    给定一副扑克牌中五张牌的编号A,B,C,D,EA,B,C,D,E,判断这五张是否为一组“三带二”。(不懂的自行百度

    +

    数据范围:1A,B,C,D,E131\le A,B,C,D,E\le 13,且A,B,C,D,EA,B,C,D,E不会全部相同。

    +

    输入格式

    +

    A B C D EA~B~C~D~E

    +

    输出格式

    +

    如果是“三带二”,输出Yes;否则,输出No

    +

    样例

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AABBCCDDEE输出
    1122112211Yes
    1212121211111122No
    +

    分析

    +

    嘿嘿,被自己的翻译给笑喷了吓住了,从来没见过这么垃圾的翻译!
    +话不多说,这A题就是水(虽然studentWheat这位大佬还WA了3次,具体怎么WA的请大家好好学学引以为戒),解法很多,但是个人感觉还是直接统计一下来得简单明了,见代码。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int cnt[13];
    +
    +int main()
    +{
    +	for(int i=0; i<5; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		cnt[--x] ++;
    +	}
    +	bool has2 = false, has3 = false;
    +	for(int i=0; i<13; i++)
    +		if(cnt[i] == 2) has2 = true;
    +		else if(cnt[i] == 3) has3 = true;
    +	puts(has2 && has3? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    B - Ancestor

    +

    题目大意

    +

    NN个人,第ii个人的父/母是PiP_i,题目保证Pi<iP_i<i
    +问:第NN个人是第11个人的第几代?

    +

    2N502\le N\le 50
    +1Pi<i1\le P_i<i

    +

    输入格式

    +

    NN
    +P2 P3  PNP_2~P_3~\dots~P_N

    +

    输出格式

    +

    输出答案。

    +

    分析

    +

    本题可以使用DFS\text{DFS},但没有必要。题目限制条件特别给出了Pi<iP_i<i,因此如果按输入顺序依次处理每个人的世代,一个人的父亲肯定在这个人之前被考察到。

    +

    下面来看详细过程。
    +我们设depthi= \text{depth}_i=~ii个节点的深度,因此答案为depthN\text{depth}_N
    +初始时,depth0=0\text{depth}_0=0。对于i=1Ni=1\dots N,依次设置depthi:=depthPi+1\text{depth}_i:=\text{depth}_{P_i}+1
    +最终,输出结果即可。总时间复杂度为O(N)\mathcal O(N)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 55
    +using namespace std;
    +
    +int dep[maxn];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=1; i<n; i++)
    +	{
    +		int f;
    +		scanf("%d", &f);
    +		dep[i] = dep[--f] + 1;
    +	}
    +	printf("%d\n", dep[n - 1]);
    +	return 0;
    +}
    +
    +
    +

    C - Monotonically Increasing

    +

    题目大意

    +

    输出所有的长度为NN严格上升的序列,其中每个元素都在[1,M][1,M]之间,按字典升序输出,1NM101\le N\le M\le 10

    +

    输入格式

    +

    N MN~M

    +

    输出格式

    +

    字典升序输出所有符合条件的序列,一行一个,序列中的每个元素用空格分隔。

    +

    分析

    +

    基础的回溯算法题,见代码。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 15
    +using namespace std;
    +
    +int n, m, ans[maxn];
    +
    +void dfs(int pos, int last)
    +{
    +	if(pos == n)
    +	{
    +		for(int i=0; i<n; i++)
    +			printf("%d ", ans[i]);
    +		putchar('\n');
    +		return;
    +	}
    +	while(++last <= m)
    +	{
    +		ans[pos] = last;
    +		dfs(pos + 1, last);
    +	}
    +}
    +
    +int main()
    +{
    +	scanf("%d%d", &n, &m);
    +	dfs(0, 0);
    +	return 0;
    +}
    +
    +
    +

    D - Left Right Operation

    +

    题目大意

    +

    给定长为NN的整数序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)
    +你可以进行下列两个操作,每个最多一次:

    +
      +
    • 选择整数xx,将AA的前xx项全部改成LL
    • +
    • 选择整数yy,将AA的后yy项全部改成RR
    • +
    +

    求操作后,最小的AA中所有元素之和。

    +

    1N2×1051\le N\le 2\times 10^5
    +109L,R,Ai109-10^9\le L,R,A_i\le 10^9

    +

    输入格式

    +

    N L RN~L~R
    +A1 A2  ANA_1~A_2~\dots~A_N

    +

    输出格式

    +

    输出答案。

    +

    分析

    +

    fi=(f_i=(使用操作11选择xix\le i时的前ii个序列元素的最小和))
    +    gi=(~~~~g_i=(使用操作22选择yiy\le i时的后ii个序列元素的最小和))
    +则可得递推式fi=min{fi1+Ai,L×i}f_i=\min\{f_{i-1}+A_i,L\times i\}gig_i同理。
    +此时,枚举两种操作的分界点ii,则答案为mini=1N(fi+gNi)\min\limits_{i=1}^N(f_i+g_{N-i})。实现时,可将gg数组倒过来计算,这样答案为mini=1N(fi+gi+1)\min\limits_{i=1}^N(f_i+g_{i+1})

    +
    +

    递推式的正确性证明
    +前面已经提到了,fi=min{fi1+Ai,L×i}f_i=\min\{f_{i-1}+A_i,L\times i\}为什么?
    +先看min\min后面的部分,应该好理解,就是前ii个全部替换成LL的总和。前面的fi1+Aif_{i-1}+A_i才是关键。考虑fi1f_{i-1}的计算来源,要么是从fi2+Ai1f_{i-2}+A_{i-1}递推过来的,要么也是直接用L×(i1)L\times(i-1)得到的。再考虑fi2,fi3,,f1f_{i-2},f_{i-3},\dots,f_1会发现,递推式的结果一定是(一段LL)+(一段AiA_i)得到的。因此,这个递推式正确。gg的正确性也可以用同样的方法证明,感兴趣的读者可以自行尝试。

    +
    +

    总时间复杂度为O(N)\mathcal O(N)

    +

    代码

    +

    注意使用long long

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +using LL = long long;
    +inline LL min(const LL& x, const LL& y)
    +{
    +	return x < y? x: y;
    +}
    +
    +int a[maxn];
    +LL f[maxn], g[maxn];
    +
    +int main()
    +{
    +	int n, l, r;
    +	scanf("%d%d%d", &n, &l, &r);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	f[0] = min(l, a[0]);
    +	for(int i=1; i<n; i++)
    +		f[i] = min(f[i - 1] + a[i], (i + 1LL) * l);
    +	for(int i=n-1; i>=0; i--)
    +		g[i] = min(g[i + 1] + a[i], LL(n - i) * r);
    +	LL ans = g[0];
    +	for(int i=0; i<n; i++)
    +		ans = min(ans, f[i] + g[i + 1]);
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    E - Sugoroku 3

    +

    题目大意

    +

    NN个方格,分别是方格11,方格22,..,方格NN
    +在方格1,2,,N11,2,\dots,N-1上,各有一枚骰子。方格ii上的骰子会按照相同的概率随机输出0,1,,Ai0,1,\dots,A_i中的一个。

    +

    直到到达方格NN之前,你每次会前进骰子输出的步数。换句话说,如果你在方格xx上(1x<N1\le x<N),骰子输出了数字yy0yAi0\le y\le A_i),你下一步会到达方格x+yx+y

    +

    求到达方格NN步数的期望值,对998244353998244353取模。

    +

    2N2×1052\le N\le 2\times 10^5
    +1AiNi1\le A_i\le N-i1i<N1\le i<N

    +
    +

    有理数取模洛谷模板:P2613
    +任意一个有理数都可被表示为PQ\frac PQ的形式。令RR为取模的结果,则R×QP (mod 998244353)R\times Q\equiv P~(\bmod~998244353)
    +友情提示:对于除法计算,如AB\frac AB计算时,改为A×BP2modPA\times B^{P-2}\bmod P,其他逐步取模即可。本题中,P=998244353P=998244353

    +
    +

    输入格式

    +

    NN
    +A1 A2  AN1A_1~A_2~\dots~A_{N-1}

    +

    输出格式

    +

    输出答案,对998244353998244353取模。

    +

    分析

    +

    dpi= \text{dp}_i=~iiNN的期望步数,则初始状态为dpN=0\text{dp}_N=0,答案为dp1\text{dp}_1
    +由于在方格上不能倒退,因此考虑倒序计算dp\text{dp}。对于第ii个点,易得

    +

    dpi=j=ii+AidpjAi+1+1\text{dp}_i=\frac{\sum\limits_{j=i}^{i+A_i}\text{dp}_j}{A_i+1}+1 +

    +

    其中,求和即遍历后面每一个下一步可能到达的位置,乘上出现概率1Ai+1\frac1{A_i+1},最后再加上11表示使用一步。
    +由于左右都有dpi\text{dp}_i,无法直接计算,我们将其单独提出并解方程,得:

    +

    dpi=(j=ii+Aidpj)+Ai+1Ai\text{dp}_i=\frac{(\sum\limits_{j=i}^{i+A_i}\text{dp}_j)+A_i+1}{A_i} +

    +

    此时,时间复杂度为O(N2logP)\mathcal O(N^2\log P)(快速幂inv操作需要logP\log P的时间,其中P=998244353P=998244353),使用后缀和优化后可达O(NlogP)\mathcal O(N\log P),可以通过本题。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 200005
    +#define MOD 998244353
    +using namespace std;
    +
    +using LL = long long;
    +int a[maxn], suf[maxn];
    +
    +inline int inv(LL x)
    +{
    +	LL res = 1LL;
    +	int p = MOD - 2;
    +	while(p)
    +	{
    +		if(p & 1) (res *= x) %= MOD;
    +		(x *= x) %= MOD, p >>= 1;
    +	}
    +	return res;
    +}
    +
    +int main()
    +{
    +	int n, cur;
    +	scanf("%d", &n);
    +	for(int i=0; i<n-1; i++)
    +		scanf("%d", a + i);
    +	for(int i=n-2; i>=0; i--)
    +	{
    +		int t = suf[i + 1] - suf[i + 1 + a[i]];
    +		if(t < 0) t += MOD;
    +		cur = (a[i] + t + 1LL) % MOD * inv(a[i]) % MOD;
    +		if((suf[i] = suf[i + 1] + cur) >= MOD)
    +			suf[i] -= MOD;
    +	}
    +	printf("%d\n", cur);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc274/index.html b/post/abc274/index.html new file mode 100644 index 00000000..9eb800e3 --- /dev/null +++ b/post/abc274/index.html @@ -0,0 +1,658 @@ + + + + + +AtCoder Beginner Contest 274 A~E 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 274 A~E 题解 +

    + +
    +
    + 2022-10-24 · 10 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    吐槽:这比赛名字为啥没有英文版。。。

    +

    A - Batting Average

    +

    题目大意

    +

    给定整数A,BA,B,输出BA\frac BA,保留三位小数。

    +

    1A101\le A\le 10
    +0BA0\le B\le A

    +

    分析

    +

    签到题,使用printfcout格式化输出即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int a, b;
    +	scanf("%d%d", &a, &b);
    +	printf("%.3Lf\n", (long double)b / a);
    +	return 0;
    +}
    +
    +
    +

    B - Line Sensor

    +

    题目大意

    +

    给定一个H×WH\times W的网格,每个方格内都是.#
    +求每一列的#的个数,分别输出。

    +

    1H,W10001\le H,W\le 1000

    +

    分析

    +

    开一个数组ans[W],存储每一列的#的个数。输入时统计一下即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 1005
    +using namespace std;
    +
    +char s[maxn];
    +int ans[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(n--)
    +	{
    +		scanf("%s", s);
    +		for(int i=0; i<m; i++)
    +			if(s[i] == '#')
    +				ans[i] ++;
    +	}
    +	for(int i=0; i<m; i++)
    +		printf("%d ", ans[i]);
    +	return 0;
    +}
    +
    +
    +

    C - Ameba

    +

    题目大意

    +

    有一棵由2N+12N+1个结点组成的树,根结点是11

    +

    整棵树用一个序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)表示:

    +
      +
    • 结点AiA_i2i2i2i+12i+1的父亲。
    • +
    +

    求每个结点的深度。

    +

    1N2×1051\le N\le 2\times 10^5
    +1Ai2i11\le A_i\le 2i-1

    +

    解法1

    +

    根据题意构造树的邻接表,从根结点11开始向下搜索,从而推出每个结点的深度。

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +vector<int> G[maxn << 1];
    +int dep[maxn << 1];
    +
    +void dfs(int v, int par)
    +{
    +	for(int u: G[v])
    +		if(u != par)
    +		{
    +			dep[u] = dep[v] + 1;
    +			dfs(u, v);
    +		}
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=1; i<=n; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		G[x].push_back(i << 1);
    +		G[x].push_back(i << 1 | 1);
    +	}
    +	dep[1] = 0;
    +	dfs(1, -1);
    +	for(int i=1; i<=(n<<1)+1; i++)
    +		printf("%d\n", dep[i]);
    +	return 0;
    +}
    +
    +

    解法2(最优解)

    +

    我们从解法11进一步考虑:由于1Ai2i11\le A_i\le 2i-1,所以AiA_i一定在2i2i2i+12i+1前被处理,那么直接在输入时计算depth[2*i] = depth[2*i+1] = depth[A[i]] + 1即可。

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +int dep[maxn << 1];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=1; i<=n; i++)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		dep[i << 1] = dep[i << 1 | 1] = dep[x] + 1;
    +	}
    +	for(int i=1; i<=(n<<1)+1; i++)
    +		printf("%d\n", dep[i]);
    +	return 0;
    +}
    +
    +
    +

    D - Robot Arms 2

    +

    题目大意

    +

    给定整数NN和序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),能否在平面直角坐标系中通过NN步从(0,0)(0,0)走到(x,y)(x,y)?每一步如下:

    +
      +
    • 11步:从(0,0)(0,0)走到(A1,0)(A_1,0)(向右前进A1A_1格)。
    • +
    • ii步(i>1i>1)先左转或右转90°90\degree,再前进AiA_i格。
    • +
    +

    2N1032\le N\le 10^3
    +1Ai101\le A_i\le 10
    +104x,y104-10^4\le x,y\le 10^4

    +

    分析

    +

    先考虑另一个问题:

    +
    +

    在一维坐标系中,从ss开始进行NN次位移,第ii次的操作如下:
    + \to~选择左移或者右移AiA_i个长度单位,即坐标加上AiA_i或者减去AiA_i
    +NN次操作后是否能到达终点tt注意:必须为最终到达,中途经过不算数!

    +
    +

    很容易想到使用一个简单的DP\text{DP},令f(i,j)f(i,j)表示前ii次操作后是否能达到jj0011),转移显而易见:f(i,j)=f(i1,jAi)f(i1,j+Ai)f(i,j)=f(i-1,j-A_i)\vee f(i-1,j+A_i)
    +但是这样的时间复杂度很高,高达O(Nk)\mathcal O(Nk),其中kk为坐标系大小。

    +

    稍加思考会发现,只有小部分坐标能真正达到,其余都没有必要参与转移,所以使用set进行存储,SiS_i表示前ii次操作后能到达的坐标集合,利用Si=(Si1+Ai)(Si1Ai)S_i=(S_{i-1}+A_i)\cup(S_{i-1}-A_i)进行转移即可。

    +

    代码:

    +
    inline bool check(vector<int>& v, int start, int target)
    +{
    +	set<int> s;
    +	s.insert(start);
    +	for(int d: v)
    +	{
    +		set<int> ls = s;
    +		s.clear();
    +		for(int x: ls)
    +			s.insert(x + d), s.insert(x - d);
    +	}
    +	return s.count(target);
    +}
    +
    +

    然后回到原来的问题,发现由于xxyy两个坐标互不影响,所以把两个坐标轴分别独立出来是没有问题的,可以转换为刚才的子问题:

    +
      +
    • 对于xx坐标,起始位置为A1A_1,终点为xx,移动序列为A3,A5,A_3,A_5,\dots
    • +
    • 对于yy坐标,起始位置为00,终点为yy,移动序列为A2,A4,A_2,A_4,\dots
    • +
    +

    只要两个子问题的条件都满足,那么一定存在一种可行的操作序列来满足原题的要求。
    +至此,问题得到解决。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#include <set>
    +using namespace std;
    +
    +inline bool check(vector<int>& v, int start, int target)
    +{
    +	set<int> s;
    +	s.insert(start);
    +	for(int d: v)
    +	{
    +		set<int> ls = s;
    +		s.clear();
    +		for(int x: ls)
    +			s.insert(x + d), s.insert(x - d);
    +	}
    +	return s.count(target);
    +}
    +
    +int main()
    +{
    +	int n, x, y;
    +	scanf("%d%d%d", &n, &x, &y);
    +	vector<int> a(n);
    +	for(int& t: a) scanf("%d", &t);
    +	vector<int> dx;
    +	for(int i=2; i<n; i+=2)
    +		dx.push_back(a[i]);
    +	if(!check(dx, a[0], x)) { puts("No"); return 0; }
    +	vector<int> dy;
    +	for(int i=1; i<n; i+=2)
    +		dy.push_back(a[i]);
    +	puts(check(dy, 0, y)? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    E - Booster

    +

    题目大意

    +

    在平面直角坐标系中,有NN个城市和MM个箱子。城市ii位于坐标(Xi,Yi)(X_i,Y_i),箱子ii则在坐标(Pi,Qi)(P_i,Q_i)

    +

    Takahashi现在要从原点(0,0)(0,0)开始访问NN个城市,中途箱子可去可不去。他初始的速度为11,每碰到一个箱子都可以将速度提升至原先的两倍(每个箱子只能加速一次)。

    +

    至少要用多少时间,才能将NN个城市都访问至少一次?

    +

    分析

    +

    参考AtCoder 官方题解的做法,这里不详细解释。

    +

    代码

    +
    #include <cstdio>
    +#include <cmath>
    +#define maxn 17
    +using namespace std;
    +
    +inline double ppow(int x) { return 1.0 / (1 << __builtin_popcount(x)); }
    +inline void setmin(double& x, double y)
    +{
    +	if(y < x) x = y;
    +}
    +
    +double x[maxn], y[maxn], dp[maxn][1 << maxn];
    +
    +int main()
    +{
    +	// Input
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	m += n;
    +	for(int i=0; i<m; i++)
    +		scanf("%lf%lf", x + i, y + i);
    +	int mx = 1 << m;
    +	for(int i=0; i<m; i++)
    +		for(int s=0; s<mx; s++)
    +			dp[i][s] = 1e18;
    +
    +	// DP: Initial state
    +	for(int i=0; i<m; i++)
    +		dp[i][1 << i] = hypot(x[i], y[i]);
    +
    +	// DP: Transfer
    +	for(int s=1; s<mx; s++)
    +	{
    +		double coef = ppow(s >> n);
    +		for(int i=0; i<m; i++)
    +		{
    +			if(!(s >> i & 1)) continue;
    +			for(int j=0; j<m; j++)
    +			{
    +				if(s >> j & 1) continue;
    +				setmin(dp[j][s | (1 << j)],
    +					dp[i][s] + hypot(x[i] - x[j], y[i] - y[j])*coef);
    +			}
    +		}
    +	}
    +
    +	// Output
    +	double ans = 1e18;
    +	for(int i=0, t=1<<n; i<m; i++)
    +		for(int s=t-1; s<mx; s+=t)
    +			setmin(ans, dp[i][s] + dp[i][1 << i] * ppow(s >> n));
    +	printf("%.10f\n", ans);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc298/index.html b/post/abc298/index.html new file mode 100644 index 00000000..50ac0338 --- /dev/null +++ b/post/abc298/index.html @@ -0,0 +1,908 @@ + + + + + +TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解 +

    + +
    +
    + 2023-04-19 · 24 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    好久没写题解了,这就来水一篇。

    +

    A - Job Interview

    +

    题目大意

    +

    给定一个长为 NN 的字符串 SS,由 o-x 组成。

    +

    判断 SS 是否符合下列条件:

    +
      +
    • SS 中至少有一个 o
    • +
    • SS 中没有 x
    • +
    +

    1N1001\le N\le 100

    +

    分析

    +

    签到题。直接按题意模拟即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	while(getchar() != '\n');
    +	char c;
    +	bool ok = false;
    +	while((c = getchar()) != '\n')
    +	{
    +		if(c == 'x')
    +		{
    +			puts("No");
    +			return 0;
    +		}
    +		if(c == 'o')
    +			ok = true;
    +	}
    +	puts(ok? "Yes": "No");
    +	return 0;
    +}
    +
    +
    +

    Python 水题大法 速通大法

    +
    input()
    +s = input()
    +print('Yes' if 'o' in s and 'x' not in s else 'No')
    +
    +

    成功省掉208208个字符(

    +
    +
    +

    B - Coloring Matrix

    +

    题目大意

    +

    给定两个 N×NN\times N 的矩阵 AABB,都由 0011 组成。

    +

    你可以将 AA 顺时针旋转 0°,90°,180°0\degree,90\degree,180\degree270°270\degree(任选其一)。

    +

    判断旋转后的 AA 能否满足:

    +
      +
    • 对于每个 Ai,j=1A_{i,j}=1(i,j)(i,j)Bi,j=1B_{i,j}=1
    • +
    +

    1N1001\le N\le 100

    +

    分析

    +

    原题中还贴心的给出了如何将一个矩阵旋转90°90\degree,照题意模拟,旋转44次并逐个判断即可。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 105
    +using namespace std;
    +
    +int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int i=0; i<n; i++)
    +		for(int j=0; j<n; j++)
    +			scanf("%d", a[i] + j);
    +	for(int i=0; i<n; i++)
    +		for(int j=0; j<n; j++)
    +			scanf("%d", b[i] + j);
    +	for(int x=0; x<4; x++)
    +	{
    +		for(int i=0; i<n; i++)
    +			for(int j=0; j<n; j++)
    +				c[i][j] = a[i][j];
    +		for(int i=0; i<n; i++)
    +			for(int j=0; j<n; j++)
    +				a[i][j] = c[n - 1 - j][i];
    +		for(int i=0; i<n; i++)
    +			for(int j=0; j<n; j++)
    +				if(a[i][j] && !b[i][j])
    +					goto bad; // goto 不是好习惯(改不掉了),千万不要学
    +		puts("Yes");
    +		return 0;
    +		bad:;
    +	}
    +	puts("No");
    +	return 0;
    +}
    +
    +
    +

    C - Cards Query Problem

    +

    题目大意

    +

    NN 个盒子,编号 1N1\sim N,初始均为空。依次处理 QQ 次询问:

    +
      +
    • 1 i j:将数字 ii 写在一张空卡牌上,放入盒子 jj
    • +
    • 2 i:按升序输出盒子 ii 中的所有卡牌(允许重复)。
    • +
    • 3 i:按升序输出包含卡牌 ii 的所有盒子的编号。若一个盒子里有多张卡牌 ii,则这个盒子的编号仅输出一次。
    • +
    +

    1N,Q2×1051\le N,Q\le 2\times 10^5

    +

    对于查询中所有卡牌上的数字 xx,均有 1x2×1051\le x\le 2\times 10^5
    +对于查询中所有的盒子编号 yy,均有 1yN1\le y\le N

    +

    题目保证输出不超过 2×1052\times 10^5 个整数。

    +

    分析

    +

    我们分别考虑两种输出操作的做法。

    +
      +
    • 2 i:很容易想到,既然要按升序输出,并且允许重复,我们可以使用 NNmultiset 来依次存储每个盒子中的卡牌,处理操作 11 时更新。
    • +
    • 3 i:首先不能从 NN 个盒子中依次查找,这样明显会 TLE。正确的做法是,使用 2×1052\times 10^5set(注意不能重复,所以不用 multiset)分别存储每张卡牌所在的箱子编号,处理操作 11 时更新。
    • +
    +

    此外,本题也可以使用 priority_queuemap,甚至直接输出时排序并去重,不过使用 set 的方式是最简单、代码量最少的。几种方法的总时间复杂度都是 O(QlogN)\mathcal O(Q\log N)

    +

    代码

    +
    #include <cstdio>
    +#include <set>
    +#define maxn 200005
    +using namespace std;
    +
    +multiset<int> box[maxn];
    +set<int> has[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	while(q--)
    +	{
    +		int op, i;
    +		scanf("%d%d", &op, &i);
    +		if(op == 1)
    +		{
    +			int j;
    +			scanf("%d", &j);
    +			box[j].insert(i);
    +			has[i].insert(j);
    +		}
    +		else if(op == 2)
    +		{
    +			for(int x: box[i])
    +				printf("%d ", x);
    +			putchar('\n');
    +		}
    +		else if(op == 3)
    +		{
    +			for(int x: has[i])
    +				printf("%d ", x);
    +			putchar('\n');
    +		}
    +	}
    +	return 0;
    +}
    +
    +
    +

    D - Writing a Numeral

    +

    题目大意

    +

    我们有一个字符串 SS。初始时,S=S= 1

    +

    处理如下 QQ 次询问:

    +
      +
    • 1 x:将数字 xx 追加至 SS 的最后面。保证 x{1,2,3,4,5,6,7,8,9}x \in \{1,2,3,4,5,6,7,8,9\}
    • +
    • 2:删除 SS 的第一个字符。保证此时 S>1|S|>1
    • +
    • 3:输出 SS 在十进制中对应的数字,对 998244353998244353 取模。
    • +
    +

    1Q6×1051\le Q\le 6\times 10^5

    +

    分析

    +

    首先,我们必须使用一个 queuedeque 来存储字符串 SS。然后,为了在 O(1)\mathcal O(1) 的时间内处理第三种操作,我们必须维护 Smod(P=998244353)S \bmod (P=998244353) 的值,记为 AA。下面考虑前两种操作对 AA 的影响:

    +
      +
    • 1 x:只需在十进制中腾出一位 00 再加上 xx 即可,可表示为 A(10A+x)modPA \leftarrow (10A+x)\bmod P
    • +
    • 2:先从队列中取出 SS 的第一位,记为 xx。我们需要从 AA 中减掉最高位乘上其在十进制中的权值,即 A(A10Sx)modPA \leftarrow (A-10^{|S|}x)\bmod P(此时 S|S| 表示队列取出前一位后的长度,等同于取出前的 S1|S|-1
    • +
    +

    对于 10n10^n 的计算,我们可以用一个变量实时维护 10SmodP10^{|S|}\bmod P 的值,也可以预处理出所有 10nmodP10^n \bmod P,或者直接使用快速幂。

    +

    总时间复杂度为 O(QlogQ)\mathcal O(Q\log Q)(快速幂)或 O(Q)\mathcal O(Q)(预处理)。

    +

    代码

    +

    实现 11:使用 AtCoder Library + 快速幂,队列使用 deque

    +
    #include <cstdio>
    +#include <deque>
    +#include <atcoder/modint>
    +using namespace std;
    +
    +using modint = atcoder::modint998244353;
    +
    +int main()
    +{
    +	deque<int> s;
    +	s.push_back(1);
    +	int q;
    +	scanf("%d", &q);
    +	modint ans = 1;
    +	while(q--)
    +	{
    +		int op;
    +		scanf("%d", &op);
    +		if(op == 1)
    +		{
    +			int x;
    +			scanf("%d", &x);
    +			s.push_back(x);
    +			ans = ans * 10 + x;
    +		}
    +		else if(op == 2)
    +		{
    +			int x = s.front(); s.pop_front();
    +			ans -= x * modint(10).pow((int)s.size());
    +		}
    +		else printf("%d\n", ans.val());
    +	}
    +	return 0;
    +}
    +
    +

    实现 22:用变量维护 10SmodP10^{|S|} \bmod P 的值,队列使用 queue

    +
    #include <cstdio>
    +#include <queue>
    +#define MOD 998244353
    +using namespace std;
    +
    +int main()
    +{
    +	int Q;
    +	scanf("%d", &Q);
    +	queue<int> q;
    +	q.push(1);
    +	int ans = 1, p = 1;
    +	while(Q--)
    +	{
    +		int op;
    +		scanf("%d", &op);
    +		if(op == 1)
    +		{
    +			int x;
    +			scanf("%d", &x);
    +			q.push(x);
    +			ans = (ans * 10LL + x) % MOD;
    +			p = p * 10LL % MOD;
    +		}
    +		else if(op == 2)
    +		{
    +			ans -= (long long) q.front() * p % MOD; q.pop();
    +			p = p * 299473306LL % MOD; // 299473306 是 10 对于 MOD 的逆元,这句话相当于把 p 除以 10 
    +			if(ans < 0) ans += MOD;
    +		}
    +		else printf("%d\n", ans);
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - Unfair Sugoroku

    +

    题目大意

    +

    Takahashi 和 Aoki 将玩一个游戏。游戏规则如下:

    +
      +
    • 游戏棋盘有 NN 个点(编号 1N1\sim N),两玩家轮流投骰子并前进。
    • +
    • Takahashi 初始在点 AA,Aoki 初始在点 BB
    • +
    • Takahashi 的骰子等概率出现 1,2,,P1,2,\dots,P,Aoki 的骰子等概率出现 1,2,,Q1,2,\dots,Q
    • +
    • 当一个玩家当前在点 xx 且骰子出现 ii 时,他移动到点 min(x+i,N)\min(x+i,N)
    • +
    • 先到达点 NN 的玩家胜利。
    • +
    +

    假定 Takahashi 先行,求他赢的概率,对 998244353998244353 取模。

    +

    2N1002\le N\le 100
    +1A,BN1\le A,B\le N
    +1P,Q101\le P,Q\le 10

    +

    分析

    +

    自己的赛时解法太复杂了,这里介绍官方题解的做法。

    +

    考虑概率 DP(下面用 Ta 表示 Takahashi,Ao 表示 Aoki):

    +
      +
    • fi,jf_{i,j} 表示 Ta 在点 ii,Ao 在点 jj,下一轮 Ta 移动时 Ta 获胜的概率。
    • +
    • gi,jg_{i,j} 表示 Ta 在点 ii,Ao 在点 jj,下一轮 Ao 移动时 Ta 获胜的概率。
    • +
    +

    首先考虑初始状态。根据游戏规则,对于任意 1i<n1\le i<nfn,i=gn,i=1,fi,n=gi,n=0f_{n,i}=g_{n,i}=1,f_{i,n}=g_{i,n}=0

    +

    转移也很显然:

    +
      +
    • 对于 Ta 当前走的每种可能的步数 k=1,2,,Pk=1,2,\dots,P,有 fi,j:=fi,j+1Pgmin(i+k,N),jf_{i,j}:=f_{i,j}+\frac1Pg_{\min(i+k,N),j}
    • +
    • 对于 Ao 当前走的每种可能的步数 k=1,2,,Qk=1,2,\dots,Q,有 gi,j:=gi,j+1Qfi,min(j+k,N)g_{i,j}:=g_{i,j}+\frac1Qf_{i,\min(j+k,N)}
    • +
    +

    整理上面的式子,得到:

    +

    fi,j={0(j=N)1(i=N)1Pk=1Pgmin(i+k,N),j(i,jN) gi,j={0(j=N)1(i=N)1Qk=1Qfi,min(j+k,N)(i,jN)f_{i,j}=\begin{cases} +0 & (j=N)\\ +1 & (i=N)\\ +\frac1P\sum\limits_{k=1}^Pg_{\min(i+k,N),j} & (i,j\ne N) +\end{cases}\\ +~\\ +g_{i,j}=\begin{cases} +0 & (j=N)\\ +1 & (i=N)\\ +\frac1Q\sum\limits_{k=1}^Qf_{i,\min(j+k,N)} & (i,j\ne N) +\end{cases}\\ +

    +

    这里注意,由于 i=j=Ni=j=N 的情况无意义(不可能达到),所以无需特殊考虑。

    +

    最终输出结果即为 fp,qf_{p,q}。总时间复杂度为 O(N2(P+Q))\mathcal O(N^2(P+Q))。使用前缀和可以优化到 O(N2)\mathcal O(N^2),有兴趣的可以自己尝试,这里不详细解释了。

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +#define MOD 998244353
    +#define maxn 105
    +using namespace std;
    +
    +using LL = long long;
    +inline LL inv(LL x) // x ^ (MOD - 2) % MOD
    +{
    +	int y = MOD - 2;
    +	LL res = 1LL;
    +	while(y)
    +	{
    +		if(y & 1) (res *= x) %= MOD;
    +		(x *= x) %= MOD, y >>= 1;
    +	}
    +	return res;
    +}
    +
    +inline void add(int& x, int y)
    +{
    +	if((x += y) >= MOD)
    +		x -= MOD;
    +}
    +
    +int f[maxn][maxn], g[maxn][maxn];
    +
    +int main()
    +{
    +	int n, a, b, p, q;
    +	scanf("%d%d%d%d%d", &n, &a, &b, &p, &q);
    +	for(int i=0; i<n; i++)
    +		f[n][i] = g[n][i] = 1, f[i][n] = g[i][n] = 0;
    +	LL prob_p = inv(p), prob_q = inv(q);
    +	for(int i=n-1; i>=a; i--)
    +		for(int j=n-1; j>=b; j--)
    +		{
    +			for(int k=1; k<=p; k++)
    +				add(f[i][j], g[min(i + k, n)][j]);
    +			f[i][j] = f[i][j] * prob_p % MOD;
    +			for(int k=1; k<=q; k++)
    +				add(g[i][j], f[i][min(j + k, n)]);
    +			g[i][j] = g[i][j] * prob_q % MOD;
    +		}
    +	printf("%d\n", f[a][b]);
    +	return 0;
    +}
    +
    +
    +

    F - Rook Score

    +

    题目大意

    +

    有一个 109×10910^9\times 10^9 的网格。令 (i,j)(i,j) 表示第 iijj 列的格子(1i,j1091\le i,j\le 10^9)。

    +

    对于 i=1,2,,Ni=1,2,\dots,N,整数 xix_i 被写在 (ri,ci)(r_i,c_i) 上。在剩余的 1018N10^{18}-N 个格子里只有数字 00

    +

    你可以选择一个格子 (R,C)(R,C) 并计算与其同行或同列的 2×10912\times 10^9-1 个整数之和 SS

    +

    求最大可能的 SS

    +

    1N2×1051\le N\le 2\times 10^5
    +1ri,ci,xi1091\le r_i,c_i,x_i\le 10^9
    +(ri,ci)(rj,cj)      (ij)(r_i,c_i)\ne (r_j,c_j)~~~~~~(i\ne j)

    +

    分析

    +

    我们令 f(R,C)f(R,C) 表示对于 (R,C)(R,C)SS,令 rsR\mathrm{rs}_R 表示第 RR 行的整数之和,csC\mathrm{cs}_C表示第 CC 列的整数之和,AR,CA_{R,C} 表示 (R,C)(R,C) 上的整数。

    +

    容易发现,f(R,C)=rsR+csCAR,Cf(R,C)=\mathrm{rs}_R+\mathrm{cs}_C-A_{R,C}

    +

    然后证明当 f(R,C)f(R,C) 最大时,rsR,csC0\mathrm{rs}_R,\mathrm{cs}_C\ne0

    +
      +
    • rsR=csC=0\mathrm{rs}_R=\mathrm{cs}_C=0,则 f(r0,c0)=x0>0=f(R,C)f(r_0,c_0)=x_0>0=f(R,C),所以 (R,C)(R,C) 不是最优解;
    • +
    • rsR0,csC=0\mathrm{rs}_R\ne0,\mathrm{cs}_C=0,则 f(R,c0)=rsR+csc0AR,c0f(R,C)=rsRf(R,c_0)=\mathrm{rs}_R+\mathrm{cs}_{c_0}-A_{R,c_0}\ge f(R,C)=\mathrm{rs}_R,所以 (R,C)(R,C) 不是最优解(或有多个最优解,但其中至少有一个解 (x,y)(x,y) 使得 rsx,csy0\mathrm{rs}_x,\mathrm{cs}_y\ne0
    • +
    • rsR=0,csC0\mathrm{rs}_R=0,\mathrm{cs}_C\ne0 同理。
    • +
    +

    所以,我们可以依次考虑每一行 RRrsR0\mathrm{rs}_R\ne 0),相当于固定了 rsR\mathrm{rs}_R。这时,我们只需找到一列 CCcsC0\mathrm{cs}_C\ne 0),使得 csCAR,C\mathrm{cs}_C-A_{R,C} 最大,就可以解决此问题。

    +

    但如果依次考虑所有包含点的列,则最坏情况下时间复杂度为 O(N2)\mathcal O(N^2),无法通过此题。这时,我们可以使用一个 multisetmap 来维护当前每列对答案的贡献(csCAR,C\mathrm{cs}_C-A_{R,C})。对于每一行 RR,仅需更新这一行上有非 00 数字的点 (R,C)(R,C) 的贡献(减去 AR,CA_{R,C})即可。

    +

    这样,由于每个点会被更新正好一次,所以总时间复杂度为 O(NlogN)\mathcal O(N\log N)

    +

    代码

    +

    注意更新完成,求得当前答案后需要复原 mapmultiset

    +
    #include <cstdio>
    +#include <vector>
    +#include <set>
    +#include <unordered_map>
    +using namespace std;
    +
    +using LL = long long;
    +using pii = pair<int, int>;
    +
    +unordered_map<int, vector<pii>> rows;
    +unordered_map<int, LL> col_sum;
    +
    +template <typename T>
    +class MaxSet {
    +private:
    +	multiset<T> s;
    +public:
    +	inline void insert(const T& x) { s.insert(x); }
    +	inline void update(const T& old, const T& New) {
    +		s.erase(s.find(old));
    +		s.insert(New);
    +	}
    +	inline T max() { return *s.rbegin(); }
    +};
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	while(n--)
    +	{
    +		int x, y, v;
    +		scanf("%d%d%d", &x, &y, &v);
    +		rows[x].emplace_back(y, v);
    +		col_sum[y] += v;
    +	}
    +	MaxSet<LL> s;
    +	for(auto [_, sum]: col_sum)
    +		s.insert(sum);
    +	LL ans = 0LL;
    +	for(auto& [x, v]: rows)
    +	{
    +		for(auto [y, val]: v)
    +			s.update(col_sum[y], col_sum[y] - val);
    +		LL cur = s.max();
    +		for(auto [y, val]: v)
    +			s.update(col_sum[y] - val, col_sum[y]), cur += val;
    +		if(cur > ans) ans = cur;
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +
    +

    G - Strawberry War

    +

    题目大意

    +

    注意本题时间限制为 6s6\mathrm s

    +

    我们有一块长方形的蛋糕。它可被看作一个 H×WH\times W 的网格,第 iijj 列上有 si,js_{i,j} 个草莓。

    +

    我们对蛋糕进行 TT 次切分,切成 T+1T+1 块。每次切蛋糕可以选择当前的一块,并将其从中间横切或竖切成两块:
    +切分方式

    +

    你想把蛋糕切的尽可能均匀。意思是,令 MM 表示切分完成后每一块上的草莓数量的最大值,mm 表示最小值,求出 MmM-m 的最小值。

    +

    1H,W61\le H,W\le 6
    +1THW11\le T\le HW-1
    +0si,j10160\le s_{i,j}\le 10^{16}

    +

    分析

    +

    本题解参考官方题解

    +

    操作完成后得到的蛋糕一定是蛋糕的子矩形,所以最多只有 (H+12)×(W+12)=H(H+1)W(W+1)4441\binom {H+1}2\times\binom {W+1}2=\frac{H(H+1)W(W+1)}4\le 441 种数字在剩下的块中。令这些可能的数分别为 a1,a2,,aXa_1,a_2,\dots,a_X。可知 XH(H+1)W(W+1)4441X\le \frac{H(H+1)W(W+1)}4\le 441

    +

    根据上面的 aa,我们只需先确定 m{a1,a2,,aX}m\in \{a_1,a_2,\dots,a_X\},再找到与其对应的最小 MM,算出 MmM-m 的最小值即可。

    +

    定义 fi,j,k,l,mf_{i,j,k,l,m} 表示将 x[i,j),y[k,l)x\in[i,j),y\in[k,l) 的子矩形切成 mm 片时最小可能的每片上草莓数的最大值。

    +

    详见代码。

    +

    代码

    +
    #include <bits/stdc++.h>
    +using namespace std;
    +const long long INF = 1000000000000000000;
    +int main(){
    +  int H, W, T;
    +  cin >> H >> W >> T;
    +  vector<vector<long long>> s(H, vector<long long>(W));
    +  for (int i = 0; i < H; i++){
    +    for (int j = 0; j < W; j++){
    +      cin >> s[i][j];
    +    }
    +  }
    +  vector<vector<vector<vector<long long>>>> sum(H, vector<vector<vector<long long>>>(H + 1, vector<vector<long long>>(W, vector<long long>(W + 1, 0))));
    +  vector<long long> x;
    +  for (int i = 0; i < H; i++){
    +    for (int j = i + 1; j <= H; j++){
    +      for (int k = 0; k < W; k++){
    +        for (int l = k + 1; l <= W; l++){
    +          for (int m = i; m < j; m++){
    +            for (int n = k; n < l; n++){
    +              sum[i][j][k][l] += s[m][n];
    +            }
    +          }
    +          x.push_back(sum[i][j][k][l]);
    +        }
    +      }
    +    }
    +  }
    +  int cnt = x.size();
    +  long long ans = INF;
    +  for (int i = 0; i < cnt; i++){
    +    vector<vector<vector<vector<vector<long long>>>>> dp(T + 1, vector<vector<vector<vector<long long>>>>(H, vector<vector<vector<long long>>>(H + 1, vector<vector<long long>>(W, vector<long long>(W + 1, INF)))));
    +    for (int j = H - 1; j >= 0; j--){
    +      for (int k = j + 1; k <= H; k++){
    +        for (int l = W - 1; l >= 0; l--){
    +          for (int m = l + 1; m <= W; m++){
    +            if (sum[j][k][l][m] >= x[i]){
    +              dp[0][j][k][l][m] = sum[j][k][l][m];
    +            }
    +            for (int n = j + 1; n < k; n++){
    +              for (int o = 0; o < (n - j) * (m - l); o++){
    +                for (int p = 0; p < (k - n) * (m - l) && o + p < T; p++){
    +                  dp[o + p + 1][j][k][l][m] = min(dp[o + p + 1][j][k][l][m], max(dp[o][j][n][l][m], dp[p][n][k][l][m]));
    +                }
    +              }
    +            }
    +            for (int n = l + 1; n < m; n++){
    +              for (int o = 0; o < (k - j) * (n - l); o++){
    +                for (int p = 0; p < (k - j) * (m - n) && o + p < T; p++){
    +                  dp[o + p + 1][j][k][l][m] = min(dp[o + p + 1][j][k][l][m], max(dp[o][j][k][l][n], dp[p][j][k][n][m]));
    +                }
    +              }
    +            }
    +          }
    +        }
    +      }
    +    }
    +    ans = min(ans, dp[T][0][H][0][W] - x[i]);
    +  }
    +  cout << ans << endl;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc318/index.html b/post/abc318/index.html new file mode 100644 index 00000000..74f08b3f --- /dev/null +++ b/post/abc318/index.html @@ -0,0 +1,674 @@ + + + + + +AtCoder Beginner Contest 318 G - Typical Path Problem 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder Beginner Contest 318 G - Typical Path Problem 题解 +

    + +
    +
    + 2023-09-03 · 11 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    G - Typical Path Problem

    +

    题目大意

    +

    给定一张 NN 个点、MM 条边的简单无向图 GG 和三个整数 A,B,CA,B,C

    +

    是否存在一条从顶点 AACC,且经过 BB 的简单路径?

    +

    数据范围:

    +
      +
    • 3N2×1053\le N\le 2\times 10^5
    • +
    • N1Mmin(N(N1)2,2×105)N-1\le M\le \min(\frac{N(N-1)}2,2\times 10^5)
    • +
    • 1A,B,CN1\le A,B,C\le NA,B,CA,B,C 互不相同)
    • +
    +
    +

    什么是 简单路径
    +简单路径 是不重复经过同一个点的路径。例如,1231\to 2\to 3 是简单路径,但 1211\to 2\to 1 不是简单路径。

    +
    +

    解法1:最大流

    +

    不难发现,存在一条 ABCA\to B\to C 的简单路径,当且仅当存在一条 BAB\to A 和一条 BCB\to C 的路径,使得这两条路径不经过同一个点(BB 除外)。因此,我们可以构建网络流模型来解决此问题。

    +

    考虑由 (2N+2)(2N+2) 个点组成的有向图 GG'

    +
      +
    • 源点:ss
    • +
    • 汇点:tt
    • +
    • GG 中每个点对应的入点:x1,,xNx_1,\dots,x_N
    • +
    • GG 中每个点对应的出点:y1,,yNy_1,\dots,y_N
    • +
    +

    然后进行连边:

    +
      +
    • 对于每个 1iN1\le i\le N,从入点 xix_i 向出点 yiy_i 连接一条流量为 11 的边;
    • +
    • 从源点 ss 到中转点的入点 xBx_B 连接一条流量为 22 的边;
    • +
    • AACC 的出点 yA,yCy_A,y_C 向汇点 tt 分别连接一条流量为 11 的边;
    • +
    • 最后,(u,v)EG\forall (u,v)\in E_G,连接 yuxvy_u \to x_vyvxuy_v \to x_u,流量为 11
    • +
    +

    计算 sstt 的最大流,如果最大流为 22 则必定有存在不经过同一个顶点的 BA,BCB\to A,B\to C 的路径。

    +
    +

    证明
    +显然,如果最大流为 22,必然通过了 yAy_AyCy_C 向汇点连接的边,则一定分别有 BAB\to ABCB\to C 的路径。
    +假设选择的这两条路径经过了同一顶点 vv,则两流都必须经过 xvyvx_v\to y_v 这一条流量为 11 的边,此时最大流不可能超过 11。而最大流为 22,说明假设不成立,故没有经过同一顶点。

    +
    +

    若使用 Dinic\text{Dinic} 算法,由于最大流不超过 22,网络流的时间复杂度为 O(N+M)\mathcal O(N+M)

    +

    代码实现

    +

    在以下的两种实现中,我们规定

    +
      +
    • 源点:s=0s=0
    • +
    • 汇点:t=2n+1t=2n+1
    • +
    • ii 的入点:xi=ix_i=i
    • +
    • ii 的出点:yi=n+iy_i=n+i
    • +
    +

    AC Library 实现

    +

    AtCoder Library 内置最大流的 Dinic\text{Dinic} 实现。

    +
    #include <cstdio>
    +#include <atcoder/maxflow>
    +using namespace std;
    +
    +int main()
    +{
    +	int n, m, a, b, c;
    +	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
    +	int s = 0, t = (n << 1) + 1;
    +	atcoder::mf_graph<int> G(t + 1);
    +	G.add_edge(s, b + n, 2);
    +	G.add_edge(a + n, t, 1);
    +	G.add_edge(c + n, t, 1);
    +	for(int i=1; i<=n; i++)
    +		G.add_edge(i, i + n, 1);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G.add_edge(x + n, y, 1);
    +		G.add_edge(y + n, x, 1);
    +	}
    +	puts(G.flow(s, t, 2) == 2? "Yes": "No");
    +	return 0;
    +}
    +
    +

    Dinic 手写实现

    +

    Dinic\text{Dinic} 算法对于此图的时间复杂度为 O(N+M)\mathcal O(N+M)。如果不清楚算法原理可以参考 OI Wiki

    +
    +

    关于空间分配问题
    +由于新图 GG' 包含 (N+2M+3)(N+2M+3) 条边,若使用静态链式前向星存图,数组大小需要开到 2(N+2M+3)2(N+2M+3),其理论最大值为 1.2×106+61.2\times 10^6+6。此处建议使用 1.25×1061.25\times 10^6 大小的数组。

    +
    +
    #include <cstdio>
    +#include <cstring>
    +#include <queue>
    +#include <algorithm>
    +#define maxn 400005
    +#define maxm 1250005
    +using namespace std;
    +
    +int n, s, t, head[maxn], cur[maxn], dis[maxn],
    +	cnt, w[maxm], to[maxm], nxt[maxm];
    +
    +inline void add(int u, int v, int flow)
    +{
    +	nxt[cnt] = head[u];
    +	head[u] = cnt;
    +	to[cnt] = v;
    +	w[cnt++] = flow;
    +}
    +
    +inline void add_flow(int u, int v, int f)
    +{
    +	add(u, v, f);
    +	add(v, u, 0);
    +}
    +
    +inline bool bfs()
    +{
    +	memset(dis, -1, sizeof(int) * n);
    +	dis[s] = 0, cur[s] = head[s];
    +	queue<int> q;
    +	q.push(s);
    +	while(!q.empty())
    +	{
    +		int v = q.front(); q.pop();
    +		for(int i=head[v]; ~i; i=nxt[i])
    +			if(w[i])
    +			{
    +				int u = to[i];
    +				if(dis[u] == -1)
    +				{
    +					dis[u] = dis[v] + 1, cur[u] = head[u];
    +					if(u == t) return true;
    +					q.push(u);
    +				}
    +			}
    +	}
    +	return false;
    +}
    +
    +int dfs(int v, int flow)
    +{
    +	if(v == t) return flow;
    +	int res = 0;
    +	for(int i=cur[v]; ~i && flow; i=nxt[i])
    +	{
    +		cur[v] = i;
    +		int u = to[i];
    +		if(w[i] && dis[u] == dis[v] + 1)
    +		{
    +			int k = dfs(u, min(flow, w[i]));
    +			w[i] -= k;
    +			w[i ^ 1] += k;
    +			flow -= k;
    +			res += k;
    +		}
    +	}
    +	return res;
    +}
    +
    +int main()
    +{
    +	int n, m, a, b, c;
    +	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
    +	s = 0, t = (n << 1) + 1, ::n = t + 1;
    +	memset(head, -1, sizeof(int) * ::n);
    +	add_flow(s, b + n, 2);
    +	add_flow(a + n, t, 1);
    +	add_flow(c + n, t, 1);
    +	for(int i=1; i<=n; i++)
    +		add_flow(i, i + n, 1);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		add_flow(x + n, y, 1);
    +		add_flow(y + n, x, 1);
    +	}
    +	int mf = 0;
    +	while(bfs()) mf += dfs(s, 2);
    +	puts(mf == 2? "Yes": "No");
    +	return 0;
    +}
    +
    +

    解法2:圆方树

    +

    注意到以下算法的正确性:

    +
      +
    • 找到 ACA\to C 的任意简单路径。对于经过的每一个点双连通分量,如果 BB 在此点双内,则必然存在 ABCA\to B\to C 的简单路径;如果 BB 不属于任一经过的点双,则不可能存在 ABCA\to B\to C 的简单路径。
    • +
    +

    因此,可以使用 Tarjan\text{Tarjan} 算法构造原图的圆方树 TT 来解决此问题。将上述算法转换到圆方树上如下:

    +
      +
    • TT 上找到 ACA\to C 的唯一简单路径。对于经过的每一个方点,如果 BB 是与其相邻的圆点,则必然存在 ABCA\to B\to C 的简单路径;如果 BB 不与任一经过的方点相邻,则不可能存在 ABCA\to B\to C 的简单路径。
    • +
    +

    总时间复杂度为 O(N+M)\mathcal O(N+M),实际运行时间优于网络流解法。

    +

    代码实现

    +

    小贴士:圆方树相关的数组要开到两倍大小,不然会 RE 哦~

    +
    #include <cstdio>
    +#include <cstdlib>
    +#include <vector>
    +#define maxn 200005
    +using namespace std;
    +
    +inline void setmin(int& x, int y)
    +{
    +	if(y < x) x = y;
    +}
    +
    +vector<int> G[maxn], T[maxn << 1];
    +
    +inline void add_edge(vector<int>* G, int x, int y)
    +{
    +	G[x].push_back(y);
    +	G[y].push_back(x);
    +}
    +
    +int dfc, dfn[maxn], low[maxn], top, st[maxn], cnt;
    +
    +void tarjan(int v)
    +{
    +	low[v] = dfn[v] = ++dfc;
    +	st[++top] = v;
    +	for(int u: G[v])
    +		if(!dfn[u])
    +		{
    +			tarjan(u);
    +			setmin(low[v], low[u]);
    +			if(low[u] == dfn[v])
    +			{
    +				add_edge(T, v, ++cnt);
    +				do add_edge(T, st[top], cnt);
    +				while(st[top--] != u);
    +			}
    +		}
    +		else setmin(low[v], dfn[u]);
    +}
    +
    +int n, m, a, b, c, ct[maxn << 1];
    +void dfs(int v, int par)
    +{
    +	if(v > n)
    +		for(int u: T[v])
    +			ct[u] ++;
    +	if(v == c)
    +	{
    +		puts(ct[b]? "Yes": "No");
    +		exit(0);
    +	}
    +	for(int u: T[v])
    +		if(u != par)
    +			dfs(u, v);
    +	if(v > n)
    +		for(int u: T[v])
    +			ct[u] --;
    +}
    +
    +int main()
    +{
    +	scanf("%d%d%d%d%d", &n, &m, &a, &b, &c);
    +	while(m--)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		add_edge(G, x, y);
    +	}
    +	cnt = n;
    +	tarjan(1);
    +	dfs(a, -1);
    +	return 0;
    +}
    +
    +

    总结

    +

    三种解法的对比参见下表:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    解法代码长度运行时间内存占用
    最大流(AC Library)[1]523 B523~\mathrm{B}337 ms337~\mathrm{ms}106480 KB106480~\mathrm{KB}
    最大流(Dinic)[2]1650 B1650~\mathrm{B}334 ms334~\mathrm{ms}46980 KB46980~\mathrm{KB}
    圆方树[3]1142 B1142~\mathrm{B}162 ms162~\mathrm{ms}57824 KB57824~\mathrm{KB}
    +

    可见,圆方树算法的运行速度最快,最大流(AC Library)的代码最短,最大流(Dinic)的内存占用最小。

    +
    +

    个人评价
    +这道题出得很好,题意简单而内涵丰富。
    +我赛时甚至没想到还可以网络流

    +
    +
    +
    +
      +
    1. https://atcoder.jp/contests/abc318/submissions/45209577 ↩︎

      +
    2. +
    3. https://atcoder.jp/contests/abc318/submissions/45212257 ↩︎

      +
    4. +
    5. https://atcoder.jp/contests/abc318/submissions/45210151 ↩︎

      +
    6. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/abc334/index.html b/post/abc334/index.html new file mode 100644 index 00000000..9940cfa8 --- /dev/null +++ b/post/abc334/index.html @@ -0,0 +1,833 @@ + + + + + +UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解 +

    + +
    +
    + 2023-12-24 · 19 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A - Christmas Present

    +

    题目大意

    +

    给定两个正整数 B,GB,G1B,G10001\le B,G\le 1000BGB\ne G),判断哪个更大。

    +

    分析

    +

    模拟即可。

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int b, g;
    +	scanf("%d%d", &b, &g);
    +	puts(b > g? "Bat": "Glove");
    +	return 0;
    +}
    +
    +
    +

    B - Christmas Trees

    +

    题目大意

    +

    给定 A,M,L,RA,M,L,R
    +对于任意整数 kk,Snuke 都会在数轴上的 A+kMA+kM 处放置一棵圣诞树。
    +试问区间 [L,R][L,R] 中共有多少棵圣诞树?

    +

    1018A1018-10^{18}\le A\le 10^{18}
    +1M1091\le M\le 10^9
    +1018LR1018-10^{18}\le L\le R\le 10^{18}

    +

    分析

    +

    不难发现,对于任意整数 xx,数轴上 xx 处有圣诞树当且仅当 xA (mod M)x \equiv A \ (\bmod \ M)。变形可得 xA0 (mod M)x-A \equiv 0 \ (\bmod \ M),即 (xA)M(x-A) \mid M。故只需考虑相对于 AA 的坐标,所以统计 [LA,RA][L-A,R-A]MM 的倍数数量即可。

    +

    代码

    +

    使用 C++ 语言时,注意正确处理负数的情况。

    +
    #include <cstdio>
    +using namespace std;
    +
    +using LL = long long;
    +
    +int main()
    +{
    +	LL a, l, r;
    +	int m;
    +	scanf("%lld%d%lld%lld", &a, &m, &l, &r);
    +	l -= a, r -= a;
    +	if(l < 0) l = -((-l) / m * m);
    +	else l = (l + m - 1) / m * m;
    +	if(r < 0) r = -((-r + m - 1) / m * m);
    +	else r = r / m * m;
    +	printf("%lld\n", (r - l) / m + 1);
    +	return 0;
    +}
    +
    +
    +

    C - Socks 2

    +

    题目大意

    +

    有长为 2N2N 的序列 S=(1,1,2,2,,N,N)S=(1,1,2,2,\dots,N,N)
    +给定 A=(A1,,AK)A=(A_1,\dots,A_K),将 SS 中数字 A1,,AKA_1,\dots,A_K 各拿掉一个,剩余 2NK2N-K 个。
    +对这 2NK2N-K 个数进行两两组合(可能剩余 11 个),使得每对数之差的绝对值之和最小。输出这个最小和。

    +

    1KN2×1051\le K\le N\le 2\times 10^5
    +1A1<A2<<AKN1\le A_1<A_2<\dots<A_K\le N

    +

    分析

    +

    首先,可以证明我们一定会将 NKN-K 个成双的数字进行自我组合。

    +
    +

    简要证明
    +采用 反证法。假设有两个 aa,我们将它们分别与 b,cb,c 组合。显然:

    +

    ab+acaa+bc|a-b|+|a-c| \ge |a-a|+|b-c| +

    +

    于是,将 a,aa,a 组合、b,cb,c 组合的方案一定不比原方案差。因此直接组合 a,aa,a,一定能得到最优解。

    +
    +

    由于 aa=0|a-a|=0,所以这部分可以直接忽略,将单个的数字,即 A1,,AKA_1,\dots,A_K 进行组合即可。

    +

    分两种情况讨论。

    +
      +
    1. +

      KK 为偶数:此时组合没有剩余。不难发现,相邻两两组合即为最优解,所以答案为:

      +

      ans=i=1k/2A2iA2i1\mathrm{ans}=\sum_{i=1}^{k/2} A_{2i}-A_{2i-1} +

      +

      直接计算即可。注意 AA 已排序,故无需取绝对值。

      +
    2. +
    3. +

      KK 为奇数:此时组合剩余一个。枚举此剩余的数,从 AA 中删去就转换成了偶数的情况。但是暴力计算的时间复杂度为 O(K2)\mathcal O(K^2),维护前缀后缀和即可优化到 O(K)\mathcal O(K)

      +
    4. +
    +

    综上,我们在 O(K)\mathcal O(K) 的时间内解决了此问题。

    +

    代码

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +inline void setmin(int& x, int y)
    +{
    +	if(y < x) x = y;
    +}
    +
    +int a[maxn], pre[maxn], suf[maxn];
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	for(int i=1; i<=k; i++)
    +		scanf("%d", a + i);
    +	if(!(k & 1))
    +	{
    +		int ans = 0;
    +		for(int i=1; i<=k; i+=2)
    +			ans += a[i + 1] - a[i];
    +		printf("%d\n", ans);
    +		return 0;
    +	}
    +	for(int i=1; i<k; i+=2)
    +		pre[i] = pre[i + 1] = pre[i - 1] + a[i + 1] - a[i];
    +	for(int i=k-1; i>0; i-=2)
    +		suf[i] = suf[i + 1] = suf[i + 2] + a[i + 1] - a[i];
    +	int ans = 1e9;
    +	for(int i=1; i<=k; i++)
    +	{
    +		int cur = i & 1? pre[i - 1] + suf[i + 1]
    +					: a[i + 1] - a[i - 1] + pre[i - 2] + suf[i + 2];
    +		setmin(ans, cur);
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +
    +

    D - Reindeer and Sleigh

    +

    题目大意

    +

    NN 个雪橇,编号为 1,2,,N1,2,\dots,N。拉动第 ii 个雪橇需要 RiR_i 只驯鹿。

    +

    给定 QQ 次询问,每次给定正整数 XX

    +
      +
    • XX 只驯鹿最多能拉动多少个雪橇?
    • +
    +

    注意:雪橇可以任选,每只驯鹿最多只能拉一个雪橇。

    +

    1N,Q2×1051\le N,Q\le 2\times 10^5
    +1Ri1091\le R_i\le 10^9
    +1X2×10141\le X\le 2\times 10^{14}

    +

    分析

    +

    首先,为了拉到最多的雪橇,我们考虑贪心的策略:从 RiR_i 最小的雪橇开始拉,从小到大直到驯鹿不够用为止。

    +

    因此我们先对 RiR_i 进行排序,很明显这不影响结果。此时令前缀和 Si=j=1iRjS_i=\sum_{j=1}^i R_j,则当 SiXS_i \le X 时,可以拉动前 ii 个雪橇。故只需找到最大的 ii 使得 SiXS_i\le X 即为所求。此时注意到前缀和已经有序,所以直接在 SS 上使用二分查找即可。

    +

    总时间复杂度为 O(NlogN)\mathcal O(N\log N)

    +

    代码

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 200005
    +using namespace std;
    +
    +using LL = long long;
    +LL s[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%lld", s + i);
    +	sort(s, s + n);
    +	for(int i=1; i<n; i++)
    +		s[i] += s[i - 1];
    +	while(q--)
    +	{
    +		LL x;
    +		scanf("%lld", &x);
    +		printf("%d\n", int(upper_bound(s, s + n, x) - s));
    +	}
    +	return 0;
    +}
    +
    +
    +

    E - Christmas Color Grid 1

    +

    题目大意

    +

    有一个 H×WH\times W 的网格,其中.代表红色#代表绿色

    +

    随机选一个红色方块,将其涂成绿色。将网格抽象成一张简单无向图,边连接相邻(上下左右)的绿色节点。
    +图中连通分量个数的期望值是多少?对 998244353998244353 取模。

    +

    1H,W10001\le H,W\le 1000

    +

    分析

    +

    暴力算法的时间复杂度是 O(H2W2)\mathcal O(H^2W^2),显然不满足要求。

    +

    考虑将一个红色方块涂成绿色绿色连通分量数的贡献。令它周围属于不同连通分量的绿色方块个数为 nn,则此次操作会将答案减去 n1n-1。这样,我们先预处理出连通分量,就可以 O(1)\mathcal O(1) 的计算答案。

    +

    此问题可以用 DFS、BFS 或并查集解决。示例代码使用并查集,时间复杂度约为 O(HW)\mathcal O(HW)(忽略小函数)。

    +

    代码

    +
    #include <cstdio>
    +#include <unordered_map>
    +#include <set>
    +#include <atcoder/modint>
    +#define maxn 1005
    +using namespace std;
    +
    +using modint = atcoder::modint998244353;
    +
    +int n, m, fa[maxn * maxn];
    +char s[maxn][maxn];
    +
    +int find(int x) { return fa[x] == x? fa[x]: fa[x] = find(fa[x]); }
    +inline int calc(int x, int y) { return x * m + y; }
    +inline int fc(int x, int y) { return find(calc(x, y)); }
    +inline void merge(int x, int y) { fa[find(x)] = find(y); }
    +
    +int main()
    +{
    +	scanf("%d%d", &n, &m);
    +	for(int i=0; i<n; i++)
    +		scanf("%s", s[i]);
    +	int k = n * m;
    +	for(int i=0; i<k; i++)
    +		fa[i] = i;
    +	for(int i=0; i<n; i++)
    +		for(int j=0; j<m; j++)
    +		{
    +			if(s[i][j] != '#') continue;
    +			if(i && s[i - 1][j] == '#') merge(calc(i, j), calc(i - 1, j));
    +			if(j && s[i][j - 1] == '#') merge(calc(i, j), calc(i, j - 1));
    +		}
    +	int cnt = 0, tot = 0;
    +	for(int i=0; i<n; i++)
    +		for(int j=0; j<m; j++)
    +			if(s[i][j] == '#' && fc(i, j) == calc(i, j))
    +				cnt ++;
    +	modint ans = 0;
    +	for(int i=0; i<n; i++)
    +		for(int j=0; j<m; j++)
    +			if(s[i][j] == '.')
    +			{
    +				set<int> S;
    +				if(i && s[i - 1][j] == '#') S.insert(fc(i - 1, j));
    +				if(s[i + 1][j] == '#') S.insert(fc(i + 1, j));
    +				if(j && s[i][j - 1] == '#') S.insert(fc(i, j - 1));
    +				if(s[i][j + 1] == '#') S.insert(fc(i, j + 1));
    +				int cur = cnt - (int)S.size() + 1;
    +				ans += cur, tot ++;
    +			}
    +	printf("%d\n", (ans / tot).val());
    +	return 0;
    +}
    +
    +
    +

    F - Christmas Present 2

    +

    题目大意

    +

    圣诞老人 Santa 要在平面直角坐标系中给孩子们送礼物啦!

    +

    他的家在 (SX,SY)(S_X,S_Y) 处。他要按照数字顺序给 NN 个孩子送出礼物。第 ii 个孩子的家在 (Xi,Yi)(X_i,Y_i) 处。

    +

    Santa 手上最多只能一次性拿 KK 个礼物。他想用最短的路程送完所有礼物,再回到自己家,求最短的总路程是多少?

    +

    1KN2×1051\le K\le N\le 2\times 10^5
    +109SX,SY,Xi,Yi109-10^9\le S_X,S_Y,X_i,Y_i \le 10^9
    +(SX,SY)(Xi,Yi)(S_X,S_Y)\ne (X_i,Y_i)
    +(Xi,Yi)(Xj,Yj) (ij)(X_i,Y_i)\ne (X_j,Y_j)\ (i\ne j)

    +

    分析

    +

    这里介绍我自己的独具特(chōu)色(xiàng)的解法,常规解法请参考官方题解

    +

    考虑 dp,令 fi,jf_{i,j} 表示走到第 ii 个房子并送完前 ii 个礼物时,手上剩余 jj 个礼品的最短路程。很显然,我们每次回家都一定拿满 KK 个礼品,则 j=k1j=k-1 一定是拿了礼品之后送出一个。故:

    +

    fi,j={d(i1,i)+fi1,j+1(j<k1)minfi1+d(i1,0)+d(0,i)(j=k1)f_{i,j}=\begin{cases} +d(i-1,i)+f_{i-1,j+1} & (j < k-1)\\ +\min f_{i-1}+d(i-1,0)+d(0,i) & (j=k-1) +\end{cases} +

    +

    其中 d(a,b)d(a,b) 表示房子 aabb 的路程。特别规定 00 号房子为 (SX,SY)(S_X,S_Y),即圣诞老人的住处。这样,答案即为 minfn+d(n,0)\min f_n+d(n,0)

    +

    直接计算的复杂度为 O(NK)\mathcal O(NK),时间和空间上都不能接受。

    +

    然而,仔细观察递推式可以发现,fif_i 这一行实际上就是由前一行 fi1f_{i-1} 删去第一个元素,再整体加 d(i1,i)d(i-1,i),并在最后添上 fi,k1f_{i,k-1} 得到的。

    +

    因此,我们可以用一个deque(双端队列)动态维护状态。对于整体加的操作,用一个变量维护整体的变化值即可。这样空间的问题就得到了解决。再进一步考虑,用一个multiset(可重集合,基于红黑树)或者二叉堆维护队列内元素,求 min\min 的操作时间就减小到了 O(logK)\mathcal O(\log K),可以接受。

    +

    于是,我们就成功地在 O(NlogK)\mathcal O(N\log K) 的时间和 O(N+K)\mathcal O(N+K) 的空间内解决了此问题。另外,我们还可以把deque同时充当单调队列,这样时间也优化到了 O(N+K)\mathcal O(N+K)。两种实现的示例代码都会给出。

    +

    代码

    +

    实现 1:deque + multiset

    +
    #include <cstdio>
    +#include <deque>
    +#include <set>
    +#define maxn 200005
    +using namespace std;
    +
    +using ld = long double;
    +const ld INF = 2e18l;
    +
    +int x[maxn], y[maxn];
    +
    +inline ld dis(int i, int j)
    +{
    +	return __builtin_hypotl(x[i] - x[j], y[i] - y[j]);
    +}
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<=n; i++)
    +		scanf("%d%d", x + i, y + i);
    +	deque<ld> f;
    +	multiset<ld> s;
    +	k --;
    +	for(int i=0; i<k; i++)
    +		f.push_back(INF), s.insert(INF);
    +	f.push_back(dis(0, 1)), s.insert(dis(0, 1));
    +	ld dt = 0;
    +	for(int i=2; i<=n; i++)
    +	{
    +		ld lt = *s.begin() + dis(i - 1, 0) + dis(0, i) + dt;
    +		s.erase(s.find(f.front())), f.pop_front();
    +		dt += dis(i - 1, i), lt -= dt;
    +		f.push_back(lt), s.insert(lt);
    +	}
    +	printf("%.15Lf\n", dt + *s.begin() + dis(n, 0));
    +	return 0;
    +}
    +
    +

    实现 2:单调队列

    +
    #include <cstdio>
    +#include <deque>
    +#define maxn 200005
    +using namespace std;
    +
    +int x[maxn], y[maxn];
    +
    +inline double dis(int i, int j)
    +{
    +	return __builtin_hypotl(x[i] - x[j], y[i] - y[j]);
    +}
    +
    +int main()
    +{
    +	int n, k;
    +	scanf("%d%d", &n, &k);
    +	for(int i=0; i<=n; i++)
    +		scanf("%d%d", x + i, y + i);
    +	deque<pair<double, int>> f;
    +	f.emplace_back(dis(0, 1), 1);
    +	double dt = 0;
    +	for(int i=2; i<=n; i++)
    +	{
    +		double lt = f.front().first + dis(i - 1, 0) + dis(0, i) + dt;
    +		if(f.front().second == i - k) f.pop_front();
    +		dt += dis(i - 1, i), lt -= dt;
    +		while(!f.empty() && f.back().first >= lt) f.pop_back();
    +		f.emplace_back(lt, i);
    +	}
    +	printf("%.15lf\n", dt + f.front().first + dis(n, 0));
    +	return 0;
    +}
    +
    +
    +

    G - Christmas Color Grid 2

    +

    题目大意

    +

    有一个 H×WH\times W 的网格,其中.代表红色#代表绿色

    +

    随机选一个绿色方块,将其涂成红色。将网格抽象成一张简单无向图,边连接相邻(上下左右)的绿色节点。
    +图中连通分量个数的期望值是多少?对 998244353998244353 取模。

    +

    1H,W10001\le H,W\le 1000

    +
    +

    E 与 G 的区别

    +
      +
    • E:将红色涂成绿色。求绿色连通块个数。
    • +
    • G:将绿色涂成红色。求绿色连通块个数。
    • +
    +
    +

    分析

    +

    注意到本题中红色方块没有任何实质意义,于是先将绿色方块建成一张图。此时题目变为:

    +
      +
    • 从简单无向图中随机选取一个结点,将此结点和与其相连的边全部删除。求连通分量个数的期望值,对 998244353998244353 取模。
    • +
    +

    根据“删去无向图中一个点导致连通分量个数改变”,很容易联想到割点。对求割点的 Tarjan 算法稍加改编,就可以计算删去一个点能把图分割成的连通块个数。详见代码。

    +

    代码

    +
    #include <cstdio>
    +#include <vector>
    +#include <atcoder/modint>
    +#define maxn 1000005
    +using namespace std;
    +
    +using modint = atcoder::modint998244353;
    +
    +inline void setmin(int& x, int y)
    +{
    +	if(y < x) x = y;
    +}
    +
    +vector<int> G[maxn];
    +
    +inline void add(int x, int y)
    +{
    +	G[x].push_back(y);
    +	G[y].push_back(x);
    +}
    +
    +int root, low[maxn], cnt, dfn[maxn], ncut[maxn];
    +
    +void tarjan(int v)
    +{
    +	low[v] = dfn[v] = ++cnt;
    +	ncut[v] = v != root;
    +	for(int u: G[v])
    +		if(!dfn[u])
    +		{
    +			tarjan(u);
    +			if(low[u] >= dfn[v])
    +				ncut[v] ++;
    +			setmin(low[v], low[u]);
    +		}
    +		else setmin(low[v], dfn[u]);
    +}
    +
    +char s[1005][1005];
    +int id[1005][1005];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=1; i<=n; i++)
    +		scanf("%s", s[i] + 1);
    +	int num = 0;
    +	for(int i=1; i<=n; i++)
    +		for(int j=1; j<=m; j++)
    +			if(s[i][j] == '#')
    +			{
    +				id[i][j] = ++num;
    +				if(s[i - 1][j] == '#') add(num, id[i - 1][j]);
    +				if(s[i][j - 1] == '#') add(num, id[i][j - 1]);
    +			}
    +	int cc = -1;
    +	for(int i=1; i<=num; i++)
    +		if(!dfn[i])
    +			tarjan(root = i), cc ++;
    +	modint ans = 0;
    +	for(int i=1; i<=num; i++)
    +		ans += cc + ncut[i];
    +	printf("%d\n", (ans / num).val());
    +	return 0;
    +}
    +
    +
    +

    后记

    +

    首先预祝大家圣诞节快乐 🎉!这场比赛从标题到题目设定,无不与圣诞节有关,AtCoder 官方算是精心准备了这场圣诞庆祝赛 💝。

    +

    遗憾的是我在比赛中先做了 A~E 和 G,F 题比赛结束后 51s 提交,AC。挺可惜的,难得 G 能做出来一次,差点 AK,结果差的就是不到一分钟 😂。希望下次能比得更好,也希望大家能再接再厉。加油!😚

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/about/index.html b/post/about/index.html new file mode 100644 index 00000000..01edbda1 --- /dev/null +++ b/post/about/index.html @@ -0,0 +1,376 @@ + + + + + +关于 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 关于 +

    + +
    +
    + 2020-01-01 · 1 min read +
    + +
    +

    所有文章同步发布于 CSDN,有疑问欢迎联系我!

    + +
    #define OK 200
    +int TryEverything() {
    +    tryTheFirstTime();
    +    string res;
    +    while(cin >> res && res != "success") {
    +        tryAgain();
    +    }
    +    return OK;
    +}
    +
    +

    站点更新日志

    +

    2022-12-16 改用 Rocky Custom 主题。
    +2024-01-13 更换 CDN,大幅提升国内访问速度。感谢 BootCDN渺软公益 CDN字节跳动静态资源公共库 提供技术支持。
    +2024-01-14 更新 KaTeX 到 0.11.1,修复部分符号显示问题。
    +2024-01-25 修复站点图片无法显示的问题,对部分博文进行格式优化。

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/accountbook-readme/index.html b/post/accountbook-readme/index.html new file mode 100644 index 00000000..61229594 --- /dev/null +++ b/post/accountbook-readme/index.html @@ -0,0 +1,467 @@ + + + + + +README - 账本 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + README - 账本 +

    + +
    +
    + 2022-06-28 · 3 min read +
    + + + + 账本 + + + + + 开源项目 + + +
    +

    https://github.com/GoodCoder666/AccountBook/blob/main/README.md
    +build PythonVersion

    +

    AccountBook

    +

    *For English-speaking users: This project is currently CHINESE ONLY. Translation work is ongoing. If you'd like to help us with that, please open an issue or a pull request, and I'll be in contact soon. Thank you for contributing!

    +

    基于PySide6(Qt for Python 6)的账本,界面简洁、功能强大,支持保存文件、快速查询、绘制图表等,是平时记账的不错选择。目前exe版本仅支持Windows系统,Linux/MacOS可通过源代码手动编译或直接运行。

    +

    开始使用

    +

    从打包版本运行(Windows 7及以上)

    +

    访问Release页面,这里提供的是独立exe文件,点击AccountBook.exe即可下载。

    +

    *文件由GitHub Actions完全在线自动打包发布,安全无毒,可放心使用。

    +

    这里没有提供安装包,因此如需长久使用,建议复制到常用软件的安装目录下(如C:/Program FilesD:/Software)新建空文件夹放进去,并创建快捷方式,以便使用时打开。

    +

    从源代码运行(全系统通用)

    +
      +
    1. +

      克隆存储库:

      +
      git clone https://github.com/GoodCoder666/AccountBook.git
      +cd AccountBook
      +
      +
    2. +
    3. +

      安装依赖项&运行主程序:

      +

      Windows:

      +
      > run
      +
      +

      Linux/MacOS:

      +
      $ pip install -r requirements.txt
      +$ cd src
      +$ python3 main.py
      +
      +
    4. +
    +

    使用如上任意一种方法运行程序后,您将看到如下界面:

    +emptyWindow +

    此时,就可以开始工作了。

    +

    开发计划

    +

    已完成:

    +
      +
    • +
        +
      • +
      • +
      • +
      • +
      +
    • +
    • +
    • +
        +
      • +
      • +
      +
    • +
    +

    待更新:

    +
      +
    • +
    • +
        +
      • +
      • +
      • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
        +
      • +
      • +
      • +
      +
    • +
    +

    屏幕截图

    +emptyWindow +filledWindow +dlgAdd +statistics +

    FAQs

    +
      +
    1. +

      Q: 搜索功能的搜索依据是什么?

      +

      A: 在每个事项中的日期、事项、金额、备注中全部匹配,即日期、事项、金额、备注中需有至少一项中包含关键字,后续会支持具体设置。功能实现代码(src/api.py,44-45行):

      +
      def query(data, key):
      +    return [record for record in data if any(key in x for x in record)]
      +
      +
    2. +
    3. +

      Q: 为什么点击了添加并正确输入数据,确定后软件表格内却不显示新事项?

      +

      A: 很可能因为您在搜索框中输入了关键字,但添加的事项不符合筛选条件,因此不会在表格内显示。

      +
    4. +
    +

    特别鸣谢

    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-bwop/index.html b/post/algonotes-bwop/index.html new file mode 100644 index 00000000..a06cc95b --- /dev/null +++ b/post/algonotes-bwop/index.html @@ -0,0 +1,1006 @@ + + + + + +【算法笔记】位运算详解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】位运算详解 +

    + +
    +
    + 2022-10-18 · 20 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 前言

    +

    突然想到位运算是个好东西,就来水一波文章了……

    +

    注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持!

    +

    本文中参考代码均使用C++编写。

    +

    废话不多说,下面步入正题。

    +
    +

    1. 基本运算

    +

    有一定基础的可以跳过该部分。

    +

    位运算的简要法则:
    +位运算法则-简要

    +

    详细解释:

    +

    1.1 取反

    +

    取反(~x)是最简单的位运算操作,只有一个参数xx。将参数上的每一位对应取反即可。例如:
    +~0011 = 1100
    +~1011 = 0100
    +性质:~(~x) = x

    +

    1.2 按位与

    +

    按位与(x & y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    xxyyx & y
    000000
    001100
    110000
    111111
    +

    例子:
    +0011 & 1100 = 0000
    +1010 & 1011 = 1010

    +

    性质:

    +
      +
    • 交换律:a & b = b & a
    • +
    • 结合律:a & b & c = a & (b & c)
    • +
    • 自与:a & a = a
    • +
    • 000 & a1 & a2 & a3 & ... = 0
    • +
    • \infty(全11):a & inf = a
    • +
    +

    1.3 按位或

    +

    按位与(x | y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    xxyyx | y
    000000
    001111
    110011
    111111
    +

    例子:
    +1100 | 0011 = 1111
    +1010 | 0001 = 1011

    +

    性质:

    +
      +
    • 交换律:a | b = b | a
    • +
    • 结合律:a | b | c = a | (b | c)
    • +
    • 自或:a | a = a
    • +
    • 00a | 0 = a
    • +
    • \infty(全11):a | inf = inf
    • +
    +

    1.4 异或

    +

    异或(xyx\oplus yx ^ y)有两个参数xxyy。对于xxyy中的每个对应位,参照下表输出到结果的对应位:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    xxyyxyx\oplus y
    000000
    001111
    110011
    111100
    +

    举例:
    +1000 ^ 1011 = 0011
    +0101 ^ 1010 = 1111

    +

    性质:

    +
      +
    • 交换律:ab=baa\oplus b=b\oplus a
    • +
    • 结合律:abc=a(bc)a\oplus b\oplus c=a\oplus(b\oplus c)
    • +
    • 自异或:aa=0a\oplus a=0
    • +
    • 异或00a0=aa\oplus 0=a
    • +
    • 多重异或:abb=a(bb)=a0=aa\oplus b\oplus b=a\oplus (b\oplus b)=a\oplus 0=a
    • +
    • 异或\infty(全11):a= a\oplus \infty=~~a
    • +
    • ab=ca\oplus b=c,则ac=ba\oplus c=b
    • +
    +

    1.5 位移

    +

    位移分为左移(<<)和右移(>>)。

    +
      +
    • a << b:将aa末尾添上bb00的结果。
    • +
    • a >> b:从aa末尾删掉bb位的结果。
    • +
    +

    性质:

    +
      +
    • (a << b) >> b = a
    • +
    • a << b =a×2b~=a\times 2^b
    • +
    • a >> b =a2b~=\lfloor\frac a {2^b}\rfloor
    • +
    +

    1.6 练习题

    +

    1.6.1 判断22的整数次幂

    +

    题意:给定整数NN,判断其是否为22的整数次幂。

    +

    1.6.2 洛谷 P1100 高低位交换

    +

    题意:给定一个3232位整数xx,在二进制下交换其前1616位与后1616位,输出最终的数。

    +

    答案为ans = (x >> 16) | (x << 16),这样解释:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    数值16161616
    xxAABB
    x >> 16161600AA
    x << 16BB161600
    ansBBAA
    +

    注意此处使用3232位无符号整数进行计算,这样x << 16会自然溢出,导致前1616位被丢弃,恰好满足要求。

    +

    参考程序:

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	unsigned int x;
    +	scanf("%u", &x);
    +	printf("%u\n", (x >> 16) | (x << 16));
    +	return 0;
    +}
    +
    +

    1.6.3 找出不同的数

    +

    给定一个序列A=(A1,A2,,A2N+1)A=(A_1,A_2,\dots,A_{2N+1}),其中有NN个数各出现22次,还有一个数正好出现11次。找到这个数。请尽可能优化程序的时间和空间复杂度。

    +

    - 时间O(N)\mathcal O(N)O(NlogN)\mathcal O(N\log N),空间O(N)\mathcal O(N)解法
    +简单统计每个数的出现次数,最后找到正好出现11次的数。

    +

    - 时间O(N)\mathcal O(N),空间O(1)\mathcal O(1)解法
    +考虑所有数的异或和S=A1A2A2N+1S=A_1\oplus A_2\oplus\dots\oplus A_{2N+1},则AA中所有出现两次的数抵消为00,剩下的即为唯一出现一次的数,所以直接输出SS即可。

    +

    参考程序:

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	n = (n << 1) + 1;
    +	int ans = 0;
    +	while(n--)
    +	{
    +		int x;
    +		scanf("%d", &x);
    +		ans ^= x;
    +	}
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    1.6.4 AtCoder Beginner Contest 261 E - Many Operations

    +

    解法:对于i=1,2,,Ni=1,2,\dots,N,记录操作1,2,,i1,2,\dots,i后每一位上的0011分别变成什么,可以在O(N)\mathcal O(N)的时间内用类似于前缀和的方法完成;最后用位运算快速模拟NN次连续操作即可,总时间复杂度为O(N)\mathcal O(N)

    +
    // https://atcoder.jp/contests/abc261/submissions/33495431
    +#include <cstdio>
    +using namespace std;
    +
    +int main()
    +{
    +	unsigned n, c, zero = 0, one = 0xffffffff;
    +	scanf("%d%d", &n, &c);
    +	while(n--)
    +	{
    +		int t, a;
    +		scanf("%d%d", &t, &a);
    +		if(t == 1) one &= a, zero &= a;
    +		else if(t == 2) one |= a, zero |= a;
    +		else one ^= a, zero ^= a;
    +		printf("%d\n", c = (c & one) | (~c & zero));
    +	}
    +	return 0;
    +}
    +
    +
    +

    2. 扩展概念&运算

    +

    2.1 lowbit

    +

    lowbit(x)即为二进制下xx的最低位,如lowbit(10010) = 10lowbit(1) = 1。严格来说00没有lowbit,部分情况下可视为lowbit(0) = 1。利用lowbit函数可实现树状数组等数据结构。

    +

    lowbit 计算方式

    +
      +
    1. 暴力计算
      +简单粗暴的按位直接计算,如下:
      int lowbit(int x)
      +{
      +	int res = 1;
      +	while(x && !(x & 1))
      +		x >>= 1, res <<= 1;
      +	return res;
      +}
      +
      +时间复杂度O(logX)\mathcal O(\log X)。缺点:速度慢,代码长,没有体现位运算的优势
    2. +
    3. x & -x
      +巧妙利用lowbit(x) = x & -x。感兴趣的读者可自行尝试证明。
      +时间复杂度O(1)\mathcal O(1)。相比(1)来说,代码更短,速度更快。
    4. +
    5. x & (x - 1)
      +注意:x & (x - 1)不是lowbit(x),而是x - lowbit(x)
      +这种方法常用于树状数组中,可提升x - lowbit(x)的计算速度。
    6. +
    +

    2.2 popcount

    +

    popcount(x)定义为xx在二进制下11的个数,如popcount(10101) = 3popcount(0) = 0

    +

    popcount 计算方式

    +
      +
    1. 暴力计算检查
      +还是最粗暴的算法,通过枚举每一位并检查是否为11达到目的,时间复杂度为O(logX)\mathcal O(\log X)
      int popcount(int x)
      +{
      +	int res = 0;
      +	while(x)
      +	{
      +		res += x & 1;
      +		x >>= 1;
      +	}
      +	return res;
      +}
      +
      +
    2. +
    3. lowbit 优化
      +时间复杂度还是O(logX)\mathcal O(\log X),不过平均用时会比(1)快2~3倍左右。
      int popcount(int x)
      +{
      +	int res = 0;
      +	for(; x; x&=x-1) res ++;
      +	return res;
      +}
      +
      +
    4. +
    5. builtin 函数(最快)
      +详见3.1 __builtin_popcount/__builtin_popcountll
    6. +
    +
    +

    3. builtin 位运算函数

    +

    注意:后面带ll的传入long long类型,不带ll接受int类型。本部分内容按常用程度递减排序。
    +参考:https://blog.csdn.net/zeekliu/article/details/124848210

    +

    3.1 __builtin_popcount/__builtin_popcountll

    +

    返回参数在二进制下11的个数。

    +

    3.2 __builtin_ctz / __buitlin_ctzll

    +

    返回参数在二进制下末尾00的个数。

    +

    3.3 __buitlin_clz / __buitlin_clzll

    +

    返回参数在二进制下前导00的个数。

    +

    3.4 __builtin_ffs / __buitlin_ffsll

    +

    返回参数在二进制下最后一个1在第几位(从后往前)。
    +注意:一般来说,builtin_ffs(x) = __builtin_ctz(x) + 1。当x=0x=0时,builtin_ffs(x) = 0

    +

    3.5 __builtin_parity / __builtin_parityll

    +

    返回参数在二进制下11的个数的奇偶性(偶:0,奇:1),即__builtin_parity(x) = __builtin_popcount(x) % 2
    +P.S. 这函数,不知是哪位神仙想出来的……

    +
    +

    4. 位运算的应用

    +

    4.1 子集表示法

    +

    对于集合{0,1,,N1}\{0,1,\dots,N-1\},我们使用一个NN位的二进制整数SS来表示它的一个子集。从右往左第ii位表示子集是否包含了ii。容易发现,对于任意子集SSS[0,2N1]S\in [0,2^N-1],且对于任意S[0,2N1]S\in [0,2^N-1]SS都是{0,1,,N1}\{0,1,\dots,N-1\}的一个有效子集。下面我们来讲这种子集表示的具体操作。

    +

    4.1.1 子集操作

    +

    子集的操作如下(规定NN为集合元素个数):

    +
      +
    • 空集:00
    • +
    • 满集:2N12^N-1NN11
    • +
    • 集合SS的元素个数:__builtin_popcount(S)__builtin_popcountll(S)
    • +
    • 集合SS是否包含iiS >> i & 1
    • +
    • ii加入SS(操作前SS是否包含ii不影响操作结果):S |= 1 << i
    • +
    • iiSS中删除(操作前SS必须包含ii):S ^= 1 << i
    • +
    • iiSS中删除(操作前SS是否包含ii不影响操作结果):S &= ~(1 << i)
    • +
    • SSTT的交集(SSTT都包含的集合):S & T
    • +
    • SSTT的并集(SSTT中有任意一个包含的集合):S | T
    • +
    • SSTT的差集(SSTT中恰好有一个包含的集合):S ^ T
    • +
    +

    4.1.2 子集枚举

    +

    讲了这么多,也该到子集的实际应用了吧。下面我们来看子集最初步的应用——子集枚举。

    +

    - 必会:枚举NN个元素的所有子集
    +这个很简单,直接枚举S[0,2N1]S\in [0,2^N-1]即可。代码如下:

    +
    #include <cstdio>
    +using namespace std;
    +
    +const int N = 3;
    +
    +int main()
    +{
    +	printf("N = %d\n", N);
    +	for(int s=0, full=(1<<N)-1; s<=full; s++)
    +	{
    +		printf("Subset %d:", s + 1);
    +		for(int i=0; i<N; i++)
    +			if(s >> i & 1)
    +				printf(" %d", i);
    +		putchar('\n');
    +	}
    +	return 0;
    +}
    +
    +

    - 必会:枚举子集的子集
    +如果我们想枚举{0,1,,N1}\{0,1,\dots,N-1\}的子集的子集,怎么办?这是一个经典套路,常用于状压DP,写法如下:

    +
    for(int S=0; S<(1<<N); S++) // 枚举子集S
    +	for(int T=S; T; T=(T-1)&S) // 枚举子集的子集T
    +	{
    +		// Do something...
    +		printf("%d\n", t);
    +	}
    +
    +

    请注意:这个算法的时间复杂度为O(3N)\mathcal O(3^N),不是O(4N)\mathcal O(4^N),使用此算法时请准确估算时间复杂度。

    +

    - 扩展:枚举NN个元素中大小为KK的子集
    +首先很容易想到先枚举所有{0,1,,N1}\{0,1,\dots,N-1\}的所有子集,再依次检查大小是否为KK。代码如下:

    +
    for(int s=0; s<(1<<n); s++)
    +{
    +	int cnt = __builtin_popcount(s);
    +	if(cnt != K) continue;
    +	// Do something...
    +}
    +
    +

    这种做法虽然正确,也很易懂,但可惜效率太低,2N2^Npopcount操作浪费了很多时间。我们考虑优化。《挑战程序设计竞赛》上给出了一种算法,如下:

    +
    int S = (1 << k) - 1;
    +while(S < 1 << n)
    +{
    +	// Do something...
    +	printf("%d\n", S);
    +	// 移到下一个合法子集
    +	int x = S & -S, y = S + x;
    +	S = ((S & ~y) / x >> 1) | y;
    +}
    +
    +

    这样可保证每次枚举到的都是大小为KK的子集,可以大大提高算法效率。

    +

    4.1.3 扩展:std::bitset

    +

    bitset,顾名思义,即为用位运算操作的集合。
    +对于元素个数N[1,64]N\in [1,64],集合{0,1,,N1}\{0,1,\dots,N-1\}的任意子集都可以用一个32326464位整数表示出来,操作时间复杂度为O(1)\mathcal O(1)。那么对于N>64N>64,怎么办?我们可以用多个32326464位无符号整数拼凑为一个NN位的bitset,容易发现其操作的时间复杂度为O(Nw)\mathcal O(\frac Nw)NN位的二进制数可用Nw\lceil\frac Nw\rceilww位无符号整数拼凑而成),其中ww一般为32326464

    +

    C++的Standard Template LibrarySTL)为我们提供了<bitset>头文件,用于bitset的定义。

    +

    用法如下:
    +bitset

    +

    用法示例:

    +
    #include <cstdio>
    +#include <bitset> // 头文件
    +using namespace std;
    +
    +int main()
    +{
    +	const int N = 500;
    +	bitset<N> S; // 定义大小为N的bitset S,初始为全0
    +	S.set(1);    // 将S的第1位设为1
    +	S[0] = 1;    // 将S的第0位设为1,注意bitset可使用下标访问和赋值
    +	S.reset(1);  // 将S的第1位设为0
    +	printf("S[1]: %d\n", (int)S[1]); // 输出S第2位上的值
    +	printf("Count: %d\n", (int)S.count()); // S的popcount(二进制下1的个数)
    +	printf("Size: %d\n", (int)S.size()); // S的二进制位数(N)
    +	printf("None? %d\n", (int)S.none()); // S是否为空?
    +	printf("Any?  %d\n", (int)S.any());  // S是否有1?
    +	bitset<N> T; // 定义一个新的bitset -- T
    +	T.set(); // T置为全1
    +	S.set(2), T.reset(2);
    +	printf("Intersection: %d\n", (int)(S & T).count()); // 交集
    +	printf("Union: %d\n", (int)(S | T).count()); // 并集
    +	printf("Difference: %d\n", (int)(S ^ T).count()); // 差集
    +	return 0;
    +}
    +
    +
    习题:AtCoder Beginner Contest 258 G - Triangle
    +

    题意和解法见https://blog.csdn.net/write_1m_lines/article/details/125582361#t15

    +

    4.2 深度优先搜索(DFS)的位运算优化

    +

    本算法其实还是二进制表示子集的一种优化,不过内容较多,所以单独放了出来。

    +

    考虑经典的八皇后问题

    +
    +

    有一个8×88\times 8的国际象棋棋盘,要在其中摆88个皇后,求有多少种不同的摆法,使得任意两个皇后之间都没有互相攻击。
    +注:皇后的攻击范围是一个“米”字,如下图所示:
    +皇后攻击范围

    +
    +

    八皇后问题很容易求解,用一个简单的回溯就可以了。
    +考虑NN皇后问题,即:

    +
    +

    有一个N×NN\times N的国际象棋棋盘,要在其中摆NN个皇后,求有多少种不同的摆法,使得任意两个皇后之间都没有互相攻击。

    +
    +

    此时,还是先用标准的「回溯」算法解决问题:

    +
    #include <cstdio>
    +#define maxn 20
    +using namespace std;
    +
    +bool row[maxn], diag_left[maxn << 1], diag_right[maxn << 1];
    +int ans, n;
    +
    +void dfs(int i)
    +{
    +	if(i == n)
    +	{
    +		ans ++;
    +		return;
    +	}
    +	for(int j=0; j<n; j++)
    +		if(!row[j] && !diag_left[i + j] && !diag_right[i - j + n])
    +		{
    +			row[j] = diag_left[i + j] = diag_right[i - j + n] = true;
    +			dfs(i + 1);
    +			row[j] = diag_left[i + j] = diag_right[i - j + n] = false;
    +		}
    +}
    +
    +int main()
    +{
    +	scanf("%d", &n);
    +	ans = 0;
    +	dfs(0);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    代码很移动,也不是重点,这里就不详细解释了。对于N=13N=13,搜索时间约为243ms243\mathrm{ms}N=14N=141.31s1.31\mathrm sN=15N=158.14s8.14\mathrm sN=16N=16…… 53.4s53.4\mathrm s

    +

    明显,这样的算法效率太低,我们来考虑使用位运算优化。
    +首先,我们把上面程序里的rowdiag_leftdiag_right换成一个int整数,赋值、取值全部改用位运算。但这样对整体的时间优化还是不大,我们要充分发挥位运算的优势——“百发百中”,即利用lowbit算法,确保每次枚举到的都是目前一步可放置的位置,减少不必要的判断。此时,我们改变diag_leftdiag_right的含义,使diag_left表示左下-右上的45°45\degree对角线上当前一步可放置的皇后位置集合,diag_right同理。见代码:

    +
    #include <cstdio>
    +using namespace std;
    +
    +int ans, mx;
    +
    +void dfs(int row, int diag_left, int diag_right)
    +{
    +	if(row == mx)
    +	{
    +		ans ++;
    +		return;
    +	}
    +	int a = mx & ~(row | diag_left | diag_right);
    +	while(a)
    +	{
    +		int p = a & -a; a ^= p;
    +		dfs(row | p, (diag_left | p) >> 1, (diag_right | p) << 1);
    +	}
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	ans = 0;
    +	mx = (1 << n) - 1;
    +	dfs(0, 0, 0);
    +	printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    此时,计算1616皇后只需6.23s6.23\mathrm s
    +习题:洛谷 P1092 [NOIP2004 提高组] 虫食算

    +

    附:N皇后问题的两种解法耗时对比

    +

    本测试中,两种算法耗时均为在Intel i7-12700H CPU上55次程序运行的最快速度。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NN无优化位运算优化速度提升
    1313253ms253\mathrm{ms}66ms66\mathrm{ms}2.83x2.83\text x
    14141.31s1.31\mathrm s179ms179\mathrm{ms}6.32x6.32\text x
    15158.14s8.14\mathrm s955ms955\mathrm{ms}7.52x7.52\text x
    161653.4s53.4\mathrm s6.23s6.23\mathrm s7.57x7.57\text x
    +

    4.3 其他应用

    +

    4.3.1 两数交换

    +
    void swap(int& a, int& b)
    +{
    +	a ^= b ^= a ^= b;
    +}
    +
    +

    位运算交换法扩展:超快GCD

    +
    inline int gcd(int a, int b)
    +{
    +	if(b) while(b ^= a ^= b ^= a %= b);
    +	return a;
    +}
    +
    +

    4.3.2 两数平均数(防溢出)

    +
    inline int average1(int x, int y)
    +{
    +	return (x >> 1) + (y >> 1) + (x & y & 1);
    +}
    +
    +inline int average2(int x, int y)
    +{
    +	return (x & y) + ((x ^ y) >> 1);
    +}
    +
    +

    4.3.3 判断一个数是否为22的整数次幂

    +
    inline bool ispowof2(int x)
    +{
    +	return x > 0 && !(x & x - 1);
    +}
    +
    +
    +

    5. 总结

    +

    本文详细讲解了位运算的使用和扩展。

    +
    +

    创作不易,各位如果觉得好的话就请给个三连,感谢大家的支持!

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-dijkstra/index.html b/post/algonotes-dijkstra/index.html new file mode 100644 index 00000000..e596a2bf --- /dev/null +++ b/post/algonotes-dijkstra/index.html @@ -0,0 +1,576 @@ + + + + + +【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化) - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化) +

    + +
    +
    + 2022-08-13 · 9 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 前言

    +

    Dijkstra算法可在O(mlogm)\mathcal O(m\log m)O(mlogn)\mathcal O(m\log n)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算法的原理、实现,以及常用的两种优化。

    +

    另外,Dijkstra算法也不要乱用,比如说多源的最短路,用Dijkstra求解的复杂度只有O(nmlogm)\mathcal O(nm\log m),但太麻烦,如果数据范围允许,直接用Floyd就能在O(n3)\mathcal O(n^3)的时间内完成任务。

    +

    废话不多说,下面来看Dijkstra算法的流程。

    +

    1. 流程

    +

    将结点分成两个集合:已确定最短路长度的点集(记为SS集合)的和未确定最短路长度的点集(记为TT集合)。一开始所有的点都属于TT集合。

    +

    dvd_v表示顶点vv到起始点的距离、ss表示起始点。
    +初始化ds=0d_s=0,其他点的dd均为++\infin

    +

    然后重复这些操作:

    +
      +
    1. TT集合中,选取一个最短路长度最小的结点vv,移到SS集合中。
    2. +
    3. 对于与vv相邻的每个点uu,执行松弛操作:dis[u] = min(dis[u], dis[v] + G[v][u])
    4. +
    +

    直到TT集合为空,算法结束。下面来看最简单的实现。

    +

    2. 实现

    +

    本算法的代码可以在CF20C/洛谷链接提交。后面提供的参考代码的输入输出格式都是基于这道题的。数据范围:n,m105,wi106n,m\le 10^5,w_i\le 10^6

    +

    在编写代码之前,我们还要考虑一个问题:如何输出最短路径?
    +定义一个数组par\mathrm{par}par[i]\mathrm{par}[i]表示最短路径上在点ii前面的点。初始时,par[s]=1\mathrm{par}[s]=-1,表示前面没有点。

    +

    vuv\to u这条边上更新dis[u] = dis[v] + G[v][u]时,同时更新par[u] = v,最后输出时顺着par[v]的路径往下逆序输出到达的点即可。

    +

    2.1 朴素实现(无优化)

    +

    这种实现完全按照算法流程,时间复杂度为O(n2)\mathcal O(n^2),无法通过例题。下面给出代码。

    +
    #include <cstdio>
    +#include <cstring>
    +#include <vector>
    +#define maxn 100005
    +using namespace std;
    +
    +vector<pair<int, int>> G[maxn];
    +
    +long long dis[maxn];
    +int par[maxn];
    +bool vis[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v, c;
    +		scanf("%d%d%d", &u, &v, &c);
    +		G[--u].emplace_back(--v, c);
    +		G[v].emplace_back(u, c);
    +	}
    +	// Dijkstra 算法流程
    +	// 初始化
    +	memset(dis, 0x3f, sizeof dis);
    +	memset(vis, 0, sizeof vis);
    +	dis[0] = 0LL, par[0] = -1; // 起点的距离为0
    +	while(true)
    +	{
    +		int v = n; // 不存在的虚拟结点,距离为+INF,方便判断
    +		for(int i=0; i<n; i++)
    +			if(!vis[i] && dis[i] < dis[v])
    +				v = i;
    +		if(v >= n - 1) break; // 找不到或到达终点,退出
    +		vis[v] = true; // 标记访问过
    +		for(auto [u, d]: G[v])
    +			if(dis[v] + d < dis[u]) // 是否有更优路径?
    +			{
    +				dis[u] = dis[v] + d; // 更新距离
    +				par[u] = v; // 更新路径
    +			}
    +	}
    +	if(dis[n - 1] == dis[n]) // 没有找到解(图不连通)
    +	{
    +		puts("-1");
    +		return 0;
    +	}
    +	vector<int> path; // 存储路径,注意要倒序输出
    +	int v = n - 1; // 从终点向前获取最优路径
    +	while(v != -1)
    +	{
    +		path.push_back(v); // 加入路径
    +		v = par[v]; // 向前回溯
    +	}
    +	for(int i=path.size()-1; i>=0; i--)
    +		printf("%d ", path[i] + 1); // 输出
    +	return 0;
    +}
    +
    +

    评测结果:
    +TLE

    +

    2.2 优先队列优化

    +

    优先队列,又称二叉堆,是常用的一种数据结构。可以执行下列操作(nn为优先队列队列中的元素个数):

    +
      +
    • 弹出最小/最大的元素,时间O(logn)\mathcal O(\log n)
    • +
    • 添加新元素,时间O(logn)\mathcal O(\log n)
    • +
    +

    利用这些特点,我们可以在O(mlogm)\mathcal O(m\log m)的时间内完成一轮Dijkstra。其细节为:

    +
      +
    • 初始时,仅将起始点和距离(s,0)(s,0)放入队列;
    • +
    • 当队列不为空时,执行: +
        +
      • 弹出距离最小的顶点和距离(v,d)(v,d)如果距离ddis[v]d\ne dis[v],则说明已经找到了其他更短路径,舍弃这条路
      • +
      • 否则,依次更新每条邻边vuv\to u,如果距离比原来的更短,则不仅要更新dis\mathrm{dis}par\mathrm{par},还要把(u,dis[u])(u,\mathrm{dis}[u])放入队列。
      • +
      +
    • +
    +

    实现代码:

    +
    #include <cstdio>
    +#include <queue>
    +#define maxn 100005
    +#define INF 9223372036854775807LL
    +using namespace std;
    +
    +using LL = long long;
    +using pli = pair<LL, int>;
    +
    +vector<pair<int, int>> G[maxn];
    +LL dis[maxn];
    +int par[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v, c;
    +		scanf("%d%d%d", &u, &v, &c);
    +		G[--u].emplace_back(--v, c);
    +		G[v].emplace_back(u, c);
    +	}
    +	for(int i=1; i<n; i++) dis[i] = INF;
    +	par[0] = -1;
    +	priority_queue<pli, vector<pli>, greater<pli>> q;
    +	q.emplace(0LL, 0);
    +	while(!q.empty())
    +	{
    +		auto [d, v] = q.top(); q.pop();
    +		if(dis[v] == d)
    +			for(auto [u, w]: G[v])
    +				if(d + w < dis[u])
    +					par[u] = v,
    +					q.emplace(dis[u] = d + w, u);
    +	}
    +	if(dis[n - 1] == INF) { puts("-1"); return 0; }
    +	vector<int> path;
    +	int v = n - 1;
    +	while(v != -1)
    +	{
    +		path.push_back(v);
    +		v = par[v];
    +	}
    +	for(int i=path.size()-1; i>=0; i--)
    +		printf("%d ", ++path[i]);
    +	return 0;
    +}
    +
    +

    时间复杂度为O(mlogm)\mathcal O(m\log m)可以通过此题。运行时间:93ms93\text{ms}

    +

    2.3 set优化

    +

    set又称集合,与优先队列相似,支持添加、删除,另外还可以删除任意元素,时间O(logn)\mathcal O(\log n)。要发挥出set的优势,就要在维护时删掉多余的顶点-距离对,防止不必要的dis[v] == d这种判断。

    +

    此时,集合中的元素个数永远不会超过NN,因此总时间复杂度为O(mlogn)\mathcal O(m\log n)
    +在mnm\ge n,即边数大于顶点数时,这种方法优于priority_queue。不过,一般使用Dijkstra算法的题目中都是mnm\le n,所以set的优化不常用,但下面还是给出代码。

    +
    #include <cstdio>
    +#include <vector>
    +#include <set>
    +#define maxn 100005
    +#define INF 9223372036854775807LL
    +using namespace std;
    +
    +using LL = long long;
    +using pli = pair<LL, int>;
    +
    +vector<pair<int, int>> G[maxn];
    +LL dis[maxn];
    +int par[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v, c;
    +		scanf("%d%d%d", &u, &v, &c);
    +		G[--u].emplace_back(--v, c);
    +		G[v].emplace_back(u, c);
    +	}
    +	for(int i=1; i<n; i++) dis[i] = INF;
    +	par[0] = -1;
    +	set<pli> s;
    +	s.emplace(0LL, 0);
    +	while(!s.empty())
    +	{
    +		auto it = s.begin(); s.erase(it);
    +		auto [d, v] = *it;
    +		for(auto [u, w]: G[v])
    +			if(d + w < dis[u])
    +			{
    +				par[u] = v;
    +				if(dis[u] != INF)
    +					s.erase(pli(dis[u], u));
    +				s.emplace(dis[u] = d + w, u);
    +			}
    +	}
    +	if(dis[n - 1] == INF) { puts("-1"); return 0; }
    +	vector<int> path;
    +	int v = n - 1;
    +	while(v != -1)
    +	{
    +		path.push_back(v);
    +		v = par[v];
    +	}
    +	for(int i=path.size()-1; i>=0; i--)
    +		printf("%d ", ++path[i]);
    +	return 0;
    +}
    +
    +

    AC,运行时间:78ms78\text{ms}

    +

    3. 后记

    +

    总结一下Dijkstra算法的实现方式:

    +
      +
    • 暴力(O(n2)\mathcal O(n^2),TLE 😭)
    • +
    • 优先队列(O(mlogm)\mathcal O(m\log m)93ms93\text{ms} 😐)
    • +
    • 集合/set(O(mlogn)\mathcal O(m\log n)78ms78\text{ms} 😃)
    • +
    +
    if(hasSanLian()) cout << "Thank you!";
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-fenwick-tree/index.html b/post/algonotes-fenwick-tree/index.html new file mode 100644 index 00000000..c8164086 --- /dev/null +++ b/post/algonotes-fenwick-tree/index.html @@ -0,0 +1,649 @@ + + + + + +【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree +

    + +
    +
    + 2022-08-20 · 13 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    前言

    +

    树状数组,即树形存储的数组,又称Binary Indexed TreeFenwick Tree
    +抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「 树」没什么关系:

    +
    +

    有一个序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),在不超过O(logN)\mathcal O(\log N)的时间复杂度内完成下列操作:
    + \to~[L,R][L,R]区间内所有数之和。
    + \to~指定一个元素AxA_x,将其加上kk

    +
    +

    如果想要使求和操作尽可能快,很容易想到前缀和,这样求和操作只要O(1)\mathcal O(1)的时间,但更新操作的时间复杂度就升至O(N)\mathcal O(N),无法满足题目要求;反之,若直接暴力维护AA中所有元素的值,则虽然更新操作只需要O(1)\mathcal O(1),但求和操作的时间又变成了O(N)\mathcal O(N),还是满足不了要求。那有没有一种算法,综合了两种方式的优势,达到题目时间要求呢?

    +

    肯定有,那就是今天说的——树状数组。

    +

    基本算法

    +
    +

    洛谷 P3374【模板】树状数组 1
    +同“前言”中的部分,1n,m1051\le n,m\le 10^5,其中mm为操作总次数。

    +
    +

    由于n,m105n,m\le 10^5,所以O(nm)\mathcal O(nm)的暴力解法肯定行不通,需要使用O(MlogN)\mathcal O(M\log N)的树状数组。其存储结构大致上是这样的:
    +树状数组结构

    +

    是不是已经有些明白了?这里我们我们把BB当作树状数组的内部存储,则据图可知:

    +
      +
    • B1=A1B_1=A_1
    • +
    • B2=A1+A2B_2=A_1+A_2
    • +
    • B3=A3B_3=A_3
    • +
    • B4=A1+A2+A3+A4B_4=A_1+A_2+A_3+A_4
    • +
    • B5=A5B_5=A_5
    • +
    • B6=A5+A6B_6=A_5+A_6
    • +
    • B7=A7B_7=A_7
    • +
    • B8=A1+A2+A3+A4+A5+A6+A7+A8B_8=A_1+A_2+A_3+A_4+A_5+A_6+A_7+A_8
    • +
    • ..
    • +
    +

    可以看出,Bi=Ai2k+1+Ai2k+2++AiB_i=A_{i-2^k+1}+A_{i-2^k+2}+\dots+A_i,其中kkii在二进制下末尾00的的个数。换句话说,2k2^k就是ii在二进制中的的lowbit

    +
    +

    关于lowbit函数
    + \to~lowbit的定义:

    +
      +
    • lowbit(0)\mathrm{lowbit}(0) 无意义。
    • +
    • 对于任意x>0x > 0lowbit(x)=2k\mathrm{lowbit}(x)=2^k,其中kkxx在二进制下末尾00的的个数。
    • +
    +

     \to~举例:lowbit(10010)=10\mathrm{lowbit}(10010)=10lowbit(10000)=10000\mathrm{lowbit}(10000)=10000
    + \to~C/C++实现:

    +
    inline int lowbit(int x) {
    +    return x & -x;
    +}
    +
    +

    或宏定义形式:

    +
    #define lowbit(x) (x) & -(x)
    +
    +
    +

    根据lowbit函数,上述公式可以写作:

    +

    l:=ilowbit(i)+1r:=iBi=j=lrAjl:=i-\mathrm{lowbit}(i)+1\\ +r:=i\\ +B_i=\sum_{j=l}^{r} A_j +

    +

    按照这样,就可以在O(logn)\mathcal O(\log n)的时间复杂度内求[0,x][0,x]中整数之和(prefixSum(x))或将AxA_x加上kkupdate(x, k))。
    +对于[L,R][L,R]的区间之和,可以按照segmentSum(l, r) = prefixSum(r) - prefixSum(l - 1)的方式进行计算。详见代码:

    +
    #include <cstdio>
    +using namespace std;
    +
    +template <typename value_type>
    +class fenwick_tree {
    +private:
    +	const int n;
    +	value_type* a;
    +	inline int lowbit(int x) { return x & -x; }
    +public:
    +	inline fenwick_tree(int m): n(m) {
    +		a = new value_type[n + 1];
    +		for(int i=0; i<=n; i++)
    +			a[i] = 0;
    +	}
    +	inline ~fenwick_tree() { delete[] a; }
    +	inline value_type prefixSum(int i) {
    +		value_type res = 0;
    +		for(; i; i-=lowbit(i)) res += a[i];
    +		return res;
    +	}
    +	inline value_type segmentSum(int l, int r) {
    +		return prefixSum(r) - prefixSum(l - 1);
    +	}
    +	inline void update(int i, const value_type& d) {
    +		for(; i<=n; i+=lowbit(i))
    +			a[i] += d;
    +	}
    +};
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	fenwick_tree<int> bit(n);
    +	for(int i=1; i<=n; i++)
    +	{
    +		int a;
    +		scanf("%d", &a);
    +		bit.update(i, a);
    +	}
    +	while(m--)
    +	{
    +		int op, x, y;
    +		scanf("%d%d%d", &op, &x, &y);
    +		if(op == 1) bit.update(x, y);
    +		else printf("%d\n", bit.segmentSum(x, y));
    +	}
    +	return 0;
    +}
    +
    +

    洛谷 P3374上提交耗时仅572ms572\mathrm{ms},同题用同样为O(logN)\mathcal O(\log N)线段树耗时约2.5s2.5\mathrm{s},可见相比于线段树算法,使用树状数组不仅代码量小、容易实现,还有运行速度快等等优势。

    +

    基础算法到此为止,下面来看一些经典的扩展应用。

    +

    扩展应用

    +

    知识补充:离散化
    +对于序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),我们将AA中的每个数都按原先的映射到一个[1,N][1,N]的范围内,这个过程被称为离散化。一般来说,离散化时同样的元素映射到同样的值,不同的元素映射到不同的值,且满足原先的大小关系。换句话说,令原先的序列为(A1,,AN)(A_1,\dots,A_N),离散化后的序列为(B1,,BN)(B_1,\dots,B_N),则满足如下条件:

    +
      +
    • 1BiN1\le B_i\le N1iN1\le i\le N
    • +
    • iji \ne j,且Ai<AjA_i<A_j,则Bi<BjB_i<B_j
    • +
    • iji \ne j,且Ai=AjA_i=A_j,则Bi=BjB_i=B_j
    • +
    • iji \ne j,且Ai>AjA_i>A_j,则Bi>BjB_i>B_j
    • +
    +

    1. 求逆序对

    +

    逆序对问题是经典的序列问题。众所周知,这类问题可以用归并排序在O(NlogN)\mathcal O(N\log N)的时间内解决。不过,既然今天讲的是树状数组,那就不能用归并排序,就主要来说一说树状数组的解法。

    +
    +

    洛谷 P1908 逆序对
    +给定一个整数序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N),求其中逆序对的个数。
    +一个整数对(i,j)(i,j)被称为“逆序对”,当且仅当如下条件满足:
    +1i<jN\to1\le i<j\le N
    +Ai>Aj\to A_i>A_j
    +数据范围:N105,Ai109N\le 10^5,A_i\le 10^9

    +
    +

    由于N105N\le 10^5,所以暴力的O(N2)\mathcal O(N^2)做法肯定不行。
    +我们考虑使用树状数组,先将数组离散化成[1,N][1,N]之间的数,记离散化后的序列为B=(B1,,BN)B=(B_1,\dots,B_N)。我们按((总数对数量)()-(非逆序对数量)=()=(逆序对数量))的公式计算,其中总数对的数量为1+2++N1=N(N1)21+2+\dots+N-1=\frac {N(N-1)}2用树状数组维护每个数字的出现次数,则非逆序对的数量可以在遍历BB中的每个元素时动态计算。详见代码。

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 500005
    +using namespace std;
    +
    +inline int read() {
    +	static char c;
    +	while((c = getchar()) < '0' && c > '9');
    +	int res = c ^ 48;
    +	while((c = getchar()) >= '0' && c <= '9')
    +		res = (res << 3) + (res << 1) + (c ^ 48);
    +	return res;
    +}
    +
    +template <typename value_type>
    +class fenwick_tree {
    +private:
    +	const int n;
    +	value_type* a;
    +	inline int lowbit(int x) { return x & -x; }
    +public:
    +	inline fenwick_tree(int m): n(m) {
    +		a = new value_type[n + 1];
    +		for(int i=0; i<=n; i++)
    +			a[i] = 0;
    +	}
    +	inline ~fenwick_tree() { delete[] a; }
    +	inline value_type prefixSum(int i) {
    +		value_type res = 0;
    +		for(++i; i; i-=lowbit(i)) res += a[i];
    +		return res;
    +	}
    +	inline void update(int i, const value_type& d) {
    +		for(++i; i<=n; i+=lowbit(i))
    +			a[i] += d;
    +	}
    +};
    +
    +int a[maxn], rk[maxn];
    +
    +int main()
    +{
    +	int n = read();
    +	for(int i=0; i<n; i++)
    +		a[rk[i] = i] = read();
    +	stable_sort(rk, rk + n, [&](int x, int y) -> bool {
    +		return a[x] < a[y];
    +	}); // 因为可能会有重复的数字,所以必须使用稳定的stable_sort排序,用sort只有40分
    +	fenwick_tree<int> bit(n); // 初始化树状数组,离散化之后大小为n就行
    +	long long ans = n * (n - 1LL) >> 1LL; // 总数对个数
    +	for(int i=0; i<n; i++)
    +	{
    +		ans -= bit.prefixSum(rk[i]); // 减去非逆序数对,即prefixSum(b[i])
    +		bit.update(rk[i], 1); // 动态更新当前元素出现次数
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +

    习题:CF1676H2 Maximum Crossings (Hard Version)

    +

    2. 区间更新

    +

    用过线段树的都知道,树状数组最大的缺点就是无法直接实现区间更新。不过,在一些特殊情况[1]下,我们可以通过差分+离散化间接实现区间的更新。先来看洛谷上的模板:

    +
    +

    P3368【模板】树状数组 2
    +已知一个长为NN的数列,你需要进行下面两种操作:

    +
      +
    • 1 x y k:将[x,y][x,y]区间内的每个数都加上kk
    • +
    • 2 x:求第xx个数的值。
    • +
    +
    +

    运用差分的思想,用树状数组维护AA的差分数组BBBi=AiAi1B_i=A_i-A_{i-1})。
    +此时,我们可以把“区间[x,y][x,y]中所有元素都加上kk”看作:

    +
      +
    • Bx:=Bx+kB_x:=B_x+k
    • +
    • By+1:=By+1kB_{y+1}:=B_{y+1}-k
    • +
    +

    此时,Ax=B1++BxA_x=B_1+\dots+B_x,正好是树状数组的前缀和操作。
    +于是,我们在O(NlogN)\mathcal O(N\log N)的时间复杂度内解决了这个问题。

    +

    C++实现如下(此实现方式与前面讲的略有不同):

    +
    #include <cstdio>
    +#define maxn 500005
    +using namespace std;
    +
    +template <typename value_type>
    +class fenwick_tree {
    +private:
    +	const int n;
    +	value_type* a;
    +	inline int lowbit(int x) { return x & -x; }
    +public:
    +	inline fenwick_tree(int m): n(m) {
    +		a = new value_type[n + 1];
    +		for(int i=0; i<=n; i++)
    +			a[i] = 0;
    +	}
    +	inline ~fenwick_tree() { delete[] a; }
    +	inline value_type prefixSum(int i) {
    +		value_type res = 0;
    +		for(; i; i-=lowbit(i)) res += a[i];
    +		return res;
    +	}
    +	inline void update(int i, const value_type& d) {
    +		for(; i<=n; i+=lowbit(i))
    +			a[i] += d;
    +	}
    +};
    +
    +int a[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	for(int i=1; i<=n; i++)
    +		scanf("%d", a + i);
    +	fenwick_tree<int> bit(n);
    +	while(m--)
    +	{
    +		int op;
    +		scanf("%d", &op);
    +		if(op == 1)
    +		{
    +			int l, r, k;
    +			scanf("%d%d%d", &l, &r, &k);
    +			bit.update(l, k);
    +			if(r < n) bit.update(r + 1, -k);
    +		}
    +		else
    +		{
    +			int x;
    +			scanf("%d", &x);
    +			printf("%d\n", a[x] + bit.prefixSum(x));
    +		}
    +	}
    +	return 0;
    +}
    +
    +

    习题

    + +

    总结

    +

    树状数组支持更新、求和两种操作。欢迎大家前来提问或补充~
    +求三连qwq

    +
    +
    +
      +
    1. 实际上所有情况都可以,不过其他的非特殊情况实现起来非常繁琐,有时还不如直接用线段树来得方便,因此这里忽略这种情况。 ↩︎

      +
    2. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-floyd/index.html b/post/algonotes-floyd/index.html new file mode 100644 index 00000000..094ef14e --- /dev/null +++ b/post/algonotes-floyd/index.html @@ -0,0 +1,505 @@ + + + + + +【算法笔记】多源最短路问题——Floyd算法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】多源最短路问题——Floyd算法 +

    + +
    +
    + 2022-08-12 · 7 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 前言

    +

    在图中,如果要求任意两点间的距离,则可以使用FloydO(N3)\mathcal O(N^3)😉)和DijkstraO(NMlogM)\mathcal O(NM\log M)😃)。对于比较小的数据范围(一般为顶点数N150N\le 150),可以使用Floyd算法。本文将讲述Floyd算法的原理、实现和扩展应用。

    +

    如果有哪里写得不好请各位dalao多多指教,谢谢!

    +

    1. 原理

    +

    不同于DijkstraFloyd算法同样适用于带负边权的最短路问题。其原理为:
    +令f(x,y)f(x,y)为从顶点xxyy的最短路径。初始时,有:

    +

    f(x,y)={0(x=y)G[x][y](G[x][y]0)+(xy,G[x][y]=0)f(x,y)= +\begin{cases} +0 & (x=y) \\ +G[x][y] & (G[x][y]\ne0)\\ ++\infin & (x\ne y,G[x][y]=0) +\end{cases} +

    +

    其中GG为图的邻接矩阵,G[x][y]G[x][y]表示顶点xxyy的边权,00表示xxyy没有连边。
    +接下来,考虑枚举中间点kk,按xkyx\to k\to y的路线计算最短路,则伪代码为:

    +
    for k = 1, 2, ..., n
    +	for x = 1, 2, ..., n
    +		for y = 1, 2, ..., n
    +			f[x][y] = min(f[x][y], f[x][k] + f[k][y])
    +
    +

    此时,算法结束,最终f(x,y)f(x,y)即为从xxyy的最短路。

    +

    注意:当给定图为无向图时,对于任意(x,y)(x,y)G[x][y]=G[y][x]G[x][y]=G[y][x],则f(x,y)=f(y,x)f(x,y)=f(y,x),可改变计算过程(如变成f[k][x]+f[k][y]);但若是有向图,请务必按照伪代码中的顺序编写程序!

    +

    2. 代码

    +

    Floyd算法的代码可在洛谷 B3647提交。下面给出这题对应的AC代码(注意是按边输入):

    +
    #include <cstdio>
    +#include <cstring>
    +#define maxn 100
    +using namespace std;
    +
    +int dis[maxn][maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	// 初始化,注意初始值不能超过INT_MAX/2(防止两个INF相加溢出)
    +	memset(dis, 0x3f, sizeof dis); 
    +	// 每个点到自己的距离为0
    +	for(int i=0; i<n; i++)
    +		dis[i][i] = 0;
    +	// 读入边
    +	while(m--)
    +	{
    +		int u, v, d;
    +		scanf("%d%d%d", &u, &v, &d);
    +		u --, v --; // 0-index
    +		dis[u][v] = dis[v][u] = d; // 注意两个值都要设
    +	}
    +	// Floyd 算法流程
    +	for(int k=0; k<n; k++) // 中间点
    +		for(int i=0; i<n; i++) // 起始点
    +			for(int j=0; j<n; j++) // 终点
    +			{
    +				int d = dis[i][k] + dis[k][j]; // i->k->j
    +				if(d < dis[i][j]) dis[i][j] = d; // 取最短长度
    +			}
    +	for(int i=0; i<n; i++, putchar('\n'))
    +		for(int j=0; j<n; j++)
    +			printf("%d ", dis[i][j]);
    +	return 0;
    +}
    +
    +

    3. 扩展

    +

    下面问题来了:如何输出结果路径?其实方法很简单。与Dijkstra类似但略有不同,设path(x,y)=xy\text{path}(x, y)=x\to y的最短路径上的某一点,则状态转移时若f(x,k)+f(k,y)<f(x,y)f(x,k)+f(k,y)<f(x,y),则不仅要更新f(x,y)f(x,y),还要更新path(x,y):=k\text{path}(x,y):=k。最后,递归输出结果即可。

    +

    题面

    +

    给定一张有NN个点,MM条边的简单无向图,对于每一对(i,j)(i,j)1i<jN1\le i<j\le N),求iji\to j的最短路径上的每一点。

    +

    样例

    +

    输入:

    +
    5 6
    +3 4 3
    +4 1 1
    +4 5 4
    +1 2 2
    +5 2 10
    +3 2 7
    +
    +输入图片 +

    输出:

    +
    1->2: 1 2
    +1->3: 1 4 3
    +1->4: 1 4
    +1->5: 1 4 5
    +2->3: 2 1 4 3
    +2->4: 2 1 4
    +2->5: 2 1 4 5
    +3->4: 3 4
    +3->5: 3 4 5
    +4->5: 4 5
    +
    +

    代码

    +
    #include <cstdio>
    +#include <cstring>
    +#define maxn 100
    +using namespace std;
    +
    +int dis[maxn][maxn], path[maxn][maxn];
    +void print(int x, int y) // 递归输出x->y的路径,不包含y
    +{
    +	int k = path[x][y]; // x->k->y
    +	if(k == x || k == y) // 两点相邻,直接输出
    +		printf(" %d", x);
    +	else
    +	{
    +		// 分成两部分递归
    +		print(x, k); // x->k
    +		print(k, y); // k->y
    +	}
    +}
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	// 初始化
    +	memset(dis, 0x3f, sizeof dis); 
    +	for(int i=0; i<n; i++)
    +		dis[i][i] = 0;
    +	// 读入边
    +	while(m--)
    +	{
    +		int u, v, d;
    +		scanf("%d%d%d", &u, &v, &d);
    +		dis[u][v] = dis[v][u] = d; // 注意两个值都要设
    +		path[u][v] = path[v][u] = u; // 初始化path
    +	}
    +	// Floyd 算法流程,为了方便输出,采用1-index
    +	for(int k=1; k<=n; k++) // 中间点
    +		for(int i=1; i<=n; i++) // 起始点
    +			for(int j=1; j<=n; j++) // 终点
    +			{
    +				int d = dis[i][k] + dis[k][j]; // i->k->j
    +				if(d < dis[i][j]) // 更新最短路径
    +					dis[i][j] = d, path[i][j] = k;
    +			}
    +	// 依次枚举(i,j) 输出路径
    +	for(int i=1; i<n; i++)
    +		for(int j=i+1; j<=n; j++)
    +		{
    +			printf("%d->%d:", i, j);
    +			print(i, j);
    +			printf(" %d\n", j);
    +		}
    +	return 0;
    +}
    +
    +

    注:由于每条路径的长度不会超过NN,所以总时间复杂度仍为O(N3)\mathcal O(N^3)

    +

    4. 后记

    +

    总结:Floyd算法时间复杂度为O(N3)\mathcal O(N^3),写起来很方便。如果觉得好就请给个三连,谢谢支持!

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-knapsack-dp/index.html b/post/algonotes-knapsack-dp/index.html new file mode 100644 index 00000000..c9dca97f --- /dev/null +++ b/post/algonotes-knapsack-dp/index.html @@ -0,0 +1,637 @@ + + + + + +【算法笔记】三种背包问题——背包 DP - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】三种背包问题——背包 DP +

    + +
    +
    + 2022-08-18 · 14 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    前言

    +

    背包(Knapsack)问题是经典的动态规划问题,也很有实际价值。

    +

    01背包

    +
    +

    洛谷 P2871 [USACO07DEC] Charm Bracelet S
    +AtCoder Educational DP Contest D - Knapsack 1
    +有nn个物品和一个总容量为WW的背包。第ii件物品的重量是wiw_i,价值是viv_i。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

    +
    +knapsack +

    这是最原始的01背包问题(即每个物品只能选0011次)。下面我们来看如何求解。
    +令fi,jf_{i,j}表示只考虑前ii个物品的情况下,容量为jj的背包所能装的最大总价值。则最终答案为fn,Wf_{n,W},状态转移方程为:

    +

    fi,j={0(i=0/j=0)max(fi1,j,fi1,jwi+vi)(i>0,jwi)f_{i,j}=\begin{cases} +0 & (i=0/j=0) \\ +\max(f_{i-1,j},f_{i-1,j-w_i}+v_i) & (i>0,j\ge w_i) +\end{cases} +

    +

    依次递增ii,逐步增加问题规模即可求解。时间、空间复杂度均为O(nW)\mathcal O(nW)
    +在本题中,O(nW)\mathcal O(nW)的空间复杂度容易MLE,因此考虑使用数组重复利用或者滚动表的优化。

    +

    压缩掉ff的第一维,变成:

    +

    fj=max(fj,fjwi+vi)f_j=\max(f_j,f_{j-w_i}+v_i) +

    +

    此时空间复杂度为O(W)\mathcal O(W)
    +一定要牢记这个公式,注意使用时需倒序枚举jj,防止串连转移。参考代码:

    +
    #include <cstdio>
    +#define setmax(x, y) if(x < y) x = y
    +using namespace std;
    +
    +int f[12881];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(n--)
    +	{
    +		int w, v;
    +		scanf("%d%d", &w, &v);
    +		for(int i=m; i>=w; i--)
    +			setmax(f[i], f[i - w] + v);
    +	}
    +	printf("%d\n", f[m]);
    +	return 0;
    +}
    +
    +

    01背包还有一种简单变形,即求最小剩余空间,此时用((总空间-最大可装空间))即可。

    +
    #include <cstdio>
    +#define setmax(x, y) if(x < y) x = y
    +using namespace std;
    +
    +int f[20005];
    +
    +int main()
    +{
    +	int n, v;
    +	scanf("%d%d", &v, &n);
    +	while(n--)
    +	{
    +		int w;
    +		scanf("%d", &w);
    +		for(int i=v; i>=w; i--)
    +			setmax(f[i], f[i - w] + w);
    +	}
    +	printf("%d\n", v - f[v]);
    +	return 0;
    +}
    +
    +

    扩展:对付更大的WW

    +
    +

    AtCoder Educational DP Contest E - Knapsack 2
    +本题和普通的01背包完全相同,只是数据范围改为n100,W109,vi103n\le 100,W\le 10^9,v_i\le 10^3

    +
    +

    注意数据范围,W109W\le 10^9意味着只要开这么大的数组都会MLE,因此我们考虑修改dp状态。前看原来的dp状态,本质上就是“确定重量,求最大价值”,现在我们反过来,即“确定价值,求最小重量”。令fi,jf_{i,j}表示只用前ii个物品,达到总价值为jj所需的最小空间。由于n100,vi103n\le 100,v_i\le 10^3,所以vi105\sum v_i\le 10^5,极限情况下dp数组只需要开n×vi107n\times\sum v_i\approx10^7即可,相对而言会好很多。下面考虑dp状态转移方程:

    +

    fi,j={+(i=0,j0)0(i0,j=0)min(fi1,j,fi1,jvi+wi)(i>0,j>0)f_{i,j}=\begin{cases} ++\infin & (i=0,j\ne0) \\ +0 & (i\ge 0,j=0) \\ +\min(f_{i-1,j},f_{i-1,j-v_i}+w_i) & (i>0,j>0) +\end{cases} +

    +

    其中,i=0,j0i=0,j\ne 0这种情况不存在,所以初始值为++\infin。最终答案,即为最大的jj,使得fn,jWf_{n,j}\le W,更新状态时可同时记录这个答案。

    +

    这种算法的时间和空间都可以优化:

    +
      +
    • 时间:对于每个ii,循环迭代jj时只需到v1+v2++viv_1+v_2+\dots+v_i即可,因为当前的总价值不可能超过这个值;
    • +
    • 空间:用与前面完全相同的方法,压缩掉第一维空间,变成fj=min(fj,fjvi+wi)f_j=\min(f_j,f_{j-v_i}+w_i)(注意要倒序枚举jj
    • +
    +

    运用了两种优化的代码如下:

    +
    #include <cstdio>
    +#include <cstring>
    +using namespace std;
    +
    +long long f[100005], t, tot, ans;
    +
    +int main()
    +{
    +	int n, sz;
    +	scanf("%d%d", &n, &sz);
    +	memset(f, 0x3f, sizeof f);
    +	f[0] = 0;
    +	while(n--)
    +	{
    +		int w, v;
    +		scanf("%d%d", &w, &v);
    +		tot += v;
    +		for(int i=tot; i>=v; i--)
    +			if((t = f[i - v] + w) < f[i] && t <= sz)
    +			{
    +				f[i] = t;
    +				if(i > ans) ans = i;
    +			}
    +	}
    +	printf("%lld\n", ans);
    +	return 0;
    +}
    +
    +

    完全背包

    +
    +

    洛谷 P1616 疯狂的采药
    +有nn个物品和一个总容量为WW的背包。第ii件物品的重量是wiw_i,价值是viv_i每个物品可以使用无限次。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

    +
    +

    这种背包与01背包唯一的不同之处在于,每个物品使用次数不限,所以参考01背包的dp状态:
    +令fi,jf_{i,j}表示只考虑前ii个物品的情况下,容量为jj的背包所能装的最大总价值,则有:

    +

    fi,j=maxk=0+{fi1,jk×wi}+vi×k=maxk=0jwi{fi1,jk×wi}+vi×k\begin{aligned} +f_{i,j}=\max_{k=0}^{+\infin}\{f_{i-1,j-k\times w_i}\}+v_i\times k\\ +=\max_{k=0}^{\lfloor\frac j{w_i}\rfloor}\{f_{i-1,j-k\times w_i}\}+v_i\times k +\end{aligned} +

    +

    可以发现,实际上只需要用fi,j=max(fi1,j,fi,jwi+vi)f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i)即可,因为此时的fi,jwif_{i,j-w_i}会被fi,j2wif_{i,j-2w_i}更新,fi,j2wif_{i,j-2w_i}又会被fi,j3wif_{i,j-3w_i}更新,以此类推,这样算与前面的公式等效。

    +

    对比一下01背包和完全背包的状态转移方程:

    +

    fi,j=max(fi1,j,fi1,jwi+vi)fi,j=max(fi1,j,fi,jwi+vi)\begin{aligned} +f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_i}+v_i) \\ +f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i) +\end{aligned} +

    +

    实际上,区别就在于一个是fi1,jwif_{i-1,j-w_i},一个是fi,jwif_{i,j-w_i}。所以仍可以使用数组压缩,只需要改变一下循环顺序,是不是很神奇?
    +long long别忘了~

    +
    #include <cstdio>
    +#define setmax(x, y) if(x < y) x = y
    +using namespace std;
    +
    +long long f[10000005];
    +
    +int main()
    +{
    +	int sz, n;
    +	scanf("%d%d", &sz, &n);
    +	while(n--)
    +	{
    +		int w, v;
    +		scanf("%d%d", &w, &v);
    +		for(int i=w; i<=sz; i++)
    +			setmax(f[i], f[i - w] + v);
    +	}
    +	printf("%lld\n", f[sz]);
    +	return 0;
    +}
    +
    +

    多重背包

    +
    +

    洛谷 P1776 宝物筛选
    +有nn个物品和一个总容量为WW的背包。第ii件物品的重量是wiw_i,价值是viv_i最多能选择mim_i。我们要选择一些物品,使这些物品的重量总和不超过背包容量,且价值总和最大。n100,mi105,W4×104n\le100,\sum m_i\le10^5,W\le 4\times10^4

    +
    +

    很容易想到,可以转换成每件物品都被拆分成mim_i个只能选一次的物品,即N=miN=\sum m_i的01背包。很明显,这样做的时间复杂度是O(Wmi)\mathcal O(W\sum m_i),会TLE。因此,我们可以优化拆分的方法,将mm转化为x+j=0i2jx+\sum\limits_{j=0}^i 2^j的形式,举几个栗子:

    +
      +
    • 5=(1+2)+25=(1+2)+2,其中i=1,x=2i=1,x=2
    • +
    • 16=(1+2+4+8)+116=(1+2+4+8)+1,其中i=3,x=1i=3,x=1
    • +
    • 31=(1+2+4+8+16)31=(1+2+4+8+16),其中i=4,x=0i=4,x=0
    • +
    +

    这种方法的正确性这里就不详细说明了,主要依赖于二进制的拼凑。容易发现,数字mm按这种拆分的方法会被拆分为log2m\lceil\log_2m\rceil个数字的和,因此总时间复杂度为O(Wi=1nlogmi)\mathcal O(W\sum\limits_{i=1}^n\log m_i),可以通过此题。

    +

    还有一种单调队列/单调栈优化,同样针对多重背包问题,时间复杂度为O(nW)\mathcal O(nW)有时不一定优于二进制优化,这里就不多说了。下面给出二进制优化的参考程序。

    +
    #include <cstdio>
    +#define maxw 40004
    +#define setmax(x, y) if(x < y) x = y
    +using namespace std;
    +
    +int n, w, f[maxw];
    +
    +inline void add(int a, int b) // a: value, b: weight
    +{
    +	for(int i=w; i>=b; i--)
    +		setmax(f[i], f[i - b] + a);
    +}
    +
    +int main()
    +{
    +	scanf("%d%d", &n, &w);
    +	while(n--)
    +	{
    +		int a, b, c;
    +		scanf("%d%d%d", &a, &b, &c);
    +		for(int i=0; (1<<i)<=c; i++)
    +			add(a << i, b << i), c -= 1 << i;
    +		if(c) add(a * c, b * c);
    +	}
    +	printf("%d\n", f[w]);
    +	return 0;
    +}
    +
    +

    混合背包

    +

    没错,就是前三种放在一起的背包。不用的物品有不同的种类。比如洛谷 P1833 樱花,就是混合背包。不过,也不要慌,直接用个分支判断,比如:

    +
    for (循环物品种类) {
    +  if (是 0 - 1 背包)
    +    套用 0 - 1 背包代码;
    +  else if (是完全背包)
    +    套用完全背包代码;
    +  else if (是多重背包)
    +    套用多重背包代码;
    +}
    +
    +

    实际上也不一定要这样,可以全部统一成混合背包:

    +
      +
    • 对于01背包,可选数目ki=1k_i=1
    • +
    • 对于完全背包,可选数目ki=Wwik_i=\lceil\frac W{w_i}\rceil
    • +
    +

    这里就不给出详细代码,有兴趣的读者可以自己尝试一下。

    +

    总结

    +

    让我们来总结一下三种基本背包DP的异同:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    项目01背包完全背包多重背包
    适用场景每件物品只能选择一次每件物品可以无限选择每件物品可以选择的次数有限
    状态转移方程[1]max(fj,fjwi+vi)\max(f_j,f_{j-w_i}+v_i)max(fj,fjwi+vi)\max(f_j,f_{j-w_i}+v_i)基本同01背包
    时间复杂度[2]O(nW)\mathcal O(nW)O(nW)\mathcal O(nW)O(Wlogki)\mathcal O(W\sum\log k_i)
    空间复杂度[3]O(W)\mathcal O(W)O(W)\mathcal O(W)O(W)\mathcal O(W)
    编码难度
    +

    创作不易,如果觉得好就请给个三连,谢谢支持!

    +
    +
    +
      +
    1. 压缩掉第一维fjf_j,01背包为倒序枚举jj,完全背包为正序 ↩︎

      +
    2. +
    3. 完全背包为优化后的复杂度,多重背包为二进制优化的复杂度。 ↩︎

      +
    4. +
    5. 指压缩第一维后的dp数组大小。 ↩︎

      +
    6. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-lca/index.html b/post/algonotes-lca/index.html new file mode 100644 index 00000000..76fced8d --- /dev/null +++ b/post/algonotes-lca/index.html @@ -0,0 +1,639 @@ + + + + + +【算法笔记】最近公共祖先(LCA)问题求解——倍增算法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】最近公共祖先(LCA)问题求解——倍增算法 +

    + +
    +
    + 2023-01-06 · 12 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 前言

    +

    最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。

    +

    这种算法应用很广泛,可以很容易解决树上最短路等问题。

    +

    为了方便,我们记某点集 S={v1,v2,,vn}S=\{v_1,v_2,\ldots,v_n\} 的最近公共祖先为 LCA(v1,v2,,vn)\text{LCA}(v_1,v_2,\ldots,v_n)LCA(S)\text{LCA}(S)

    +
    +

    部分内容参考 OI Wiki,文章中所有算法均使用C++实现。

    +
    +

    例题:洛谷 P3379 【模板】最近公共祖先(LCA)

    +

    1. 性质

    +
      +
    1. LCA({u})=u\text{LCA}(\{u\})=u
    2. +
    3. uuvv 的祖先,当且仅当 LCA(u,v)=u\text{LCA}(u,v)=u
    4. +
    5. 如果 uu 不为 vv 的祖先并且 vv 不为 uu 的祖先,那么 u,vu,v 分别处于 LCA(u,v)\text{LCA}(u,v) 的两棵不同子树中;
    6. +
    7. 前序遍历中,LCA(S)\text{LCA}(S) 出现在所有 SS 中元素之前,后序遍历中 LCA(S)\text{LCA}(S) 则出现在所有 SS 中元素之后;
    8. +
    9. 两点集并的最近公共祖先为两点集分别的最近公共祖先的最近公共祖先,即 LCA(AB)=LCA(LCA(A),LCA(B))\text{LCA}(A\cup B)=\text{LCA}(\text{LCA}(A), \text{LCA}(B))
    10. +
    11. 两点的最近公共祖先必定处在树上两点间的最短路上;
    12. +
    13. d(u,v)=h(u)+h(v)2h(LCA(u,v))d(u,v)=h(u)+h(v)-2h(\text{LCA}(u,v)),其中 dd 是树上两点间的距离,hh 代表某点到树根的距离。
    14. +
    +

    2. 求解算法

    +

    2.0 前置知识1:树的邻接表存储

    +

    简单来说,树的邻接表存储就是对于每个结点,存储其能通过一条有向或无向边,直接到达的所有结点。
    +传统的存储方式是使用链表(或模拟链表),这样实现比较麻烦,也容易写错。
    +此处为了更好的可读性我们使用STL中的可变长度顺序表vector

    +
    #include <vector> // 需要使用STL中的vector
    +#define maxn 100005 // 最大结点个数
    +
    +std::vector<int> G[maxn];
    +
    +

    此时,若要添加一条无向边uvu\leftrightarrow v,可使用:

    +
    G[u].push_back(v);
    +G[v].push_back(u);
    +
    +

    若要添加uvu\to v的有向边:

    +
    G[u].push_back(v);
    +
    +

    遍历vv能直接到达的所有结点:

    +
    for(int u: G[v])
    +	cout << u << endl;
    +
    +

    2.1 前置知识2:DFS 遍历 & 结点的深度计算

    +

    对于两种算法,都需要预处理出每个结点的深度。
    +一个结点的深度定义为这个结点到树根的距离。

    +

    要预处理出所有结点的深度,很简单:
    +运用树形dp的方法,令 huh_u 表示结点 uu 的深度,逐层向下推进:

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 100005
    +using namespace std;
    +
    +vector<int> G[maxn]; // 邻接表存储
    +int depth[maxn]; // 每个结点的深度
    +
    +void dfs(int v, int par) // dfs(当前结点,父亲结点)
    +{
    +	int d = depth[v] + 1; // 子结点的深度=当前结点的深度+1
    +	for(int u: G[v])
    +		if(u != par) // 不加这条判断会无限递归
    +		{
    +			depth[u] = d; // dp更新子结点深度
    +			dfs(u, v); // 往下dfs
    +		}
    +}
    +
    +int main()
    +{
    +	// 构建一张图
    +	// ...
    +	// 假定图已存入邻接表G:
    +	int root = 0; // 默认树根为0号结点,根据实际情况设置
    +	dfs(root, -1); // 对于根结点,父亲结点为-1即为无父亲结点
    +	return 0;
    +}
    +
    +

    2.2 朴素算法

    +

    u,vu,v 表示两个待求 LCA 的结点。需提前预处理出每个结点的父亲(记结点 vv 的父亲为 fvf_v)。

    +

    算法步骤:

    +
      +
    1. 使 u,vu,v 的深度相同:可以让深度大的结点往上走,直到与深度小的结点深度相同。
    2. +
    3. uvu\ne v时:ufu,vfvu\gets f_u,v\gets f_v
    4. +
    5. 循环直到 u=vu=v,此条件成立后 uuvv 的值即为我们要求的 LCA。
    6. +
    +

    时间复杂度分析:

    +
      +
    • 预处理:DFS 遍历整棵树,O(N)\mathcal O(N)
    • +
    • 单次查询:最坏 O(N)\mathcal O(N),平均 O(logN)\mathcal O(\log N)(随机树的高为 logN\lceil\log N\rceil
    • +
    +

    参考代码:

    +
    #include <cstdio>
    +#include <vector>
    +#include <algorithm>
    +#define maxn 500005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +int depth[maxn], par[maxn];
    +
    +void dfs(int v)
    +{
    +	int d = depth[v] + 1;
    +	for(int u: G[v])
    +		if(u != par[v])
    +		{
    +			par[u] = v, depth[u] = d;
    +			dfs(u);
    +		}
    +}
    +
    +int lca(int u, int v)
    +{
    +	if(depth[u] < depth[v])
    +		swap(u, v);
    +	while(depth[u] > depth[v])
    +		u = par[u];
    +	while(u != v)
    +		u = par[u], v = par[v];
    +	return u;
    +}
    +
    +int main()
    +{
    +	int n, q, root;
    +	scanf("%d%d%d", &n, &q, &root);
    +	for(int i=1; i<n; i++)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[u].push_back(v);
    +		G[v].push_back(u);
    +	}
    +	par[root] = -1, depth[root] = 0;
    +	dfs(root);
    +	while(q--)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		printf("%d\n", lca(u, v));
    +	}
    +	return 0;
    +}
    +
    +

    可以发现,程序在最后四个测试点上TLE了:

    +TLE +

    这是因为,这四个点是专门针对朴素算法设计的(正好是一个 Subtask),使算法的时间复杂度达到了最坏情况 O(NQ)\mathcal O(NQ),而 N,Q5×105N,Q\le 5\times 10^5,所以无法通过测试点。当然,朴素算法在随机树上回答 QQ 次询问的时间复杂度还是 O(N+QlogN)\mathcal O(N+Q\log N),被极端数据卡掉也没办法

    +

    2.3 倍增

    +

    倍增算法是朴素算法的改进算法,也是最经典的 LCA 求法。

    +

    预处理:

    +
      +
    • fax,i\text{fa}_{x,i} 表示点 xx 的第 2i2^i 个祖先。
    • +
    • dfs 预处理深度信息时,也可以预处理出 fax,i\text{fa}_{x,i}: +
        +
      • 首先考虑ii的范围:2idx2^i\le d_x(前面说的,dxd_x 表示结点 xx 的深度),所以有0ilog2dx0\le i\le \lfloor\log_2 d_x\rfloor
      • +
      • 对于 i=0i=02i=20=12^i=2^0=1,所以直接令 fax,0=(x的父亲)\text{fa}_{x,0}=(x\text{的父亲}) 即可。
      • +
      • 对于 1ilog2dx1\le i\le \lfloor\log_2 d_x\rfloorxx 的第 2i2^i 个祖先可看作 xx 的第 2i12^{i-1} 个祖先的第 2i12^{i-1} 个祖先(2i1+2i1=2i2^{i-1}+2^{i-1}=2^i),即:
      • +
      +

      +

      +

      +
    • +
    +
      +
    1. 使 u,vu,v 的深度相同:计算出 u,vu,v 两点的深度之差,设其为 yy。通过将 yy 进行二进制拆分,我们将 yy 次游标跳转优化为「yy 的二进制表示所含 1 的个数」次游标跳转(详见代码)。
    2. +
    3. 特判:如果此时u=vu=v,直接返回 uuvv 作为 LCA 结果。
    4. +
    5. 同时上移uuvv:从 i=log2dui=\lfloor\log_2 d_u\rfloor 开始循环尝试,一直尝试到 00(包括 00),如果 fau,i=fav,i\text{fa}_{u,i}\not=\text{fa}_{v,i},则 ufau,i,vfav,iu\gets\text{fa}_{u,i},v\gets\text{fa}_{v,i},那么最后的 LCA 为 fau,0\text{fa}_{u,0}
    6. +
    +

    时间复杂度分析:

    +
      +
    • 预处理:O(N)\mathcal O(N) DFS × O(logN)\times~\mathcal O(\log N) 预处理 =O(NlogN)=\mathcal O(N\log N)
    • +
    • 单次查询:平均 O(logN)O(\log N),最坏 O(logN)O(\log N)
    • +
    • 预处理 + QQ 次查询:O(N+QlogN)\mathcal O(N+Q\log N)
    • +
    +

    另外倍增算法可以通过交换 fa 数组的两维使较小维放在前面。这样可以减少 cache miss 次数,提高程序效率。

    +

    参考代码:

    +
    #include <cstdio>
    +#include <vector>
    +#include <cmath>
    +#define maxn 500005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +int fa[maxn][19]; // 2^19=524288
    +int depth[maxn];
    +
    +void dfs(int v, int par)
    +{
    +	fa[v][0] = par;
    +	int d = depth[v] + 1;
    +	for(int i=1; (1<<i)<d; i++)
    +		fa[v][i] = fa[fa[v][i - 1]][i - 1];
    +	for(int u: G[v])
    +		if(u != par)
    +			depth[u] = d, dfs(u, v);
    +}
    +
    +inline int lca(int u, int v)
    +{
    +	if(depth[u] < depth[v])
    +		u ^= v ^= u ^= v;
    +	int m = depth[u] - depth[v];
    +	for(int i=0; m; i++, m>>=1)
    +		if(m & 1)
    +			u = fa[u][i];
    +	if(u == v) return u; // 这句不能丢
    +	for(int i=log2(depth[u]); i>=0; i--)
    +		if(fa[u][i] != fa[v][i])
    +			u = fa[u][i], v = fa[v][i];
    +	return fa[u][0];
    +}
    +
    +int main()
    +{
    +	int n, q, root;
    +	scanf("%d%d%d", &n, &q, &root);
    +	for(int i=1; i<n; i++)
    +	{
    +		int x, y;
    +		scanf("%d%d", &x, &y);
    +		G[--x].push_back(--y);
    +		G[y].push_back(x);
    +	}
    +	depth[--root] = 0;
    +	dfs(root, -1);
    +	while(q--)
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		printf("%d\n", lca(--u, --v) + 1);
    +	}
    +	return 0;
    +}
    +
    +AC +

    3. 习题

    + +

    4. 总结

    +

    本文详细讲解了 LCA 问题以及求解 LCA 的两种算法。对比如下:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    算法预处理时间复杂度单次查询时间复杂度[1]空间复杂度能否通过例题[2]
    朴素算法O(N)\mathcal O(N)O(N)\mathcal O(N)O(N)\mathcal O(N)
    倍增算法O(NlogN)\mathcal O(N\log N)O(logN)\mathcal O(\log N)O(NlogN)\mathcal O(N\log N)✔️
    +

    创作不易,希望大家能给个三连,感谢支持!

    +
    +
    +
      +
    1. 此时间复杂度按照最坏情况计算↩︎

      +
    2. +
    3. 例题:洛谷 P3379 【模板】最近公共祖先(LCA) ↩︎

      +
    4. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-mst/index.html b/post/algonotes-mst/index.html new file mode 100644 index 00000000..6b1cdb8a --- /dev/null +++ b/post/algonotes-mst/index.html @@ -0,0 +1,677 @@ + + + + + +【算法笔记】Kruskal/Prim算法——求解最小生成树问题 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】Kruskal/Prim算法——求解最小生成树问题 +

    + +
    +
    + 2022-08-15 · 11 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    前言

    +

    生活中经常遇到类似这种的问题:

    +
    +

    公路修建
    +有一些城市,城市之间要修建高速公路,每两个城市之间都可以修双向的路。其中每两个城市之间修路都需要花费对应的金额。请问如何修路,使得总花费的金额最少,且任意两个城市之间都可以直接或间接通过修建的路来通行?

    +
    +

    实际上,我们可以把这种问题抽象化,把城市看作图的顶点,公路看作带权的无向边,这样整个国家就被抽象成了一张带权无向图。又因为要求总花费最小,所以修的路一定组成一棵生成树,于是转换成下面的问题:

    +
    +

    给定一张带权无向图GG,求它的一棵生成树,使其中所有边权之和最小

    +
    +

    实际上,这就是大名鼎鼎的「最小生成树问题」。
    +比如看下面这张图:

    +MST-Graph +

    其中,标绿的部分即为其最小生成树。

    +

    对于这种问题,很多数学家都有所研究。但毕竟是数学家,不懂计算机,就只管算法的正确性,不管实现起来的简单性、可行性和效率,所以很多算法都被人们所抛弃。不过,还是有两种算法脱颖而出,它们就是标题中的——Kruskal 和 Prim。

    +

    模板:洛谷 P3366【模板】最小生成树
    +数据范围:N5000,M2×105,w104N\le5000,M\le2\times10^5,w\le 10^4

    +

    Kruskal

    +

    Kruskal算法是由Joseph Kruskal于1956年提出的最小生成树算法,时间复杂度为O(mlogm)\mathcal O(m\log m)。下面来看这种算法的流程。

    +

    Kruskal 算法流程

    +
      +
    1. 将所有边按权值从小到大排序,依次遍历每一条边;
    2. +
    3. 对于每一条边,如果在当前子图中连上之后不会形成环,则选择这条边作为最小生成树的一部分,加入子图;
    4. +
    5. 选择N1N-1条边后即可结束算法。
    6. +
    +

    并查集 - 加快算法速度

    +

    在正式实现Kruskal算法之前,我们还需要先了解一下并查集。如果判定是否会出现环的部分使用DFS\text{DFS},则时间复杂度为O(nm+mlogm)\mathcal O(nm+m\log m),费时费力。若使用并查集来实现,则代码非常简单,且时间复杂度仅为O(mlogm)\mathcal O(m\log m)(排序的耗时)。并查集模板:

    +
    class dsu
    +{
    +private:
    +	const int n;
    +	int* fa;
    +public:
    +	inline dsu(int count): n(count) // 初始化大小为n的并查集
    +	{
    +		fa = new int[n]; // 申请新的内存
    +		for(int i=0; i<n; i++)
    +			fa[i] = i; // 初始化fa[i]=i
    +	}
    +	inline ~dsu() { delete[] fa; }  // 销毁存储空间,防止内存泄露
    +	inline int size() { return n; } // 返回并查集大小
    +	int find(int x) { return fa[x] == x? x: fa[x] = find(fa[x]); } // 查找父亲+路径压缩
    +	inline bool same(int x, int y) { return find(x) == find(y); } // x,y是否在同一个连通分量里?
    +	inline void merge(int x, int y) { fa[find(x)] = find(y); } // 合并x、y,即连接x<->y这条双向边
    +	inline bool connected() // 判断整个图是否连通
    +	{
    +		int p = find(0);
    +		for(int i=0; i<n; i++)
    +			if(find(i) != p)
    +				return false;
    +		return true;
    +	}
    +};
    +
    +

    使用并查集后,算法时间复杂度降到O(mlogm)\mathcal O(m\log m),即排序的时间复杂度。下面来看代码。

    +

    参考代码

    +

    如果对并查集不熟悉的读者可以先复制模板写代码,后面再仔细研究TA
    +单次Kruskal算法的排序建议用priority_queue(比sort效率更高),如果要多次Kruskal则需要提前排好序。

    +
    #include <cstdio>
    +#include <queue>
    +using namespace std;
    +
    +// 代表一条边,方便排序
    +struct Edge
    +{
    +	int from, to, weight;
    +	inline bool operator <(const Edge& e2) const
    +	{
    +		return weight > e2.weight; // 注意:使用优先队列时要把大小倒过来过来
    +	}
    +	inline void read()
    +	{
    +		scanf("%d%d%d", &from, &to, &weight);
    +		from --, to --;
    +	}
    +};
    +
    +// 并查集模板
    +class dsu
    +{
    +private:
    +	const int n;
    +	int* fa;
    +public:
    +	inline dsu(int count): n(count)
    +	{
    +		fa = new int[n];
    +		for(int i=0; i<n; i++)
    +			fa[i] = i;
    +	}
    +	inline ~dsu() { delete[] fa; }
    +	inline int size() { return n; }
    +	int find(int x) { return fa[x] == x? x: fa[x] = find(fa[x]); }
    +	inline bool same(int x, int y) { return find(x) == find(y); }
    +	inline void merge(int x, int y) { fa[find(x)] = find(y); }
    +	inline bool connected()
    +	{
    +		int p = find(0);
    +		for(int i=0; i<n; i++)
    +			if(find(i) != p)
    +				return false;
    +		return true;
    +	}
    +};
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m); // 读入顶点数和边数
    +	priority_queue<Edge> q; // 初始化优先队列,用于排序
    +	while(m--)
    +	{
    +		Edge e;
    +		e.read();  // 读入一条边
    +		q.push(e); // 放入队列进行排序
    +	}
    +	int ans = 0, // 记录总权值
    +		cnt = 0; // 当前选择边的个数
    +	dsu d(n);    // 初始化并查集
    +	while(!q.empty() && cnt < n - 1) // 遍历所有边,选择了n-1条边即可退出
    +	{
    +		auto [u, v, w] = q.top(); q.pop(); // 弹出边权最小的边
    +		if(!d.same(u, v))  // 如果连通后不会形成环
    +		{
    +			d.merge(u, v);    // 连上这条边
    +			ans += w, cnt ++; // 更新答案和计数
    +		}
    +	}
    +	if(cnt == n - 1) printf("%d\n", ans); // 如果最终选择了n-1条边,输出答案
    +	else puts("orz"); // 否则...
    +	return 0;
    +}
    +
    +

    最后一段也可以写成这样(不用cnt计数,输出答案时判定连通,速度稍慢):

    +
    int ans = 0;
    +dsu d(n);
    +while(!q.empty())
    +{
    +	auto [u, v, w] = q.top(); q.pop();
    +	if(!d.same(u, v))
    +	{
    +		d.merge(u, v);
    +		ans += w;
    +	}
    +}
    +if(d.connected()) printf("%d\n", ans);
    +else puts("orz");
    +
    +

    Prim

    +

    Prim算法于1930年由捷克数学家Vojtěch Jarník发现,在1957年又由美国计算机科学家Robert C. Prim独立发现。1959年,Edsger Wybe Dijkstra(没错,就是Dijkstra算法的发明者)再次发现了该算法。因此,在某些场合,Prim算法又被称为DJP算法、Jarník算法或Prim-Jarník算法。

    +

    Prim 算法流程

    +

    Prim与Dijkstra很相似,将顶点分为SSTT两个集合,具体流程如下:

    +
      +
    1. 初始时,所有顶点全部在SS中,TT为空集。
    2. +
    3. SS中选择任意顶点,移动到集合TT
    4. +
    5. 重复以下步骤,直到所有顶点都在TT中: +
        +
      • 选择一条边(u,v,w)(u,v,w),使得uu在点集SS中,vv在点集TT中,且权值ww最小;
      • +
      • 将这条边加入最小生成树,并将uu移入点集TT
      • +
      +
    6. +
    +

    Prim算法的原始写法就不多说了,这里和Dijkstra一样,介绍priority_queueset优化。

    +

    优先队列优化

    +

    运行时间:328ms328\mathrm{ms}
    +时间复杂度:O(nlogm)\mathcal O(n\log m)

    +
    #include <cstdio>
    +#include <queue>
    +#define maxn 5005
    +#define INF 2147483647
    +using namespace std;
    +
    +using pii = pair<int, int>;
    +vector<pii> G[maxn];
    +int dis[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v, w;
    +		scanf("%d%d%d", &u, &v, &w);
    +		G[--u].emplace_back(--v, w);
    +		G[v].emplace_back(u, w);
    +	}
    +	for(int i=1; i<n; i++)
    +		dis[i] = INF;
    +	priority_queue<pii, vector<pii>, greater<pii>> q;
    +	q.emplace(0, 0);
    +	int ans = 0, left = n;
    +	while(!q.empty() && left > 0)
    +	{
    +		auto [d, v] = q.top(); q.pop();
    +		if(d != dis[v]) continue;
    +		dis[v] = -INF, left --, ans += d;
    +		for(auto [u, w]: G[v])
    +			if(w < dis[u])
    +				q.emplace(dis[u] = w, u);
    +	}
    +	if(left) puts("orz");
    +	else printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    set优化

    +

    运行时间:351ms351\mathrm{ms}
    +时间复杂度:O(nlogn)\mathcal O(n\log n)

    +
    #include <cstdio>
    +#include <vector>
    +#include <set>
    +#define maxn 5005
    +#define INF 2147483647
    +using namespace std;
    +
    +using pii = pair<int, int>;
    +vector<pii> G[maxn];
    +int dis[maxn];
    +
    +int main()
    +{
    +	int n, m;
    +	scanf("%d%d", &n, &m);
    +	while(m--)
    +	{
    +		int u, v, w;
    +		scanf("%d%d%d", &u, &v, &w);
    +		G[--u].emplace_back(--v, w);
    +		G[v].emplace_back(u, w);
    +	}
    +	for(int i=1; i<n; i++)
    +		dis[i] = INF;
    +	set<pii> s;
    +	s.emplace(0, 0);
    +	int ans = 0, left = n;
    +	while(!s.empty() && left > 0)
    +	{
    +		auto it = s.begin();
    +		auto [d, v] = *it; s.erase(it);
    +		dis[v] = -INF, left --, ans += d;
    +		for(auto [u, w]: G[v])
    +			if(w < dis[u])
    +			{
    +				if(dis[u] != INF)
    +					s.erase(pii(dis[u], u));
    +				s.emplace(dis[u] = w, u);
    +			}
    +	}
    +	if(left) puts("orz");
    +	else printf("%d\n", ans);
    +	return 0;
    +}
    +
    +

    习题

    + +

    总结

    +

    我们来看一下Kruskal、Prim两种算法的对比:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    指标KruskalPrim
    时间复杂度O(mlogm)\mathcal O(m\log m)O(nlogm)\mathcal O(n\log m)[1]
    运行时间[2]255ms255\mathrm{ms}328ms328\mathrm{ms}
    编码难度
    适用域稀疏图稠密图
    +

    由此可见,大部分题目首选Kruskal,有特殊需要时才使用Prim。
    +本篇文章到此结束,如果觉得好的话就请给个三连,感谢大家的支持!

    +
    +
    +
      +
    1. 此处为优先队列优化的复杂度,set优化为O(nlogn)\mathcal O(n\log n) ↩︎

      +
    2. +
    3. 洛谷 P3366上的提交结果,Kruskal算法使用并查集+优先队列,Prim使用优先队列优化 ↩︎

      +
    4. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-rmq/index.html b/post/algonotes-rmq/index.html new file mode 100644 index 00000000..039f8fd6 --- /dev/null +++ b/post/algonotes-rmq/index.html @@ -0,0 +1,974 @@ + + + + + +【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树 +

    + +
    +
    + 2023-01-05 · 25 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 前言

    +

    好久没更算法笔记专栏了,正好学了新算法来更新……
    +这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢!

    +

    1. 关于 RMQ 问题

    +

    RMQ 的全称是 Range Minimum/Maximum Query,即区间最大/最小值问题。

    +

    本文中,我们的算法以求最大值为例(最小值基本一致)。题面如下:

    +
    +

    给定一个长为NN的序列A=(A1,A2,,AN)A=(A_1,A_2,\dots,A_N)
    +有QQ个询问,第ii个询问如下:
    + \to~给定1liriN1\le l_i\le r_i\le N,求区间[li,ri][l_i,r_i]的最大值,即maxj=liriAj\displaystyle\max_{j=l_i}^{r_i} A_j

    +
    +

    下面,我们将从暴力算法开始,逐步讲解 RMQ 问题的常用解法。

    +

    通用的 RMQ 问题(除暴力外所有算法都能通过):

    + +

    2. 解法

    +

    2.1 暴力法

    +

    我们先读取序列AA,再逐个读取询问,对于每个询问直接遍历AlArA_l\dots A_r,最终输出结果。
    +总时间复杂度为O(rili)=O(NQ)\mathcal O(\sum r_i-l_i)=\mathcal O(NQ)

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +int a[maxn];
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	while(q--)
    +	{
    +		int l, r;
    +		scanf("%d%d", &l, &r);
    +		l --, r --;
    +		int res = a[l];
    +		for(int i=l+1; i<=r; i++)
    +			if(a[i] < res)
    +				res = a[i];
    +		printf("%d ", res);
    +	}
    +	return 0;
    +}
    +
    +

    然而,当你提交到洛谷 P1816时……

    +TLE一个点 +

    肯定还是时间复杂度的锅,算法需要进一步优化

    +

    2.2 Sparse Table

    +

    Sparse Table(以下称ST表)是用于静态求解 RMQ 问题的数据结构。

    +
    +

    静态求解是指在原始序列不改变的情况下求解问题。或者说,ST表不能直接进行修改操作

    +
    +

    ST表的初始化时间复杂度为O(NlogN)\mathcal O(N\log N),单次查询时间复杂度为O(1)\mathcal O(1)

    +

    2.2.1 存储结构

    +

    ST表的本质是一个N×logNN\times\lceil\log N\rceil的二维数组,其定义如下(令AA表示原数组,求最小值同理):

    +

    st[i][j]=max{Ai,Ai+1,,Ai+2j1}st[i][j]=\max\{A_i,A_{i+1},\dots,A_{i+2^j-1}\} +

    +

    也就是说,st[i][j]st[i][j]表示从AiA_i开始,2j2^j个元素中的最大值。这运用了倍增的思想。

    +

    下面考虑如何快速初始化整个数组。

    +

    2.2.2 初始化

    +

    根据倍增的常用算法,使用类似于DP的方式填满整个表:

    +

    st[i][j]=max{st[i][j1],st[i+2j1][j1]}st[i][j]=\max\{st[i][j-1],st[i+2^{j-1}][j-1]\} +

    +

    填表时,先枚举jj,再枚举ii。由于整个表共有大约NlogNN\log N个状态,而计算一个状态值的时间复杂度为O(1)\mathcal O(1),所以初始化的总时间复杂度为O(NlogN)\mathcal O(N\log N)

    +

    伪代码如下:

    +
    function init() {
    +	for i = 1 to N
    +		st[i][0] = A[i]
    +	for j = 1 to log2(N)
    +		for i = 1 to (N + 1 - 2^j)
    +			st[i][j] = max(st[i][j - 1], st[i + 2^(j-1)][j - 1])
    +}
    +
    +

    C++ 实现:

    +
    void init()
    +{
    +	for(int i=0; i<n; i++)
    +		st[i][0] = A[i];
    +	for(int j=1; j<=log2(n); j++)
    +		for(int i=0; i+(1<<j)<=n; i++) // 注意必须是<=n,1<<j即为2^j
    +			st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
    +}
    +
    +

    2.2.3 查询

    +

    对于[l,r)[l,r)区间的 RMQ 查询,根据ST表的原理,我们要找到两个区间[l,a)[l,a)[b,r)[b,r),使得它们的并集正好为[l,r)[l,r)。即:lbarl\le b\le a\le r

    +
    +

    为什么是并集?
    + \to~因为max(a,a)=a\max(a,a)=a,所以重复的不影响结果。
    + \to~如果出现遗漏,且遗漏的正好为最大/最小值,那会影响最终结果,所以不能遗漏。
    + \to~如果检查到了多余的元素,且多余的正好大于原区间的最大值,会使查询结果变大,所以不能有多余。
    +综上,必须满足[l,a)[l,a)[b,r)[b,r)并集正好为[l,r)[l,r)才能查询。

    +
    +

    要满足上述条件,我们可以aa尽可能靠近rr,让bb尽可能靠近ll,来达到这样的效果。
    +此时,我们还需要满足并集的条件la,brl\le a,b\le r,因此我们需要找到最大的kk,使得a=l+2ka=l+2^kb=r2kb=r-2^k

    +

    则有

    +

    {l+2krr2kl    2krl  klog2(rl)\left\{ \begin{array}{c} +l+2^k\le r \\ +r-2^k\ge l +\end{array} \right.~~\to~~ 2^k\le r-l\\ +~\\ +\to~k\le \log_2(r-l) +

    +

    又因为kk必须是整数,所以取k=log2(rl)k=\lfloor\log_2(r-l)\rfloor即可。

    +
    // query(l, r) = max(A[l], ..., A[r - 1])
    +inline int query(int l, int r)
    +{
    +	int k = log2(r - l);
    +	return max(st[l][k], st[r - (1 << k)][k]);
    +}
    +
    +

    2.2.4 完整实现

    +

    下面给出用Sparse Table解决例题的完整代码。总时间复杂度为O(Q+NlogN)\mathcal O(Q+N\log N)

    +
    #include <cstdio>
    +#include <cmath>
    +#include <algorithm>
    +#define maxn 100005
    +using namespace std;
    +
    +int st[maxn][17]; // 2^17=131072
    +
    +void init(int n)
    +{
    +	for(int j=1, t=log2(n); j<=t; j++)
    +		for(int i=0; i+(1<<j)<=n; i++)
    +			st[i][j] = min(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
    +}
    +
    +inline int query(int l, int r)
    +{
    +	int k = log2(r - l);
    +	return min(st[l][k], st[r - (1 << k)][k]); // 注意此题为min,不是求max
    +}
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", st[i]); // 直接读入到ST表中,节约时间和空间
    +	init(n);
    +	while(q--)
    +	{
    +		int l, r;
    +		scanf("%d%d", &l, &r);
    +		// 此处注意因为是左闭右开区间[l,r),所以只有l需要-1
    +		printf("%d ", query(--l, r));
    +	}
    +	return 0;
    +}
    +
    +AC +

    运行时间:128ms128\mathrm{ms}
    +使用内存:6.90MB6.90\mathrm{MB}

    +

    2.3 树状数组

    +

    关于树状数组的原理我已经在这篇文章中讲过,这里不再多说了。下面我们考虑如何应用树状数组解决 RMQ 问题。

    +

    2.3.1 原算法

    +

    树状数组可以用lowbit操作实现prefixSum(前缀和)以及update(更新)操作,时间复杂度均为O(NlogN)\mathcal O(N\log N)。不仅是加法,对于任意满足结合律的运算这两种操作都有效。

    +

    我们来简单实现一下支持prefixMaxupdate操作的树状数组:

    +
    #define INF 2147483647
    +#define lowbit(x) ((x) & -(x))
    +inline void setmax(int& x, int y) { if(y > x) x = y; }
    +
    +int n, A[N], bit[N];
    +
    +// max(A[1], ..., A[i])
    +inline int prefixMax(int i)
    +{
    +	int res = -INF;
    +	for(; i>0; i-=lowbit(i))
    +		setmax(res, bit[i]);
    +	return res;
    +}
    +
    +// A[i] = max(A[i], val)
    +inline void update(int i, int val)
    +{
    +	for(; i<=n; i+=lowbit(i))
    +		setmax(bit[i], val);
    +}
    +
    +

    若要初始化树状数组,可以利用update操作进行O(NlogN)\mathcal O(N\log N)的初始化:

    +
    inline void init()
    +{
    +	for(int i=1; i<=n; i++)
    +		bit[i] = -INF; // 这一段不要忘!
    +	for(int i=1; i<=n; i++)
    +		update(i, A[i]);
    +}
    +
    +

    另外,我们也可以用子节点直接更新父节点,达到O(N)\mathcal O(N)建树的效果:

    +
    inline void init()
    +{
    +	for(int i=1; i<=n; i++)
    +		bit[i] = A[i];
    +	for(int i=1; i<=n; i++)
    +	{
    +		int j = i + lowbit(i);
    +		if(j <= n) setmax(bit[j], bit[i]);
    +	}
    +}
    +
    +

    考虑加法时我们计算rangeSum(区间和)的算法:

    +
    inline int rangeSum(int l, int r)
    +{
    +	return prefixSum(r) - prefixSum(l - 1);
    +}
    +
    +

    也就是用(A1+A2++Ar)(A1+A2++Al1)=Al++Ar(A_1+A_2+\dots+A_r)-(A_1+A_2+\dots+A_{l-1})=A_l+\dots+A_r

    +

    现在回过来考虑 RMQ 的查询,Min/Max运算不可逆,所以很明显不能用这种计算方式。
    +下面我们来介绍针对 RMQ 的树状数组设计。

    +

    2.3.2 RMQ 树状数组

    +

    我们令f(l,r)f(l,r)表示rangeMax(l, r),即[l,r][l,r]的区间最大值。
    +令t=rlowbit(r)t=r-\mathrm{lowbit}(r)AA表示原序列,BB表示树状数组,考虑如下递推式:

    +

    f(l,r)={max{Br,f(l,t)}(tl)max{Ar,f(l,r1)}(t<l)(l<r)f(l,r)=\begin{cases} +\max\{B_r,f(l,t)\} & (t\ge l)\\ +\max\{A_r,f(l,r-1)\} & (t<l)\\ +-\infty & (l < r) +\end{cases} +

    +
    +

    等式11 证明
    +根据树状数组的定义,Bi=max{Ailowbit(i)+1,,Ai}=f(ilowbit(i)+1,i)B_i=\max\{A_{i-\mathrm{lowbit}(i)+1},\dots,A_i\}=f(i-\mathrm{lowbit}(i)+1,i)
    +又有f(l,r)=max{f(l,t),f(t+1,r)}f(l,r)=\max\{f(l,t),f(t+1,r)\},由于f(t+1,r)=f(rlowbit(r)+1,r)=Brf(t+1,r)=f(r-\mathrm{lowbit}(r)+1,r)=B_r,所以当tlt\ge l时,f(l,r)=max{Br,f(l,t)}f(l,r)=\max\{B_r,f(l,t)\}

    +
    +
    +

    等式22 证明
    +根据max\max操作的结合律可得:f(l,r)=max{f(l,r1),f(r,r)}=max{f(l,r1),Ar}f(l,r)=\max\{f(l,r-1),f(r,r)\}=\max\{f(l,r-1),A_r\}
    +这个等式对于任意rr都成立,但出于时间考虑,我们尽可能使用等式11(如果全用等式22就退化成了O(N)\mathcal O(N)的暴力)。

    +
    +

    代码实现:

    +
    int rangeMax(int l, int r)
    +{
    +	if(l == r) return A[l];
    +	int t = r - lowbit(r);
    +	return t < l?
    +		max(A[r], rangeMax(l, r - 1)):
    +		max(bit[r], rangeMax(l, t));
    +}
    +
    +

    这种查询方式的时间复杂度不好估算,可粗略地记为O(logN)\mathcal O(\log N)。实际情况下,运行时间可能稍大于这个值。
    +另外,此算法对任意满足结合律的运算(如gcdlcm)都有效。

    +

    2.3.3 完整实现

    +

    下面给出用树状数组解决例题的完整代码。总时间复杂度为O(N+QlogN)\mathcal O(N+Q\log N)[1]

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 100005
    +using namespace std;
    +
    +#define lowbit(x) ((x) & -(x))
    +
    +int a[maxn], bit[maxn];
    +
    +int rangeMin(int l, int r)
    +{
    +	if(l == r) return a[l];
    +	int t = r - lowbit(r);
    +	return t < l?
    +		min(a[r], rangeMin(l, r - 1)):
    +		min(bit[r], rangeMin(l, t));
    +}
    +
    +inline void init(int n)
    +{
    +	for(int i=1; i<=n; i++)
    +		bit[i] = a[i];
    +	for(int i=1; i<=n; i++)
    +	{
    +		int j = i + lowbit(i);
    +		if(j <= n)
    +			bit[j] = min(bit[j], bit[i]);
    +	}
    +}
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=1; i<=n; i++)
    +		scanf("%d", a + i);
    +	init(n);
    +	while(q--)
    +	{
    +		int l, r;
    +		scanf("%d%d", &l, &r);
    +		printf("%d ", rangeMin(l, r));
    +	}
    +	return 0;
    +}
    +
    +AC +

    运行时间:207ms207\mathrm{ms}
    +使用内存:1.10MB1.10\mathrm{MB}

    +

    另外,我们还可以把rangeMin写成非递归的形式,以进一步节省运行时间:

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +#define INF 2147483647
    +#define lowbit(x) ((x) & -(x))
    +inline void setmin(int& x, int y) { if(y < x) x = y; }
    +
    +int a[maxn], bit[maxn];
    +
    +int rangeMin(int l, int r)
    +{
    +	int res = INF;
    +	while(l <= r)
    +	{
    +		int t = r - lowbit(r);
    +		if(t < l) setmin(res, a[r--]);
    +		else setmin(res, bit[r]), r = t;
    +	}
    +	return res;
    +}
    +
    +inline void init(int n)
    +{
    +	for(int i=1; i<=n; i++)
    +		bit[i] = a[i];
    +	for(int i=1; i<=n; i++)
    +	{
    +		int j = i + lowbit(i);
    +		if(j <= n) setmin(bit[j], bit[i]);
    +	}
    +}
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=1; i<=n; i++)
    +		scanf("%d", a + i);
    +	init(n);
    +	while(q--)
    +	{
    +		int l, r;
    +		scanf("%d%d", &l, &r);
    +		printf("%d ", rangeMin(l, r));
    +	}
    +	return 0;
    +}
    +
    +AC +

    运行时间:135ms135\mathrm{ms}
    +使用内存:1.14MB1.14\mathrm{MB}

    +

    2.4 线段树

    +

    线段树和树状数组一样,都是解决区间问题的树状结构。不过线段树的应用范围更加广泛,时间复杂度与树状数组基本一致,但每种操作都有一个343\thicksim4之间的常数。线段树建树(初始化)的时间复杂度为O(N)\mathcal O(N),单次区间查询的时间复杂度为O(logN)\mathcal O(\log N)

    +

    RMQ 问题不涉及修改操作,因此我们暂时不考虑这种操作。

    +线段树 +

    如图即为N=10N=10的一棵线段树。可以发现,线段树本质上是一棵二叉树,每个结点代表一个区间,其存储的值为这个区间的区间和(在 RMQ 问题中为区间最大/最小值)。一个结点的左儿子结点和右儿子结点对应区间的并集正好为这个结点对应的区间(叶子结点除外),且左右两区间的长度的差值不超过11

    +

    从树的角度考虑,n1=0n_1=0,即没有子结点数量为11的结点。

    +

    一般的,若一个结点对应的区间为[l,r][l,r]

    +
      +
    • l=rl=r:此结点为叶子结点。
    • +
    • l<rl<r,令m=l+r2m=\lfloor\frac{l+r}2\rfloor: +
        +
      • 左子结点对应的区间为[l,m][l,m]
      • +
      • 右子结点对应的区间为[m+1,r][m+1,r]
      • +
      +
    • +
    +
    +

    顺便纠正一下线段树的几个误区:
    +线段树是一棵完全二叉树。
    +请仔细看看图。
    +线段树是一棵二叉搜索树。
    +反正我是没找到哪里这样定义的。百度百科 OI Wiki
    +线段树上同一深度的结点所对应的区间长度一定相等。
    +看看图,[1,3][1,3][4,5][4,5]两个区间,长度明显不相等。
    +特例:当NN22的整数次幂时,这句话一定成立。

    +
    +

    2.4.1 存储结构

    +

    线段树采用堆式储存法,根结点为11,结点uu的父亲为u2\lfloor\frac u2\rfloor,左子结点为2u2u,右子结点为2u+12u+1

    +

    可以用位运算优化:

    +
      +
    • uu的父亲:u2= \lfloor\frac u2\rfloor=~u >> 1
    • +
    • uu的左儿子:2u= 2u=~u << 1
    • +
    • uu的右儿子:2u+1= 2u+1=~u << 1 | 1(或u << 1 ^ 1
    • +
    +
    // 数组定义
    +int a[N], c[4 * N];
    +
    +// 宏定义
    +#define INF 2147483647
    +#define ls(x) (x << 1) // 左儿子结点
    +#define rs(x) (x << 1 | 1) // 右儿子结点
    +#define par(x) (x >> 1) // 父亲结点
    +
    +

    下文中,我们令NN表示元素个数,AA表示原数组,CC表示线段树(数组形式存储)。
    +可以证明,线段树的结点个数不会超过4N54N-5,所以我们可以把CC的长度设为4N4N

    +

    2.4.2 建树(初始化)

    +

    对于一个结点数据的计算,我们可以先递归地初始化其左子树,再到右子树,最后两儿子的数据取max\max即可。

    +

    代码实现:

    +
    // 结点p, 区间[l, r]建树
    +void build(int l, int r, int p)
    +{
    +	if(l == r)
    +	{
    +		c[p] = a[l];
    +		return;
    +	}
    +	int m = l + r >> 1;
    +	build(l, m, ls(p));
    +	build(m + 1, r, rs(p));
    +	c[p] = max(c[ls(p)], c[rs(p)]);
    +}
    +
    +

    2.4.3 区间查询

    +

    同样采用递归的方式,设pp为当前结点,[l,r][l,r]为当前结点区间,[a,b][a,b]为当前查询区间,函数返回[l,r][l,r][a,b][a,b]交集区间和

    +
      +
    • 如果[l,r][l,r][a,b][a,b]的子集(alrba\le l\le r\le b),直接返回当前结点对应的区间和。
    • +
    • 否则,递归查询左右子树,如果没有交集则不查询。返回查询的子树的最大值。
    • +
    +

    如果上面不是很好理解,可以直接看代码实现:

    +
    // 结点p, 查询区间[a, b], 当前区间[l, r]
    +int query(int l, int r, int a, int b, int p)
    +{
    +	if(a <= l && r <= b) return c[p];
    +	int m = l + r >> 1, res = -INF;
    +	if(m >= a) res = max(res, query(l, m, a, b, ls(p)));
    +	// m + 1 <= b 即为 m < b
    +	if(m < b) res = max(res, query(m + 1, r, a, b, rs(p)));
    +	return res;
    +}
    +
    +

    2.4.4 完整实现

    +

    下面给出用线段树解决例题的完整代码。总时间复杂度为O(N+QlogN)\mathcal O(N+Q\log N)

    +
    #include <cstdio>
    +#include <algorithm>
    +#define maxn 100005
    +using namespace std;
    +
    +#define INF 2147483647
    +#define ls(x) (x << 1)
    +#define rs(x) (x << 1 | 1)
    +#define par(x) (x >> 1)
    +
    +int a[maxn], c[maxn << 2];
    +
    +void build(int l, int r, int p)
    +{
    +	if(l == r)
    +	{
    +		c[p] = a[l];
    +		return;
    +	}
    +	int m = l + r >> 1;
    +	build(l, m, ls(p));
    +	build(m + 1, r, rs(p));
    +	c[p] = min(c[ls(p)], c[rs(p)]);
    +}
    +
    +int query(int l, int r, int a, int b, int p)
    +{
    +	if(a <= l && r <= b) return c[p];
    +	int m = l + r >> 1, res = INF;
    +	if(m >= a) res = min(res, query(l, m, a, b, ls(p)));
    +	if(m < b) res = min(res, query(m + 1, r, a, b, rs(p)));
    +	return res;
    +}
    +
    +int main()
    +{
    +	int n, q;
    +	scanf("%d%d", &n, &q);
    +	for(int i=0; i<n; i++)
    +		scanf("%d", a + i);
    +	build(0, n - 1, 1);
    +	while(q--)
    +	{
    +		int l, r;
    +		scanf("%d%d", &l, &r);
    +		printf("%d ", query(0, n - 1, --l, --r, 1));
    +	}
    +	return 0;
    +}
    +
    +AC +

    运行时间:163ms163\mathrm{ms}
    +使用内存:1.78MB1.78\mathrm{MB}

    +

    3. 总结

    +

    我们来对比一下四种算法,从理论的角度:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    算法预处理时间复杂度单次查询时间复杂度空间复杂度符合题目要求?[2]
    暴力O(1)\mathcal O(1)O(N)\mathcal O(N)O(N)\mathcal O(N)
    ST表O(NlogN)\mathcal O(N\log N)O(1)\mathcal O(1)O(NlogN)\mathcal O(N\log N)✔️
    树状数组O(N)\mathcal O(N)O(NlogN)\mathcal O(N\log N)O(logN)\mathcal O(\log N)O(N)\mathcal O(N)✔️
    线段树O(N)\mathcal O(N)O(logN)\mathcal O(\log N)O(N)\mathcal O(N)✔️
    +

    洛谷 P1816上实际运行情况的角度(暴力TLE,不考虑):

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    算法运行时间内存占用代码长度
    ST表128ms128\mathrm{ms}6.90MB6.90\mathrm{MB}625B625\mathrm B
    树状数组(递归)[3]207ms207\mathrm{ms}1.10MB1.10\mathrm{MB}720B720\mathrm B
    树状数组(非递归)[3:1]135ms135\mathrm{ms}1.14MB1.14\mathrm{MB}786B786\mathrm B
    线段树163ms163\mathrm{ms}1.78MB1.78\mathrm{MB}905B905\mathrm B
    +

    可以看出,ST表写起来简单省事,运行时间也是最快,不过内存占用稍高,毕竟空间复杂度是O(NlogN)\mathcal O(N\log N)
    +树状数组可以说是均衡了时间与空间,尽量使用非递归查询,比递归速度快53%53\%,当然如果想省事也可以使用递归式查询;
    +线段树可以说是完全输给了树状数组(非递归),不过线段树功能比较多,用来做 RMQ 可以说是大材小用。所以线段树在 RMQ 问题中没什么优势,有一些缺点还是可以理解的。

    +
    +

    本文到此结束,希望大家给个三连!
    +这也是我在20232023年写的第一篇文章(也是我的第一篇万字长文),祝大家新年快乐!

    +
    +
    +
      +
    1. 直接调用update建树的方法总时间复杂度为O((N+Q)logN)\mathcal O((N+Q)\log N),这里采用的是前面说的O(N)\mathcal O(N)快速建树。在此问题中,由于不需要修改,使用O(N)\mathcal O(N)建树可省去update方法。 ↩︎

      +
    2. +
    3. 洛谷 P1816为准,N105N\le 10^5,所以单次查询时间复杂度不能超过O(N)\mathcal O(\sqrt N)↩︎

      +
    4. +
    5. 此处指递归/非递归的单次查询实现,两者其他操作完全一致。 ↩︎ ↩︎

      +
    6. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/algonotes-tree-dp/index.html b/post/algonotes-tree-dp/index.html new file mode 100644 index 00000000..5d6a62c4 --- /dev/null +++ b/post/algonotes-tree-dp/index.html @@ -0,0 +1,675 @@ + + + + + +【算法笔记】树形DP算法总结&详解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【算法笔记】树形DP算法总结&详解 +

    + +
    +
    + 2022-08-12 · 12 min read +
    + + + + 算法笔记 + + + + + 算法竞赛 + + +
    +

    0. 定义

    +

    树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。

    +

    1. 基础

    +

    f[u]= f[u]=~与树上顶点uu有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行DP\text{DP},确保在更新一个顶点时其子节点的dp值已经被更新好,以更新当前节点的DP\text{DP}值。为方便计算,一般写成dfs的形式,如下:

    +
    void dfs(int v) { // 遍历节点v
    +	dp[v] = ...; // 初始化
    +	for(int u: G[v]) { // 遍历v的所有子节点
    +		dfs(u);
    +		update(u, v); // 用子节点的dp值对当前节点的dp值进行更新
    +	}
    +}
    +
    +

    下面来看一道简单的例题:

    +

    【例1.1】子树大小

    +
    +

    给定一棵有NN个结点的树,根结点为结点11。对于i=1,2,,Ni=1,2,\dots,N,求以结点ii为根的子树大小(即子树上结点的个数,包括根结点)。

    +
    +

    本题明显可以使用树形DP的方法,令f[v]= f[v]=~vv为根的子树大小,则易得

    +

    f[v]=1+i=1degvG[v][i]f[v]=1+\sum_{i=1}^{\text{deg}_v} G[v][i] +

    +

    即:一个结点的子树大小 =1~=1(根节点)+ +~每个子树的大小。

    +

    沿用刚才的模板,可得:

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 100
    +using namespace std;
    +
    +vector<int> G[maxn]; // 邻接表
    +int sz[maxn]; // dp数组,sz[v] = 子树v的大小
    +
    +void dfs(int v)
    +{
    +	sz[v] = 1; // 初始化,最初大小为1,后面累加
    +	for(int u: G[v]) // 遍历子结点
    +	{
    +		dfs(u); // 先对子结点进行dfs
    +		sz[v] += sz[u]; // 更新当前子树的大小
    +	}
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n); // 结点个数
    +	for(int i=1; i<n; i++) // N-1条边
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v); // 读入一条边
    +		G[u].push_back(v); // 存入邻接表
    +	}
    +	dfs(1);
    +	for(int i=1; i<=n; i++)
    +		printf("%d\n", sz[i]);
    +	return 0;
    +}
    +
    +

    下面来看一道稍微复杂一点的题:

    +

    【例1.2】洛谷P1352 没有上司的舞会

    +

    本题即树的最大独立集问题。

    +
    +

    NN名职员,编号为1N1\dots N,他们的关系就像一棵以老板为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数rir_i,现在要召开一场舞会,使得没有职员和直接上司一起参会。主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

    +
    +

    f(v)f(v)表示以vv为根的子树中,选择vv的最优解,g(v)g(v)表示以vv为根的子树中,不选vv的最优解。

    +

    则对于每个状态,都存在两种决策(其中uu代表vv的儿子):

    +
      +
    • 不选vv时,可选也可不选uu,此时有g(v)=max{f(u),g(u)}g(v)=\sum\max\{f(u),g(u)\}
    • +
    • 选择vv时,一定不能选uu,此时有f(v)=ri+g(u)f(v)=r_i+\sum g(u)
    • +
    +

    时间复杂度为O(N)\mathcal O(N)
    +注意本题需要寻找根节点,没有上司的结点即为根节点,读入时用数组标记即可。

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 6005
    +using namespace std;
    +
    +inline int max(int x, int y) { return x > y? x: y; }
    +
    +vector<int> G[maxn]; // 邻接表
    +bool bad[maxn]; // 根结点标记
    +int f[maxn], g[maxn]; // 数据存储
    +
    +void dfs(int v) // 遍历结点v
    +{
    +	// 读入时已初始化,这里可省略
    +	for(int u: G[v]) // 遍历子结点
    +	{
    +		dfs(u); // 先对子结点进行dfs
    +		// 更新当前dp状态
    +		f[v] += g[u]; // 选择v,不能选u
    +		g[v] += max(f[u], g[u]); // 不选v,u可选可不选
    +	}
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n); // 结点个数
    +	for(int i=0; i<n; i++)
    +		scanf("%d", f + i); // 相当于提前初始化好f[i]=r[i]
    +	for(int i=1; i<n; i++) // N-1条边
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v); // 读入一条边
    +		G[--v].push_back(--u); // 0-index,存入邻接表
    +		bad[u] = true; // 标记不可能是根结点
    +	}
    +	int root = -1; // 根结点变量
    +	for(int i=0; i<n; i++)
    +		if(!bad[i]) // 找到根结点
    +		{
    +			root = i; // 记录根结点
    +			break;
    +		}
    +	dfs(root); // 开始进行树形DP
    +	printf("%d\n", max(f[root], g[root])); // 根结点也有两种选择
    +	return 0;
    +}
    +
    +

    习题

    + +

    2. 树上背包

    +

    在基本算法之上,树形dp还可以用于树上背包问题。来看一道例题:

    +

    【例2.1】洛谷P2014 / AcWing 286 选课

    +
    +

    NN门课,第ii门课的学分是sis_i每门课有不超过一门先修课,需要上了先修课才能上这门课。现要选MM门课,使得学分总和最大。

    +
    +

    每门课最多只有一门先修课,这符合树结构的特点,与有根树中一个点最多只有一个父亲结点的特点类似。因此,我们根据数据构造一棵树,课程的先修课为这门课的父结点。又由于给定的输入是一个森林(多棵树组成的不一定连通的图),不是一棵完整的树,因此我们添加虚拟根结点00s0=0s_0=0),将没有先修课的结点全部连到它下面,并从这里开始dfs。注意此时必须选中00号结点(它是所有课程的直接或间接先修课),所以操作前先将MM加上11

    +

    格式问题解决,下面考虑如何DP\text{DP}
    +令f[i][j]f[i][j]表示当前在结点ii、且已经选了jj门课时的最大学分数量,则答案为f[0][M+1]f[0][M+1]。状态转移方程等详见代码。时间复杂度为O(NM)\mathcal O(NM),有兴趣的可以自己尝试证明。

    +
    #include <cstdio>
    +#include <vector>
    +#include <algorithm>
    +#define maxn 305
    +using namespace std;
    +
    +// dp算法中常用的模板,等效于x=max(x,y)
    +inline void setmax(int& x, int y)
    +{
    +	if(x < y) x = y;
    +}
    +
    +vector<int> G[maxn]; // 邻接表
    +int n, m, f[maxn][maxn];
    +
    +int dfs(int u) // 遍历结点u,返回值为其子树大小
    +{
    +	int tot = 1; // 记录子树大小,初始为1
    +	for(int v: G[u]) // 遍历u的所有子结点
    +	{
    +		int sz = dfs(v); // 对当前子结点进行搜索
    +		// 状态转移,注意i倒序,防止串连转移现象
    +		for(int i=min(tot, m); i>0; i--) // 子树大小优化可降低算法复杂度
    +			for(int j=1, lim=min(sz, m-i); j<=lim; j++)
    +				setmax(f[u][i + j], f[u][i] + f[v][j]); // 更新状态
    +		tot += sz; // 加到当前子树下
    +	}
    +	return tot; // 返回子树大小
    +}
    +
    +int main()
    +{
    +	scanf("%d%d", &n, &m);
    +	for(int i=1; i<=n; i++)
    +	{
    +		int a;
    +		scanf("%d%d", &a, f[i] + 1); // 初始化f[i][1]=s[i]
    +		G[a].push_back(i);
    +	}
    +	m ++; // 别忘了这一句
    +	dfs(0);
    +	printf("%d\n", f[0][m]);
    +	return 0;
    +}
    +
    +

    习题

    + +

    3. 换根 DP

    +

    换根DP,即为不知道根结点时使用的一种树形DP,时间复杂度一般为O(N)\mathcal O(N)

    +

    【例3.1】洛谷 P3478 [POI2008] STA-Station

    +
    +

    给定一个nn个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大。

    +
    +

    先考虑最简单粗暴的方法,即为枚举所有结点,代码如下:

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 1000005
    +using namespace std;
    +
    +vector<int> G[maxn];
    +
    +int dfs(int v, int d, int par)
    +{
    +	int s = d;
    +	for(int u: G[v])
    +		if(u != par)
    +			s += dfs(u, d + 1, v);
    +	return s;
    +}
    +
    +int main()
    +{
    +	int n;
    +	scanf("%d", &n);
    +	for(int t=n; --t; )
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[--u].push_back(--v);
    +		G[v].push_back(u);
    +	}
    +	int ans = 0, maxDepth = dfs(0, 0, -1);
    +	for(int root=1; root<n; root++)
    +	{
    +		int d = dfs(root, 0, -1);
    +		if(d > maxDepth) ans = root, maxDepth = d;
    +	}
    +	printf("%d\n", ++ans);
    +	return 0;
    +}
    +
    +

    很明显,这种做法时间复杂度为O(n2)\mathcal O(n^2),又因为n106n\le 10^6,所以无法得全分,评测结果如下:
    +评测结果

    +

    好家伙,居然还有50分,本以为最多30..

    +

    下面来考虑换根DP的方法。不妨令uu为当前结点,vv为其子结点。先预处理出每个结点的子树大小s[u]=1+s[v]s[u]=1+\sum s[v]和以11为根结点时所有结点的深度(depthi\text{depth}_i),此时第一遍DFS即为预处理。

    +

    fuf_u表示以uu为根时,所有结点的总深度和,则f1=depthif_1=\sum\text{depth}_i
    +考虑fufvf_u\to f_v的转移,即“根结点从uu变成vv时所有结点深度和的变化”,则有:

    +
      +
    • 所有在vv的子树上的结点深度全部1-1,则总深度和减少svs_v
    • +
    • 所有不在vv的子树上的结点深度都+1+1,则总深度和增加nsvn-s_v
    • +
    +

    此时,可得fv=fusv+nsv=fu+n2svf_v=f_u-s_v+n-s_v=f_u+n-2s_v。注意数据类型,使用long long

    +
    #include <cstdio>
    +#include <vector>
    +#define maxn 1000005
    +using namespace std;
    +
    +using LL = long long;
    +
    +vector<int> G[maxn];
    +LL sz[maxn], f[maxn];
    +int n, ans;
    +
    +LL dfs1(int v, int d, int par)
    +{
    +	sz[v] = 1;
    +	LL s = d;
    +	for(int u: G[v])
    +		if(u != par)
    +			s += dfs1(u, d + 1, v), sz[v] += sz[u];
    +	return s;
    +}
    +
    +void dfs2(int v, int par)
    +{
    +	if(f[v] > f[ans]) ans = v;
    +	for(int u: G[v])
    +		if(u != par)
    +		{
    +			f[u] = f[v] + n - (sz[u] << 1LL);
    +			dfs2(u, v);
    +		}
    +}
    +
    +int main()
    +{
    +	scanf("%d", &n);
    +	for(int t=n; --t; )
    +	{
    +		int u, v;
    +		scanf("%d%d", &u, &v);
    +		G[--u].push_back(--v);
    +		G[v].push_back(u);
    +	}
    +	f[0] = dfs1(0, 0, -1);
    +	dfs2(0, -1);
    +	printf("%d\n", ++ans);
    +	return 0;
    +}
    +
    +AC +

    习题

    + +

    4. 后记

    +

    好像这玩意也并不是开头所说的那么难…… 记得给个三连哦!

    +

    参考文献:

    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/arc138_b/index.html b/post/arc138_b/index.html new file mode 100644 index 00000000..2138a607 --- /dev/null +++ b/post/arc138_b/index.html @@ -0,0 +1,390 @@ + + + + + +ARC138 B - 01 Generation 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + ARC138 B - 01 Generation 题解 +

    + +
    +
    + 2022-04-14 · 3 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    ARC138 B - 01 Generation

    +

    思路

    +

    考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No,否则输出Yes

    +

    下面我们来证明这个方法的正确性:

    +
      +
    • 首先,假设有一个序列AA按照上述方法输出No,但正确答案为Yes
    • +
    • 则一定在某一步(可能是第一步)只能先倒推操作A,而不是操作B,设这一步执行前的序列为SS
    • +
    • 此时,令N=SN=|S|,则S1=SN=0S_1=S_N=0
    • +
    • 如果先倒推操作A,得到(S2,S3,,SN1,1)(S_2,S_3,\dots,S_{N-1},1)
    • +
    • 如果先倒推操作B,得到(S1,S2,,SN1)(S_1,S_2,\dots,S_{N-1})
    • +
    • 对比两个序列,发现先倒推操作B不会影响后续倒推A的结果,因此,序列SS不存在
    • +
    • 结论:做法正确。
    • +
    +

    代码

    +

    代码实现时,没有必要真正翻转序列,只需记录当前翻转的状态(0011),记为flipped\text{flipped},则实际的Ai=AiflippedA_i=A_i'\oplus\text{flipped}(其中AiA_i'为输入的AA\oplus表示异或/XOR操作)。

    +

    删除时可以使用deque或者数组l,rl,r端点记录。

    +
    #include <cstdio>
    +#define maxn 200005
    +using namespace std;
    +
    +bool a[maxn];
    +
    +int main()
    +{
    +	int n = 0;
    +	char c;
    +	while((c = getchar()) != '\n')
    +		n = (n << 3) + (n << 1) + (c ^ 48);
    +	for(int i=0; i<n; i++, getchar())
    +		a[i] = getchar() ^ 48;
    +	bool flipped = false;
    +	for(int l=0, r=n-1; a[l]==flipped; flipped^=1, l++)
    +		while(!a[r] ^ flipped)
    +			if(l > --r)
    +				return puts("Yes"), 0;
    +	puts("No");
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/atcoder-all/index.html b/post/atcoder-all/index.html new file mode 100644 index 00000000..92b3886a --- /dev/null +++ b/post/atcoder-all/index.html @@ -0,0 +1,345 @@ + + + + + +AtCoder题解集锦 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + AtCoder题解集锦 +

    + +
    +
    + 2022-04-15 · 1 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/cf1307/index.html b/post/cf1307/index.html new file mode 100644 index 00000000..7283dcac --- /dev/null +++ b/post/cf1307/index.html @@ -0,0 +1,666 @@ + + + + + +CodeForces Round #621 ABC (1307A+1307B+1307C) 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + CodeForces Round #621 ABC (1307A+1307B+1307C) 题解 +

    + +
    +
    + 2020-02-22 · 13 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    A. Cow and Haybales

    +

    题面

    +

    The USA Construction Operation (USACO) recently ordered Farmer John to arrange a row of n haybale piles on the farm. The ii-th pile contains aia_i haybales.

    +

    However, Farmer John has just left for vacation, leaving Bessie all on her own. Every day, Bessie the naughty cow can choose to move one haybale in any pile to an adjacent pile. Formally, in one day she can choose any two indices ii and jj (1i,jn1\le i,j\le n) such that ij=1|i−j|=1 and ai>0a_i>0 and apply ai=ai1a_i=a_i−1, aj=aj+1a_j = a_j + 1. She may also decide to not do anything on some days because she is lazy.

    +

    Bessie wants to maximize the number of haybales in pile 11 (i.e. to maximize a1a_1), and she only has dd days to do so before Farmer John returns. Help her find the maximum number of haybales that may be in pile 11 if she acts optimally!

    +

    输入

    +

    The input consists of multiple test cases. The first line contains an integer tt (1t1001\le t\le 100) — the number of test cases. Next 2t2t lines contain a description of test cases — two lines per test case.

    +

    The first line of each test case contains integers nn and dd (1n,d1001\le n,d\le 100) — the number of haybale piles and the number of days, respectively.

    +

    The second line of each test case contains nn integers a1,a2,,ana_1,a_2,\dots,a_n (0ai100)(0\le a_i\le 100) — the number of haybales in each pile.

    +

    输出

    +

    For each test case, output one integer: the maximum number of haybales that may be in pile 11 after dd days if Bessie acts optimally.

    +

    样例

    +

    输入

    +
    3
    +4 5
    +1 0 3 2
    +2 2
    +100 1
    +1 8
    +0
    +
    +

    输出

    +
    3
    +101
    +0
    +
    +

    注释

    +

    In the first test case of the sample, this is one possible way Bessie can end up with 33 haybales in pile 11:

    +
      +
    • On day one, move a haybale from pile 33 to pile 22
    • +
    • On day two, move a haybale from pile 33 to pile 22
    • +
    • On day three, move a haybale from pile 33 to pile 11
    • +
    • On day four, move a haybale from pile 22 to pile 11
    • +
    • On day five, do nothing
    • +
    +

    In the second test case of the sample, Bessie can do nothing on the first day and move a haybale from pile 22 to pile 11 on the second day.

    +

    解题思路

    +

    贪心算法:先把第二堆的移到第一堆,再把第三堆的移到第一堆,……
    +题目中的样例解释有点误导(😦)

    +

    代码

    +
    #include <cstdio>
    +#define maxn 105
    +using namespace std;
    +
    +inline int min(int a, int b)
    +{
    +	return a < b? a: b;
    +}
    +
    +int main(int argc, char** argv)
    +{
    +	int T;
    +	scanf("%d", &T);
    +	while(T--)
    +	{
    +		int n, d, first;
    +		scanf("%d%d%d", &n, &d, &first);
    +		for(int i=1; i<n; i++)
    +		{
    +			int x;
    +			scanf("%d", &x);
    +			if(d >= i)
    +			{
    +				int num = min(d / i, x); // The max number of haybales bessie can take to pile 1
    +				d -= num * i;
    +				first += num;
    +			}
    +		}
    +		printf("%d\n", first);
    +	}
    +	return 0;
    +}
    +
    +
    +

    B. Cow and Friend

    +

    题面

    +

    Bessie has way too many friends because she is everyone's favorite cow! Her new friend Rabbit is trying to hop over so they can play!

    +

    More specifically, he wants to get from (0,0)(0,0) to (x,0)(x,0) by making multiple hops. He is only willing to hop from one point to another point on the 2D plane if the Euclidean distance between the endpoints of a hop is one of its n favorite numbers: a1,a2,,ana_1,a_2,…,a_n. What is the minimum number of hops Rabbit needs to get from (0,0)(0,0) to (x,0)(x,0)? Rabbit may land on points with non-integer coordinates. It can be proved that Rabbit can always reach his destination.

    +

    Recall that the Euclidean distance between points (xi,yi)(x_i,y_i) and (xj,yj)(x_j,y_j) is (xixj)2+(yiyj)2\sqrt{(x_i−x_j)^2+(y_i−y_j)^2}.

    +

    For example, if Rabbit has favorite numbers 1 and 3 he could hop from (0,0)(0,0) to (4,0)(4,0) in two hops as shown below. Note that there also exists other valid ways to hop to (4,0)(4,0) in 22 hops (e.g. (0,0)(2,5)(4,0)(0,0)\to(2, \sqrt 5)\to(4,0)).

    + +

    Here is a graphic for the first example. Both hops have distance 33, one of Rabbit's favorite numbers.

    +

    In other words, each time Rabbit chooses some number aia_i and hops with distance equal to aia_i in any direction he wants. The same number can be used multiple times.

    +

    输入

    +

    The input consists of multiple test cases. The first line contains an integer tt (1t10001\le t\le 1000) — the number of test cases. Next 2t2t lines contain test cases — two lines per test case.

    +

    The first line of each test case contains two integers nn and xx (1n1051\le n\le 10^5, 1x1091\le x\le 10^9) — the number of favorite numbers and the distance Rabbit wants to travel, respectively.

    +

    The second line of each test case contains nn integers a1,a2,,ana_1, a_2, \dots, a_n (1ai1091\le a_i \le 10^9) — Rabbit's favorite numbers. It is guaranteed that the favorite numbers are distinct.

    +

    It is guaranteed that the sum of nn over all the test cases will not exceed 10510^5.

    +

    输出

    +

    For each test case, print a single integer — the minimum number of hops needed.

    +

    样例

    +

    输入

    +
    4
    +2 4
    +1 3
    +3 12
    +3 4 5
    +1 5
    +5
    +2 10
    +15 4
    +
    +

    输出

    +
    2
    +3
    +1
    +2
    +
    +

    注释

    +

    The first test case of the sample is shown in the picture above. Rabbit can hop to (2,5)(2, \sqrt 5), then to (4,0)(4,0) for a total of two hops. Each hop has a distance of 33, which is one of his favorite numbers.

    +

    In the second test case of the sample, one way for Rabbit to hop 33 times is: (0,0)(4,0)(8,0)(12,0)(0,0) → (4,0) → (8,0) → (12,0).

    +

    In the third test case of the sample, Rabbit can hop from (0,0)(0,0) to (5,0)(5,0).

    +

    In the fourth test case of the sample, Rabbit can hop: (0,0)(5,102)(10,0)(0,0) → (5,10\sqrt2) → (10,0).

    +

    解题思路

    +

    纯数学!!!

    +

    代码

    +
    #include <cstdio>
    +#define maxn 100005
    +using namespace std;
    +
    +int fav[maxn], n, d;
    +
    +int calc(int x)
    +{
    +	int tm = d / x, leftdist = d % x;
    +	if(leftdist == 0) return tm;
    +	if(tm == 0)
    +	{
    +		for(int i=0; i<n; i++)
    +			if(fav[i] == leftdist)
    +				return 1;
    +		return 2;
    +	}
    +	return tm + 1;
    +}
    +
    +int main(int argc, char** argv)
    +{
    +	int T;
    +	scanf("%d", &T);
    +	while(T--)
    +	{
    +		scanf("%d%d", &n, &d);
    +		int maxf = -1;
    +		for(int i=0; i<n; i++)
    +		{
    +			scanf("%d", fav + i);
    +			if(fav[i] > maxf) maxf = fav[i];
    +		}
    +		printf("%d\n", calc(maxf));
    +	}
    +	return 0;
    +}
    +
    +
    +

    C. Cow and Message

    +

    题面

    +

    Bessie the cow has just intercepted a text that Farmer John sent to Burger Queen! However, Bessie is sure that there is a secret message hidden inside.

    +

    The text is a string SS of lowercase Latin letters. She considers a string tt as hidden in string SS if tt exists as a subsequence of SS whose indices form an arithmetic progression. For example, the string aab is hidden in string aaabb because it occurs at indices 11, 33, and 55, which form an arithmetic progression with a common difference of 22. Bessie thinks that any hidden string that occurs the most times is the secret message. Two occurrences of a subsequence of SS are distinct if the sets of indices are different. Help her find the number of occurrences of the secret message!

    +

    For example, in the string aaabb, a is hidden 33 times, b is hidden 22 times, ab is hidden 66 times, aa is hidden 33 times, bb is hidden 11 time, aab is hidden 22 times, aaa is hidden 11 time, abb is hidden 11 time, aaab is hidden 11 time, aabb is hidden 11 time, and aaabb is hidden 11 time. The number of occurrences of the secret message is 66.

    +

    输入

    +

    The first line contains a string SS of lowercase Latin letters (1S1051\le |S|\le 105) — the text that Bessie intercepted.

    +

    输出

    +

    Output a single integer — the number of occurrences of the secret message.

    +

    样例

    +

    输入 #1

    +
    aaabb
    +
    +

    输出 #1

    +
    6
    +
    +

    输入 #2

    +
    usaco
    +
    +

    输出 #2

    +
    1
    +
    +

    输入 #3

    +
    lol
    +
    +

    输出 #3

    +
    2
    +
    +

    注释

    +

    In the first example, these are all the hidden strings and their indice sets:

    +
      +
    • a occurs at (1),(2),(3)(1), (2), (3)
    • +
    • b occurs at (4),(5)(4), (5)
    • +
    • ab occurs at (1,4),(1,5),(2,4),(2,5),(3,4),(3,5)(1,4), (1,5), (2,4), (2,5), (3,4), (3,5)
    • +
    • aa occurs at (1,2),(1,3),(2,3)(1,2), (1,3), (2,3)
    • +
    • bb occurs at (4,5)(4,5)
    • +
    • aab occurs at (1,3,5),(2,3,4)(1,3,5), (2,3,4)
    • +
    • aaa occurs at (1,2,3)(1,2,3)
    • +
    • abb occurs at (3,4,5)(3,4,5)
    • +
    • aaab occurs at (1,2,3,4)(1,2,3,4)
    • +
    • aabb occurs at (2,3,4,5)(2,3,4,5)
    • +
    • aaabb occurs at (1,2,3,4,5)(1,2,3,4,5)
      +Note that all the sets of indices are arithmetic progressions.
      +In the second example, no hidden string occurs more than once.
    • +
    +

    In the third example, the hidden string is the letter l.

    +

    解题思路

    +

    动态规划

    +

    代码

    +
    #include <cstdio>
    +#define maxn 100005
    +#define let 26
    +using namespace std;
    +
    +typedef long long LL;
    +
    +char s[maxn], c;
    +LL cnt1[let][maxn], cnt2[let][let];
    +
    +int main(int argc, char** argv)
    +{
    +	cnt1[(s[0] = getchar()) - 'a'][0] ++;
    +	int slen = 1;
    +	while((c = getchar()) != '\n')
    +	{
    +		s[slen] = c;
    +		for(int i=0; i<let; i++)
    +			cnt1[i][slen] = cnt1[i][slen - 1];
    +		cnt1[c - 'a'][slen++] ++;
    +	}
    +	int last = slen - 1;
    +	for(int i=0; i<let; i++) if(cnt1[i][last])
    +	{
    +		cnt2[i][i] = cnt1[i][last] * (cnt1[i][last] - 1) >> 1;
    +		for(int j=0; j<slen; j++)
    +			if(s[j] != i + 'a')
    +				cnt2[i][s[j] - 'a'] += cnt1[i][last] - cnt1[i][j];
    +	}
    +	LL maxcnt = -1;
    +	for(int i=0; i<let; i++)
    +	{
    +		if(cnt1[i][last] && cnt1[i][last] > maxcnt) maxcnt = cnt1[i][last];
    +		for(int j=0; j<let; j++)
    +			if(cnt2[i][j] && cnt2[i][j] > maxcnt)
    +				maxcnt = cnt2[i][j];
    +	}
    +	printf("%lld\n", maxcnt);
    +	return 0;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/csps2023-t3/index.html b/post/csps2023-t3/index.html new file mode 100644 index 00000000..c9b5dc5d --- /dev/null +++ b/post/csps2023-t3/index.html @@ -0,0 +1,939 @@ + + + + + +洛谷 P9754 [CSP-S 2023] 结构体 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 洛谷 P9754 [CSP-S 2023] 结构体 题解 +

    + +
    +
    + 2023-10-29 · 16 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    题目传送门
    +洛谷博客 CSDN

    +

    CSP-S 2023 T3 结构体 题解

    +

    基本思路

    +

    本题主要考查编码能力,所以直接给出基本思路:

    +
      +
    • 由于可以递归式的创建元素,最多可以同时存在 100100100^{100} 个不同的基础类型的元素。即使算上最大地址的限制,元素的数量也能达到 101810^{18}。显然,依次构造每个元素,在空间和时间上都是无法接受的。
    • +
    • 然而,由于询问数量有限,真正能在查询时用到的元素数量相对很少。因此,我们只需维护一个顶层元素(不隶属于任何其他元素的元素)列表,再根据查询的地址或名称逐层向下找到需要的元素即可。以下是四种操作的具体做法: +
        +
      • 对于 op=1op=1:储存当前类型信息,计算大小和对齐要求并输出。
      • +
      • 对于 op=2op=2:用一个变量记录当前第一个可分配内存的地址,操作时先对齐后计算、输出。
      • +
      • 对于 op=3op=3:从顶层开始,逐层向下寻找,计算地址并输出。
      • +
      • 对于 op=4op=4:从顶层开始,维护当前考查的元素地址,并与给定地址比对,最终输出底层元素名称。
      • +
      +
    • +
    +

    由以上思路,很容易想到下面三种类型的存储方式:

    +
      +
    1. 类型名称作为类型的唯一的标识符。这是最直观的做法,但是效率低下且使用起来较为繁琐,pass。
    2. +
    3. 用 map 将类型名称映射到序号,来代表一种数据类型。相比第一种做法,效率高了很多,但是写起来仍然很麻烦,pass。
    4. +
    5. 用结构体存储类型信息,并使用指针来处理类型之间的关联。这种做法不仅高效,而且编码时也很直观,所以我们将采用这种存储方式。
    6. +
    +

    分步详解

    +

    准备

    +

    LL 表示 long longsetmax(x, y) 等同于 x = max(x, y)

    +
    inline void setmax(int& x, int y)
    +{
    +    if(x < y) x = y;
    +}
    +
    +using LL = long long;
    +
    +

    数据类型的存储

    +

    定义 struct DataType,表示一种数据类型:

    +
    struct DataType
    +{
    +    const string name; // 类型名
    +    LL size, actual_size; // 对齐后的大小和实际大小(有数据的部分的长度)
    +    int indent; // 对齐要求
    +    vector<pair<DataType*, string>> members; // 类型成员,<成员类型指针,成员名称> 方式存储
    +};
    +
    +

    对齐操作,依照如下公式:

    +

    =×{对齐后的地址} = \lceil \frac {对齐前的地址} {对齐要求} \rceil \times {对齐要求} +

    +
    inline LL shift(LL addr)
    +{
    +    return addr % indent? (addr / indent + 1) * indent: addr;
    +}
    +
    +

    维护操作,用于操作 11 后计算大小:

    +
    inline void maintain()
    +{
    +    size = indent = 0;
    +    for(const auto& m: members)
    +    {
    +        setmax(indent, m.first->indent);
    +        size = m.first->shift(size) + m.first->size;
    +    }
    +    actual_size = size;
    +    size = shift(size);
    +}
    +
    +

    注意 shiftmaintain 都是 DataType 的成员函数。

    +

    主函数中,用一个 unordered_map 记录类型名到数据类型的映射关系

    +
    unordered_map<string, DataType*> types;
    +
    +

    添加基本类型

    +
    auto add_base_type = [&](string name, int size) -> void {
    +    DataType* t = new DataType(name);
    +    t->size = t->indent = t->actual_size = size;
    +    types[name] = t;
    +};
    +add_base_type("byte", 1);
    +add_base_type("short", 2);
    +add_base_type("int", 4);
    +add_base_type("long", 8);
    +
    +

    操作 1:定义类型

    +

    由于 DataType 中已经实现维护操作,简单处理一下输入即可:

    +
    string s;
    +int k;
    +cin >> s >> k;
    +DataType* type = new DataType(s);
    +types[s] = type;
    +type->members.resize(k);
    +for(auto& m: type->members)
    +{
    +    string t;
    +    cin >> t >> m.second;
    +    m.first = types[t];
    +}
    +type->maintain();
    +cout << type->size << ' ' << type->indent << '\n';
    +
    +

    操作 2:定义元素

    +

    根据「基本思路」中给出的做法,维护当前第一个可分配的地址和顶层元素列表

    +
    LL cur_addr = 0LL;
    +vector<Object> toplevel_objects;
    +
    +

    Object 的定义:

    +
    struct Object
    +{
    +    DataType* type; // 类型
    +    string name; // 名称
    +    LL addr; // 地址
    +};
    +
    +

    计算地址并保存元素

    +
    Object obj;
    +string t;
    +cin >> t >> obj.name; // 输入
    +obj.type = types[t]; // 找到类型指针
    +obj.addr = obj.type->shift(cur_addr); // 对齐
    +cur_addr = obj.addr + obj.type->size; // 更新可分配的地址
    +toplevel_objects.push_back(obj); // 保存元素
    +
    +

    输出元素地址

    +
    cout << obj.addr << '\n';
    +
    +

    操作 3:访问元素

    +

    定义一个辅助函数,类似于 Python 中的 split(),将一个字符串根据指定分隔符分成若干段:

    +
    inline void split(const string& s, char sep, vector<string>& res)
    +{
    +    string t;
    +    for(char c: s)
    +        if(c == sep)
    +            res.push_back(t), t.clear();
    +        else t += c;
    +    res.push_back(t);
    +}
    +
    +

    处理字符串并找到顶层元素

    +
    // 读入
    +string s;
    +cin >> s;
    +// 分割
    +vector<string> ord;
    +split(s, '.', ord);
    +// 根据名称匹配顶层元素
    +LL addr;
    +DataType* type;
    +for(auto& obj: toplevel_objects)
    +    if(obj.name == ord[0])
    +    {
    +        addr = obj.addr;
    +        type = obj.type;
    +        break;
    +    }
    +
    +

    逐层向下,计算地址

    +
    // ord[0] 对应顶层元素名称,删掉
    +ord.erase(ord.begin());
    +// 逐层向下遍历
    +for(string& s: ord)
    +    for(auto& m: type->members)
    +    {
    +        addr = m.first->shift(addr); // 地址对齐
    +        if(m.second == s) // 名称匹配
    +        {
    +            type = m.first; // 找到下一层,向下遍历
    +            break;
    +        }
    +        addr += m.first->size; // 地址移到下一个元素
    +    }
    +
    +

    输出最终地址

    +
    cout << addr << '\n';
    +
    +

    操作 4:访问地址

    +

    同操作 3,先找到顶层元素

    +
    LL addr;
    +cin >> addr;
    +if(addr >= cur_addr) // 大于最高有效地址,直接挂掉
    +{
    +    cout << "ERR\n";
    +    continue;
    +}
    +DataType* type = nullptr;
    +LL f_addr = 0LL; // 当前考察的地址
    +string res; // 结果字符串
    +for(auto& obj: toplevel_objects)
    +{
    +    if(addr < obj.addr) goto bad; // 特判由于对齐导致的地址无效
    +    if(addr < obj.addr + obj.type->size) // 地址在当前范围内,记录结果
    +    {
    +        type = obj.type;
    +        res = obj.name;
    +        f_addr = obj.addr;
    +        break;
    +    }
    +}
    +
    +

    向下寻找并输出

    +
    // 循环条件:(1) 地址有效 (2) 不是基本类型(类型有成员)
    +while(addr < f_addr + type->actual_size && !type->members.empty())
    +    for(auto& m: type->members)
    +    {
    +        f_addr = m.first->shift(f_addr); // 对齐
    +        if(addr < f_addr) goto bad; // 特判,同上
    +        if(addr < f_addr + m.first->size)
    +        {
    +            type = m.first;
    +            res.push_back('.');
    +            res += m.second;
    +            break;
    +        }
    +        f_addr += m.first->size;
    +    }
    +if(addr < f_addr + type->actual_size) cout << res << '\n'; // 地址有效则输出结果
    +else cout << "ERR\n"; // 地址无效
    +continue;
    +bad: cout << "ERR\n"; // 前面使用的 bad 标签
    +
    +

    完整代码

    +

    下面是赛时代码,也是前面讲解中使用的:

    +
    #include <iostream>
    +#include <vector>
    +#include <string>
    +#include <unordered_map>
    +#include <algorithm>
    +using namespace std;
    +
    +inline void setmax(int& x, int y)
    +{
    +    if(x < y) x = y;
    +}
    +
    +using LL = long long;
    +
    +struct DataType
    +{
    +    const string name;
    +    LL size, actual_size;
    +    int indent;
    +    vector<pair<DataType*, string>> members;
    +    inline DataType(const string& n): name(n) {}
    +    inline LL shift(LL addr)
    +    {
    +        return addr % indent? (addr / indent + 1) * indent: addr;
    +    }
    +    inline void maintain()
    +    {
    +        size = indent = 0;
    +        for(const auto& m: members)
    +        {
    +            setmax(indent, m.first->indent);
    +            size = m.first->shift(size) + m.first->size;
    +        }
    +        actual_size = size;
    +        size = shift(size);
    +    }
    +};
    +
    +struct Object
    +{
    +    DataType* type;
    +    string name;
    +    LL addr;
    +};
    +
    +inline void split(const string& s, char sep, vector<string>& res)
    +{
    +    string t;
    +    for(char c: s)
    +        if(c == sep)
    +            res.push_back(t), t.clear();
    +        else t += c;
    +    res.push_back(t);
    +}
    +
    +int main()
    +{
    +    ios::sync_with_stdio(false); cin.tie(nullptr);
    +    unordered_map<string, DataType*> types;
    +    auto add_base_type = [&](string name, int size) -> void {
    +        DataType* t = new DataType(name);
    +        t->size = t->indent = t->actual_size = size;
    +        types[name] = t;
    +    };
    +    add_base_type("byte", 1);
    +    add_base_type("short", 2);
    +    add_base_type("int", 4);
    +    add_base_type("long", 8);
    +    int q;
    +    cin >> q;
    +    vector<Object> toplevel_objects;
    +    LL cur_addr = 0LL;
    +    while(q--)
    +    {
    +        int op;
    +        cin >> op;
    +        if(op == 1)
    +        {
    +            string s;
    +            int k;
    +            cin >> s >> k;
    +            DataType* type = new DataType(s);
    +            types[s] = type;
    +            type->members.resize(k);
    +            for(auto& m: type->members)
    +            {
    +                string t;
    +                cin >> t >> m.second;
    +                m.first = types[t];
    +            }
    +            type->maintain();
    +            cout << type->size << ' ' << type->indent << '\n';
    +        }
    +        else if(op == 2)
    +        {
    +            Object obj;
    +            string t;
    +            cin >> t >> obj.name;
    +            obj.type = types[t];
    +            obj.addr = obj.type->shift(cur_addr);
    +            cur_addr = obj.addr + obj.type->size;
    +            toplevel_objects.push_back(obj);
    +            cout << obj.addr << '\n';
    +        }
    +        else if(op == 3)
    +        {
    +            string s;
    +            cin >> s;
    +            vector<string> ord;
    +            split(s, '.', ord);
    +            LL addr;
    +            DataType* type;
    +            for(auto& obj: toplevel_objects)
    +                if(obj.name == ord[0])
    +                {
    +                    addr = obj.addr;
    +                    type = obj.type;
    +                    break;
    +                }
    +            ord.erase(ord.begin());
    +            for(string& s: ord)
    +                for(auto& m: type->members)
    +                {
    +                    addr = m.first->shift(addr);
    +                    if(m.second == s)
    +                    {
    +                        type = m.first;
    +                        break;
    +                    }
    +                    addr += m.first->size;
    +                }
    +            cout << addr << '\n';
    +        }
    +        else // op == 4
    +        {
    +            LL addr;
    +            cin >> addr;
    +            if(addr >= cur_addr)
    +            {
    +                cout << "ERR\n";
    +                continue;
    +            }
    +            DataType* type = nullptr;
    +            LL f_addr = 0LL;
    +            string res;
    +            for(auto& obj: toplevel_objects)
    +            {
    +                if(addr < obj.addr) goto bad;
    +                if(addr < obj.addr + obj.type->size)
    +                {
    +                    type = obj.type;
    +                    res = obj.name;
    +                    f_addr = obj.addr;
    +                    break;
    +                }
    +            }
    +            while(addr < f_addr + type->actual_size && !type->members.empty())
    +                for(auto& m: type->members)
    +                {
    +                    f_addr = m.first->shift(f_addr);
    +                    if(addr < f_addr) goto bad;
    +                    if(addr < f_addr + m.first->size)
    +                    {
    +                        type = m.first;
    +                        res.push_back('.');
    +                        res += m.second;
    +                        break;
    +                    }
    +                    f_addr += m.first->size;
    +                }
    +            if(addr < f_addr + type->actual_size) cout << res << '\n';
    +            else cout << "ERR\n";
    +            continue;
    +            bad: cout << "ERR\n";
    +        }
    +    }
    +    for(auto it=types.begin(); it!=types.end(); it++)
    +        delete it->second;
    +    return 0;
    +}
    +
    +

    程序共计 180180 行,长度 4.64KB4.64\mathrm{KB},运行用时 73ms73\mathrm{ms}

    +

    实际上 Object 的定义没有必要,也不需要存储每个顶层元素的地址,同时还可以稍加压行:

    +
    #include <bits/stdc++.h>
    +using namespace std;
    +
    +using LL = long long;
    +
    +struct DataType {
    +    const string name;
    +    LL size, actual_size;
    +    int indent;
    +    vector<pair<DataType*, string>> members;
    +    inline DataType(const string& n): name(n) {}
    +    inline LL shift(LL addr) {
    +        return addr % indent? (addr / indent + 1) * indent: addr;
    +    }
    +    inline void maintain() {
    +        size = indent = 0;
    +        for(const auto& m: members)
    +        {
    +            indent = max(indent, m.first->indent);
    +            size = m.first->shift(size) + m.first->size;
    +        }
    +        actual_size = size;
    +        size = shift(size);
    +    }
    +};
    +
    +inline void split(const string& s, char sep, vector<string>& res) {
    +    string t;
    +    for(char c: s)
    +        if(c == sep) res.push_back(t), t.clear();
    +        else t += c;
    +    res.push_back(t);
    +}
    +
    +int main() {
    +    ios::sync_with_stdio(false); cin.tie(nullptr);
    +    unordered_map<string, DataType*> types;
    +    auto add_base_type = [&](string name, int size) -> void {
    +        DataType* t = new DataType(name);
    +        t->size = t->indent = t->actual_size = size;
    +        types[name] = t;
    +    };
    +    add_base_type("byte", 1);
    +    add_base_type("short", 2);
    +    add_base_type("int", 4);
    +    add_base_type("long", 8);
    +    int q;
    +    cin >> q;
    +    vector<pair<DataType*, string>> toplevel_objects;
    +    LL cur_addr = 0LL;
    +    while(q--) {
    +        int op;
    +        cin >> op;
    +        if(op == 1) {
    +            string s;
    +            int k;
    +            cin >> s >> k;
    +            DataType* type = new DataType(s);
    +            types[s] = type;
    +            type->members.resize(k);
    +            for(auto& m: type->members) {
    +                string t;
    +                cin >> t >> m.second;
    +                m.first = types[t];
    +            }
    +            type->maintain();
    +            cout << type->size << ' ' << type->indent << '\n';
    +        }
    +        else if(op == 2) {
    +            string t, name;
    +            cin >> t >> name;
    +            DataType* type = types[t];
    +            cur_addr = type->shift(cur_addr);
    +            cout << cur_addr << '\n';
    +            cur_addr += type->size;
    +            toplevel_objects.emplace_back(type, name);
    +        }
    +        else if(op == 3) {
    +            string s;
    +            cin >> s;
    +            vector<string> ord;
    +            split(s, '.', ord);
    +            LL addr = 0LL;
    +            DataType* type;
    +            for(auto& obj: toplevel_objects) {
    +                addr = obj.first->shift(addr);
    +                if(obj.second == ord[0]) {
    +                    type = obj.first;
    +                    break;
    +                }
    +                addr += obj.first->size;
    +            }
    +            ord.erase(ord.begin());
    +            for(string& s: ord)
    +                for(auto& m: type->members) {
    +                    addr = m.first->shift(addr);
    +                    if(m.second == s) {
    +                        type = m.first;
    +                        break;
    +                    }
    +                    addr += m.first->size;
    +                }
    +            cout << addr << '\n';
    +        }
    +        else {
    +            LL addr;
    +            cin >> addr;
    +            if(addr >= cur_addr) {
    +                cout << "ERR\n";
    +                continue;
    +            }
    +            DataType* type = nullptr;
    +            LL f_addr = 0LL;
    +            string res;
    +            for(auto& obj: toplevel_objects) {
    +                f_addr = obj.first->shift(f_addr);
    +                if(addr < f_addr) goto bad;
    +                if(addr < f_addr + obj.first->size) {
    +                    type = obj.first;
    +                    res = obj.second;
    +                    break;
    +                }
    +                f_addr += obj.first->size;
    +            }
    +            while(addr < f_addr + type->actual_size && !type->members.empty())
    +                for(auto& m: type->members) {
    +                    f_addr = m.first->shift(f_addr);
    +                    if(addr < f_addr) goto bad;
    +                    if(addr < f_addr + m.first->size) {
    +                        type = m.first;
    +                        res.push_back('.');
    +                        res += m.second;
    +                        break;
    +                    }
    +                    f_addr += m.first->size;
    +                }
    +            if(addr < f_addr + type->actual_size) cout << res << '\n';
    +            else cout << "ERR\n";
    +            continue;
    +            bad: cout << "ERR\n";
    +        }
    +    }
    +    for(auto it=types.begin(); it!=types.end(); it++)
    +        delete it->second;
    +    return 0;
    +}
    +
    +

    这样只有 146146 行,4.51KB4.51\mathrm{KB}

    +

    不过个人觉得写个 Object 更清楚,所以讲解的时候就没改啦~

    +

    后记

    +

    算法固然重要,但是编码能力也很重要!强烈建议各位 OIer 重视大模拟,不在这种题上挂分~

    +

    写大模拟需要注意的几个点:

    +
      +
    • 变量名写清楚,全写 abcd 到后面自己都不知道是啥,没法调试
    • +
    • 该用指针就用指针,不要害怕,用多了会发现真的很好用
    • +
    • 适当使用类和结构体,尽量不要全部使用 int 数组
    • +
    • 时间复杂度允许的情况下,可读性比性能重要!!(比如本题没有使用二分查找)
    • +
    +

    祝大家在 NOIP 2023 取得好成绩!求赞qwq

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/eclipseinstmirrors/index.html b/post/eclipseinstmirrors/index.html new file mode 100644 index 00000000..876197d3 --- /dev/null +++ b/post/eclipseinstmirrors/index.html @@ -0,0 +1,365 @@ + + + + + +Eclipse安装包下载慢解决方法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Eclipse安装包下载慢解决方法 +

    + +
    +
    + 2020-04-10 · 1 min read +
    + + + + 集成开发环境/IDE + + +
    +
    +

    最近开始学习Java,使用经典的Eclipse IDE,结果发现下载太慢……

    +
    +

    问题分析

    +img +

    Eclipse的下载依赖于其他镜像,(在我这里)默认为朝鲜的镜像(可能在不同电脑中默认不同):
    +img

    +

    点击Select Another Mirror
    +img

    +

    选择中国的镜像:
    +OK

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/eclipseupdmirror/index.html b/post/eclipseupdmirror/index.html new file mode 100644 index 00000000..825c3e20 --- /dev/null +++ b/post/eclipseupdmirror/index.html @@ -0,0 +1,361 @@ + + + + + +Eclipse Check For Updates总是检查不到更新-解决方法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Eclipse Check For Updates总是检查不到更新-解决方法 +

    + +
    +
    + 2020-04-08 · 1 min read +
    + + + + 集成开发环境/IDE + + +
    +

    最近想用流行的Java IDE —— EclipseHelp -> Check For Updates更新Eclipse,结果总是说未找到更新:
    +No Updates Found 示意图

    +

    1. 检查是否有更新

    +

    首先,访问Eclipse下载地址获得最新版本(目前为2020-06):
    +2020-06

    +

    再看看系统中的Eclipse版本(Help -> About Eclipse IDE):
    +前往Help

    +version +

    如果网上版本和当前版本相等(像图中),那就System.exit(0);吧。。。别冤枉Eclipse了。。。

    +

    2. 有更新但检测不到解决

    +

    打开“Available Software Sites”窗口:
    +img

    +

    方法一:在提示窗口中,点击“available software sites”链接:
    +img

    +

    方法二: 点击Window -> Prefrences -> Install/Update -> available software sites
    +img

    +

    找到Latest Eclipse Release,在红点处勾上,点击Apply and Close,重新检查更新即可。
    +img

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/happy2024/index.html b/post/happy2024/index.html new file mode 100644 index 00000000..251d819c --- /dev/null +++ b/post/happy2024/index.html @@ -0,0 +1,356 @@ + + + + + +元旦快乐 & 新年目标 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 元旦快乐 & 新年目标 +

    + +
    +
    + 2024-01-01 · 1 min read +
    + +
    +

    🌟 祝大家 20242024 元旦快乐!🌟

    +

    🎉 愿你们在新的一年里,万事尽可期待,眼里有光,脸上带笑,心中常怀温暖与爱!🎉

    +

    2023 年的小目标:

    +
      +
    • +
    • +
    • +
    • +
    +

    2024 年:

    +
      +
    • +
    • +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/java-binmove/index.html b/post/java-binmove/index.html new file mode 100644 index 00000000..a7e68334 --- /dev/null +++ b/post/java-binmove/index.html @@ -0,0 +1,383 @@ + + + + + +Java中的整数移位运算符 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Java中的整数移位运算符 +

    + +
    +
    + 2020-04-04 · 3 min read +
    + + + + Java + + + + + 语法 + + +
    +

    对于<<, >>两种运算符,可以这样说:
    +a<<b=a2ba<<b=a*2^b
    +a>>b=a/2ba>>b=a/2^b
    +但是对于>>>...不好说了。

    +

    这些位运算在计算机中怎样运算的?

    +

    大家都知道,整数在计算机中是以二进制存储的:
    +0=(0)20 = (0)_2
    +4=(100)24 = (100)_2
    +8=(1000)28 = (1000)_2
    +20=(10100)220 = (10100)_2
    +666=(1010011010)2666 = (1010011010)_2

    +

    左移(<<

    +

    a<<ba << b就是在aa的二进制后面添上bb00,所以a<<b=a2ba<<b=a*2^b

    +

    2020当例子,

    +
    +

    20<<1=(10100)2<<1=(101000)2=4020 << 1 = (10100)_2 << 1 = (101000)_2 = 40
    +20<<2=(10100)2<<2=(1010000)2=8020 << 2 = (10100)_2 << 2 = (1010000)_2 = 80

    +
    +

    右移(>>

    +

    >><<相反,a>>ba>>b就是在aa的二进制后面去掉bb位,所以a>>b=a/2ba>>b=a/2^b

    +

    还是拿2020当例子:

    +
    +

    20>>1=(10100)2>>1=(1010)2=1020 >> 1 = (10100)_2 >> 1 = (1010)_2 = 10
    +20>>2=(10100)2>>2=(101)2=520 >> 2 = (10100)_2 >> 2 = (101)_2 = 5

    +
    +

    如果末尾不是00呢?照样去:

    +
    +

    21>>1=(10101)2>>1=(1010)2=1021 >> 1 = (10101)_2 >> 1 = (1010)_2 = 10

    +
    +

    无符号/逻辑右移(>>>

    +

    看这里

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/java-final-syntax/index.html b/post/java-final-syntax/index.html new file mode 100644 index 00000000..9286e132 --- /dev/null +++ b/post/java-final-syntax/index.html @@ -0,0 +1,419 @@ + + + + + +java final关键字语法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + java final关键字语法 +

    + +
    +
    + 2020-04-01 · 3 min read +
    + + + + Java + + + + + 语法 + + +
    +

    一、final类和方法

    +

    英文文档

    +

    原文:Java官方文档 -> Writing Final Classes and Methods
    +You can declare some or all of a class's methods final. You use the final keyword in a method declaration to indicate that the method cannot be overridden by subclasses. The Object class does this—a number of its methods are final.

    +

    You might wish to make a method final if it has an implementation that should not be changed and it is critical to the consistent state of the object. For example, you might want to make the getFirstPlayer method in this ChessAlgorithm class final:

    +
    class ChessAlgorithm {
    +    enum ChessPlayer { WHITE, BLACK }
    +    ...
    +    final ChessPlayer getFirstPlayer() {
    +        return ChessPlayer.WHITE;
    +    }
    +    ...
    +}
    +
    +

    Methods called from constructors should generally be declared final. If a constructor calls a non-final method, a subclass may redefine that method with surprising or undesirable results.

    +

    Note that you can also declare an entire class final. A class that is declared final cannot be subclassed. This is particularly useful, for example, when creating an immutable class like the String class.

    +

    总结

    +

    一个finalJava类或方法不能被继承。

    +

    例子

    +

    类(Integer源代码):

    +
    package java.lang;
    +
    +import java.lang.annotation.Native;
    +// import ...
    +import static java.lang.String.UTF16;
    +
    +public final class Integer extends Number // Final类不能被继承,但是可以extend或implement别的非final类
    +        implements Comparable<Integer>, Constable, ConstantDesc {
    +    @Native public static final int   MIN_VALUE = 0x80000000;
    +    @Native public static final int   MAX_VALUE = 0x7fffffff;
    +    @SuppressWarnings("unchecked")
    +    public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
    +	// 此处省略n行
    +    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    +    @Native private static final long serialVersionUID = 1360826667806852920L;
    +}
    +
    +

    方法:

    +
    class ChessAlgorithm {
    +    enum ChessPlayer { WHITE, BLACK }
    +    // ...
    +    final ChessPlayer getFirstPlayer() { // 不能被继承,但是可以被调用
    +        return ChessPlayer.WHITE;
    +    }
    +    // ...
    +}
    +
    +

    二、final属性/变量

    +

    Java中的final属性或变量类似于C/C++中的const变量,不能改变。
    +例子:

    +
    public class Information {
    +	private static final int WIDTH = 170, HEIGHT = 135; // final属性,可以为private
    +	public static final int SIZE = WIDTH * HEIGHT; // 也可以为public
    +
    +	public int getDifference() {
    +		final int difference = WIDTH - HEIGHT; // 函数中的final变量
    +		return difference;
    +	}
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/java-image-iaein-solve/index.html b/post/java-image-iaein-solve/index.html new file mode 100644 index 00000000..732e035a --- /dev/null +++ b/post/java-image-iaein-solve/index.html @@ -0,0 +1,364 @@ + + + + + +java.lang.IllegalArgumentException: input == null! 解决方法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + java.lang.IllegalArgumentException: input == null! 解决方法 +

    + +
    +
    + 2020-03-29 · 1 min read +
    + + + + Java + + + + + Bug/错误解决 + + +
    +

    最近在编一个Java游戏,处理图片时遇到如下问题:

    +

    完整错误信息

    +
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
    +	at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)
    +	at ImageIOTest.main.<init>(main.java:23)
    +
    +

    代码片段

    +
    BufferedImage img = ImageIO.read(getClass().getResourceAsStream(FILENAME));
    +
    +

    解决方法

    +

    在网上搜了好多都是说图片路径不对,但是我已经把图片路径检查了555n555n遍了,还没发现问题
    +

    +

    so?没路了?
    +其实改成这样就对了:

    +
    BufferedImage img = ImageIO.read(new File(FILENAME));
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/js-random/index.html b/post/js-random/index.html new file mode 100644 index 00000000..9c4afd58 --- /dev/null +++ b/post/js-random/index.html @@ -0,0 +1,374 @@ + + + + + +js产生随机数 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + js产生随机数 +

    + +
    +
    + 2020-02-09 · 1 min read +
    + + + + JavaScript + + +
    +
      +
    • 产生[0,1)[0,1)之间的随机实数,即0Math.random()<10\le\text{Math.random()}<1
    • +
    +
    Math.random()
    +// 返回值样例:
    +// #1:0.60958701902852
    +// #2:0.16182155144292465
    +// #3:0.30126821448898133
    +
    +
      +
    • 随机产生[0,n][0, n]之间的整数
    • +
    +
    function randint1(n) { // 各数产生概率较平均
    +  return Math.round(Math.random() * n);
    +}
    +
    +function randint2(n) { // 不可能出现n
    +  return Math.floor(Math.random() * n);
    +}
    +
    +function randint3(n) { // 0的概率极小,与Math.random()产生0的概率相同
    +  return Math.ceil(Math.random() * n);
    +}
    +
    +
      +
    • 产生[0,n][0, n]之间的随机一位小数
    • +
    +
    // 可能有浮点数精度误差,如:0.30000000000000004,0.7999999999999999
    +function randf(n) {
    +  return Math.round(Math.random() * n * 10) / 10;
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/js-utc/index.html b/post/js-utc/index.html new file mode 100644 index 00000000..41556de9 --- /dev/null +++ b/post/js-utc/index.html @@ -0,0 +1,342 @@ + + + + + +js获取1970.1.1到当前的毫秒数 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + js获取1970.1.1到当前的毫秒数 +

    + +
    +
    + 2020-01-31 · 1 min read +
    + + + + JavaScript + + +
    +
    Date.now() // 获取1970.1.1到当前的毫秒数
    +Date.UTC(2000, 1, 1) // 获取1970.1.1到2000.1.1的毫秒数
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/license-gplv3/index.html b/post/license-gplv3/index.html new file mode 100644 index 00000000..12b28f4e --- /dev/null +++ b/post/license-gplv3/index.html @@ -0,0 +1,953 @@ + + + + + +License (GPLv3) - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + License (GPLv3) +

    + +
    +
    + 2020-01-02 · 37 min read +
    + + + + 开源项目 + + +
    +
                    GNU GENERAL PUBLIC LICENSE
    +                   Version 3, 29 June 2007
    +
    +

    Copyright (C) 2007 Free Software Foundation, Inc. https://fsf.org/
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.

    +
                            Preamble
    +
    +

    The GNU General Public License is a free, copyleft license for
    +software and other kinds of works.

    +

    The licenses for most software and other practical works are designed
    +to take away your freedom to share and change the works. By contrast,
    +the GNU General Public License is intended to guarantee your freedom to
    +share and change all versions of a program--to make sure it remains free
    +software for all its users. We, the Free Software Foundation, use the
    +GNU General Public License for most of our software; it applies also to
    +any other work released this way by its authors. You can apply it to
    +your programs, too.

    +

    When we speak of free software, we are referring to freedom, not
    +price. Our General Public Licenses are designed to make sure that you
    +have the freedom to distribute copies of free software (and charge for
    +them if you wish), that you receive source code or can get it if you
    +want it, that you can change the software or use pieces of it in new
    +free programs, and that you know you can do these things.

    +

    To protect your rights, we need to prevent others from denying you
    +these rights or asking you to surrender the rights. Therefore, you have
    +certain responsibilities if you distribute copies of the software, or if
    +you modify it: responsibilities to respect the freedom of others.

    +

    For example, if you distribute copies of such a program, whether
    +gratis or for a fee, you must pass on to the recipients the same
    +freedoms that you received. You must make sure that they, too, receive
    +or can get the source code. And you must show them these terms so they
    +know their rights.

    +

    Developers that use the GNU GPL protect your rights with two steps:
    +(1) assert copyright on the software, and (2) offer you this License
    +giving you legal permission to copy, distribute and/or modify it.

    +

    For the developers' and authors' protection, the GPL clearly explains
    +that there is no warranty for this free software. For both users' and
    +authors' sake, the GPL requires that modified versions be marked as
    +changed, so that their problems will not be attributed erroneously to
    +authors of previous versions.

    +

    Some devices are designed to deny users access to install or run
    +modified versions of the software inside them, although the manufacturer
    +can do so. This is fundamentally incompatible with the aim of
    +protecting users' freedom to change the software. The systematic
    +pattern of such abuse occurs in the area of products for individuals to
    +use, which is precisely where it is most unacceptable. Therefore, we
    +have designed this version of the GPL to prohibit the practice for those
    +products. If such problems arise substantially in other domains, we
    +stand ready to extend this provision to those domains in future versions
    +of the GPL, as needed to protect the freedom of users.

    +

    Finally, every program is threatened constantly by software patents.
    +States should not allow patents to restrict development and use of
    +software on general-purpose computers, but in those that do, we wish to
    +avoid the special danger that patents applied to a free program could
    +make it effectively proprietary. To prevent this, the GPL assures that
    +patents cannot be used to render the program non-free.

    +

    The precise terms and conditions for copying, distribution and
    +modification follow.

    +
                       TERMS AND CONDITIONS
    +
    +
      +
    1. Definitions.
    2. +
    +

    "This License" refers to version 3 of the GNU General Public License.

    +

    "Copyright" also means copyright-like laws that apply to other kinds of
    +works, such as semiconductor masks.

    +

    "The Program" refers to any copyrightable work licensed under this
    +License. Each licensee is addressed as "you". "Licensees" and
    +"recipients" may be individuals or organizations.

    +

    To "modify" a work means to copy from or adapt all or part of the work
    +in a fashion requiring copyright permission, other than the making of an
    +exact copy. The resulting work is called a "modified version" of the
    +earlier work or a work "based on" the earlier work.

    +

    A "covered work" means either the unmodified Program or a work based
    +on the Program.

    +

    To "propagate" a work means to do anything with it that, without
    +permission, would make you directly or secondarily liable for
    +infringement under applicable copyright law, except executing it on a
    +computer or modifying a private copy. Propagation includes copying,
    +distribution (with or without modification), making available to the
    +public, and in some countries other activities as well.

    +

    To "convey" a work means any kind of propagation that enables other
    +parties to make or receive copies. Mere interaction with a user through
    +a computer network, with no transfer of a copy, is not conveying.

    +

    An interactive user interface displays "Appropriate Legal Notices"
    +to the extent that it includes a convenient and prominently visible
    +feature that (1) displays an appropriate copyright notice, and (2)
    +tells the user that there is no warranty for the work (except to the
    +extent that warranties are provided), that licensees may convey the
    +work under this License, and how to view a copy of this License. If
    +the interface presents a list of user commands or options, such as a
    +menu, a prominent item in the list meets this criterion.

    +
      +
    1. Source Code.
    2. +
    +

    The "source code" for a work means the preferred form of the work
    +for making modifications to it. "Object code" means any non-source
    +form of a work.

    +

    A "Standard Interface" means an interface that either is an official
    +standard defined by a recognized standards body, or, in the case of
    +interfaces specified for a particular programming language, one that
    +is widely used among developers working in that language.

    +

    The "System Libraries" of an executable work include anything, other
    +than the work as a whole, that (a) is included in the normal form of
    +packaging a Major Component, but which is not part of that Major
    +Component, and (b) serves only to enable use of the work with that
    +Major Component, or to implement a Standard Interface for which an
    +implementation is available to the public in source code form. A
    +"Major Component", in this context, means a major essential component
    +(kernel, window system, and so on) of the specific operating system
    +(if any) on which the executable work runs, or a compiler used to
    +produce the work, or an object code interpreter used to run it.

    +

    The "Corresponding Source" for a work in object code form means all
    +the source code needed to generate, install, and (for an executable
    +work) run the object code and to modify the work, including scripts to
    +control those activities. However, it does not include the work's
    +System Libraries, or general-purpose tools or generally available free
    +programs which are used unmodified in performing those activities but
    +which are not part of the work. For example, Corresponding Source
    +includes interface definition files associated with source files for
    +the work, and the source code for shared libraries and dynamically
    +linked subprograms that the work is specifically designed to require,
    +such as by intimate data communication or control flow between those
    +subprograms and other parts of the work.

    +

    The Corresponding Source need not include anything that users
    +can regenerate automatically from other parts of the Corresponding
    +Source.

    +

    The Corresponding Source for a work in source code form is that
    +same work.

    +
      +
    1. Basic Permissions.
    2. +
    +

    All rights granted under this License are granted for the term of
    +copyright on the Program, and are irrevocable provided the stated
    +conditions are met. This License explicitly affirms your unlimited
    +permission to run the unmodified Program. The output from running a
    +covered work is covered by this License only if the output, given its
    +content, constitutes a covered work. This License acknowledges your
    +rights of fair use or other equivalent, as provided by copyright law.

    +

    You may make, run and propagate covered works that you do not
    +convey, without conditions so long as your license otherwise remains
    +in force. You may convey covered works to others for the sole purpose
    +of having them make modifications exclusively for you, or provide you
    +with facilities for running those works, provided that you comply with
    +the terms of this License in conveying all material for which you do
    +not control copyright. Those thus making or running the covered works
    +for you must do so exclusively on your behalf, under your direction
    +and control, on terms that prohibit them from making any copies of
    +your copyrighted material outside their relationship with you.

    +

    Conveying under any other circumstances is permitted solely under
    +the conditions stated below. Sublicensing is not allowed; section 10
    +makes it unnecessary.

    +
      +
    1. Protecting Users' Legal Rights From Anti-Circumvention Law.
    2. +
    +

    No covered work shall be deemed part of an effective technological
    +measure under any applicable law fulfilling obligations under article
    +11 of the WIPO copyright treaty adopted on 20 December 1996, or
    +similar laws prohibiting or restricting circumvention of such
    +measures.

    +

    When you convey a covered work, you waive any legal power to forbid
    +circumvention of technological measures to the extent such circumvention
    +is effected by exercising rights under this License with respect to
    +the covered work, and you disclaim any intention to limit operation or
    +modification of the work as a means of enforcing, against the work's
    +users, your or third parties' legal rights to forbid circumvention of
    +technological measures.

    +
      +
    1. Conveying Verbatim Copies.
    2. +
    +

    You may convey verbatim copies of the Program's source code as you
    +receive it, in any medium, provided that you conspicuously and
    +appropriately publish on each copy an appropriate copyright notice;
    +keep intact all notices stating that this License and any
    +non-permissive terms added in accord with section 7 apply to the code;
    +keep intact all notices of the absence of any warranty; and give all
    +recipients a copy of this License along with the Program.

    +

    You may charge any price or no price for each copy that you convey,
    +and you may offer support or warranty protection for a fee.

    +
      +
    1. Conveying Modified Source Versions.
    2. +
    +

    You may convey a work based on the Program, or the modifications to
    +produce it from the Program, in the form of source code under the
    +terms of section 4, provided that you also meet all of these conditions:

    +
    a) The work must carry prominent notices stating that you modified
    +it, and giving a relevant date.
    +
    +b) The work must carry prominent notices stating that it is
    +released under this License and any conditions added under section
    +7.  This requirement modifies the requirement in section 4 to
    +"keep intact all notices".
    +
    +c) You must license the entire work, as a whole, under this
    +License to anyone who comes into possession of a copy.  This
    +License will therefore apply, along with any applicable section 7
    +additional terms, to the whole of the work, and all its parts,
    +regardless of how they are packaged.  This License gives no
    +permission to license the work in any other way, but it does not
    +invalidate such permission if you have separately received it.
    +
    +d) If the work has interactive user interfaces, each must display
    +Appropriate Legal Notices; however, if the Program has interactive
    +interfaces that do not display Appropriate Legal Notices, your
    +work need not make them do so.
    +
    +

    A compilation of a covered work with other separate and independent
    +works, which are not by their nature extensions of the covered work,
    +and which are not combined with it such as to form a larger program,
    +in or on a volume of a storage or distribution medium, is called an
    +"aggregate" if the compilation and its resulting copyright are not
    +used to limit the access or legal rights of the compilation's users
    +beyond what the individual works permit. Inclusion of a covered work
    +in an aggregate does not cause this License to apply to the other
    +parts of the aggregate.

    +
      +
    1. Conveying Non-Source Forms.
    2. +
    +

    You may convey a covered work in object code form under the terms
    +of sections 4 and 5, provided that you also convey the
    +machine-readable Corresponding Source under the terms of this License,
    +in one of these ways:

    +
    a) Convey the object code in, or embodied in, a physical product
    +(including a physical distribution medium), accompanied by the
    +Corresponding Source fixed on a durable physical medium
    +customarily used for software interchange.
    +
    +b) Convey the object code in, or embodied in, a physical product
    +(including a physical distribution medium), accompanied by a
    +written offer, valid for at least three years and valid for as
    +long as you offer spare parts or customer support for that product
    +model, to give anyone who possesses the object code either (1) a
    +copy of the Corresponding Source for all the software in the
    +product that is covered by this License, on a durable physical
    +medium customarily used for software interchange, for a price no
    +more than your reasonable cost of physically performing this
    +conveying of source, or (2) access to copy the
    +Corresponding Source from a network server at no charge.
    +
    +c) Convey individual copies of the object code with a copy of the
    +written offer to provide the Corresponding Source.  This
    +alternative is allowed only occasionally and noncommercially, and
    +only if you received the object code with such an offer, in accord
    +with subsection 6b.
    +
    +d) Convey the object code by offering access from a designated
    +place (gratis or for a charge), and offer equivalent access to the
    +Corresponding Source in the same way through the same place at no
    +further charge.  You need not require recipients to copy the
    +Corresponding Source along with the object code.  If the place to
    +copy the object code is a network server, the Corresponding Source
    +may be on a different server (operated by you or a third party)
    +that supports equivalent copying facilities, provided you maintain
    +clear directions next to the object code saying where to find the
    +Corresponding Source.  Regardless of what server hosts the
    +Corresponding Source, you remain obligated to ensure that it is
    +available for as long as needed to satisfy these requirements.
    +
    +e) Convey the object code using peer-to-peer transmission, provided
    +you inform other peers where the object code and Corresponding
    +Source of the work are being offered to the general public at no
    +charge under subsection 6d.
    +
    +

    A separable portion of the object code, whose source code is excluded
    +from the Corresponding Source as a System Library, need not be
    +included in conveying the object code work.

    +

    A "User Product" is either (1) a "consumer product", which means any
    +tangible personal property which is normally used for personal, family,
    +or household purposes, or (2) anything designed or sold for incorporation
    +into a dwelling. In determining whether a product is a consumer product,
    +doubtful cases shall be resolved in favor of coverage. For a particular
    +product received by a particular user, "normally used" refers to a
    +typical or common use of that class of product, regardless of the status
    +of the particular user or of the way in which the particular user
    +actually uses, or expects or is expected to use, the product. A product
    +is a consumer product regardless of whether the product has substantial
    +commercial, industrial or non-consumer uses, unless such uses represent
    +the only significant mode of use of the product.

    +

    "Installation Information" for a User Product means any methods,
    +procedures, authorization keys, or other information required to install
    +and execute modified versions of a covered work in that User Product from
    +a modified version of its Corresponding Source. The information must
    +suffice to ensure that the continued functioning of the modified object
    +code is in no case prevented or interfered with solely because
    +modification has been made.

    +

    If you convey an object code work under this section in, or with, or
    +specifically for use in, a User Product, and the conveying occurs as
    +part of a transaction in which the right of possession and use of the
    +User Product is transferred to the recipient in perpetuity or for a
    +fixed term (regardless of how the transaction is characterized), the
    +Corresponding Source conveyed under this section must be accompanied
    +by the Installation Information. But this requirement does not apply
    +if neither you nor any third party retains the ability to install
    +modified object code on the User Product (for example, the work has
    +been installed in ROM).

    +

    The requirement to provide Installation Information does not include a
    +requirement to continue to provide support service, warranty, or updates
    +for a work that has been modified or installed by the recipient, or for
    +the User Product in which it has been modified or installed. Access to a
    +network may be denied when the modification itself materially and
    +adversely affects the operation of the network or violates the rules and
    +protocols for communication across the network.

    +

    Corresponding Source conveyed, and Installation Information provided,
    +in accord with this section must be in a format that is publicly
    +documented (and with an implementation available to the public in
    +source code form), and must require no special password or key for
    +unpacking, reading or copying.

    +
      +
    1. Additional Terms.
    2. +
    +

    "Additional permissions" are terms that supplement the terms of this
    +License by making exceptions from one or more of its conditions.
    +Additional permissions that are applicable to the entire Program shall
    +be treated as though they were included in this License, to the extent
    +that they are valid under applicable law. If additional permissions
    +apply only to part of the Program, that part may be used separately
    +under those permissions, but the entire Program remains governed by
    +this License without regard to the additional permissions.

    +

    When you convey a copy of a covered work, you may at your option
    +remove any additional permissions from that copy, or from any part of
    +it. (Additional permissions may be written to require their own
    +removal in certain cases when you modify the work.) You may place
    +additional permissions on material, added by you to a covered work,
    +for which you have or can give appropriate copyright permission.

    +

    Notwithstanding any other provision of this License, for material you
    +add to a covered work, you may (if authorized by the copyright holders of
    +that material) supplement the terms of this License with terms:

    +
    a) Disclaiming warranty or limiting liability differently from the
    +terms of sections 15 and 16 of this License; or
    +
    +b) Requiring preservation of specified reasonable legal notices or
    +author attributions in that material or in the Appropriate Legal
    +Notices displayed by works containing it; or
    +
    +c) Prohibiting misrepresentation of the origin of that material, or
    +requiring that modified versions of such material be marked in
    +reasonable ways as different from the original version; or
    +
    +d) Limiting the use for publicity purposes of names of licensors or
    +authors of the material; or
    +
    +e) Declining to grant rights under trademark law for use of some
    +trade names, trademarks, or service marks; or
    +
    +f) Requiring indemnification of licensors and authors of that
    +material by anyone who conveys the material (or modified versions of
    +it) with contractual assumptions of liability to the recipient, for
    +any liability that these contractual assumptions directly impose on
    +those licensors and authors.
    +
    +

    All other non-permissive additional terms are considered "further
    +restrictions" within the meaning of section 10. If the Program as you
    +received it, or any part of it, contains a notice stating that it is
    +governed by this License along with a term that is a further
    +restriction, you may remove that term. If a license document contains
    +a further restriction but permits relicensing or conveying under this
    +License, you may add to a covered work material governed by the terms
    +of that license document, provided that the further restriction does
    +not survive such relicensing or conveying.

    +

    If you add terms to a covered work in accord with this section, you
    +must place, in the relevant source files, a statement of the
    +additional terms that apply to those files, or a notice indicating
    +where to find the applicable terms.

    +

    Additional terms, permissive or non-permissive, may be stated in the
    +form of a separately written license, or stated as exceptions;
    +the above requirements apply either way.

    +
      +
    1. Termination.
    2. +
    +

    You may not propagate or modify a covered work except as expressly
    +provided under this License. Any attempt otherwise to propagate or
    +modify it is void, and will automatically terminate your rights under
    +this License (including any patent licenses granted under the third
    +paragraph of section 11).

    +

    However, if you cease all violation of this License, then your
    +license from a particular copyright holder is reinstated (a)
    +provisionally, unless and until the copyright holder explicitly and
    +finally terminates your license, and (b) permanently, if the copyright
    +holder fails to notify you of the violation by some reasonable means
    +prior to 60 days after the cessation.

    +

    Moreover, your license from a particular copyright holder is
    +reinstated permanently if the copyright holder notifies you of the
    +violation by some reasonable means, this is the first time you have
    +received notice of violation of this License (for any work) from that
    +copyright holder, and you cure the violation prior to 30 days after
    +your receipt of the notice.

    +

    Termination of your rights under this section does not terminate the
    +licenses of parties who have received copies or rights from you under
    +this License. If your rights have been terminated and not permanently
    +reinstated, you do not qualify to receive new licenses for the same
    +material under section 10.

    +
      +
    1. Acceptance Not Required for Having Copies.
    2. +
    +

    You are not required to accept this License in order to receive or
    +run a copy of the Program. Ancillary propagation of a covered work
    +occurring solely as a consequence of using peer-to-peer transmission
    +to receive a copy likewise does not require acceptance. However,
    +nothing other than this License grants you permission to propagate or
    +modify any covered work. These actions infringe copyright if you do
    +not accept this License. Therefore, by modifying or propagating a
    +covered work, you indicate your acceptance of this License to do so.

    +
      +
    1. Automatic Licensing of Downstream Recipients.
    2. +
    +

    Each time you convey a covered work, the recipient automatically
    +receives a license from the original licensors, to run, modify and
    +propagate that work, subject to this License. You are not responsible
    +for enforcing compliance by third parties with this License.

    +

    An "entity transaction" is a transaction transferring control of an
    +organization, or substantially all assets of one, or subdividing an
    +organization, or merging organizations. If propagation of a covered
    +work results from an entity transaction, each party to that
    +transaction who receives a copy of the work also receives whatever
    +licenses to the work the party's predecessor in interest had or could
    +give under the previous paragraph, plus a right to possession of the
    +Corresponding Source of the work from the predecessor in interest, if
    +the predecessor has it or can get it with reasonable efforts.

    +

    You may not impose any further restrictions on the exercise of the
    +rights granted or affirmed under this License. For example, you may
    +not impose a license fee, royalty, or other charge for exercise of
    +rights granted under this License, and you may not initiate litigation
    +(including a cross-claim or counterclaim in a lawsuit) alleging that
    +any patent claim is infringed by making, using, selling, offering for
    +sale, or importing the Program or any portion of it.

    +
      +
    1. Patents.
    2. +
    +

    A "contributor" is a copyright holder who authorizes use under this
    +License of the Program or a work on which the Program is based. The
    +work thus licensed is called the contributor's "contributor version".

    +

    A contributor's "essential patent claims" are all patent claims
    +owned or controlled by the contributor, whether already acquired or
    +hereafter acquired, that would be infringed by some manner, permitted
    +by this License, of making, using, or selling its contributor version,
    +but do not include claims that would be infringed only as a
    +consequence of further modification of the contributor version. For
    +purposes of this definition, "control" includes the right to grant
    +patent sublicenses in a manner consistent with the requirements of
    +this License.

    +

    Each contributor grants you a non-exclusive, worldwide, royalty-free
    +patent license under the contributor's essential patent claims, to
    +make, use, sell, offer for sale, import and otherwise run, modify and
    +propagate the contents of its contributor version.

    +

    In the following three paragraphs, a "patent license" is any express
    +agreement or commitment, however denominated, not to enforce a patent
    +(such as an express permission to practice a patent or covenant not to
    +sue for patent infringement). To "grant" such a patent license to a
    +party means to make such an agreement or commitment not to enforce a
    +patent against the party.

    +

    If you convey a covered work, knowingly relying on a patent license,
    +and the Corresponding Source of the work is not available for anyone
    +to copy, free of charge and under the terms of this License, through a
    +publicly available network server or other readily accessible means,
    +then you must either (1) cause the Corresponding Source to be so
    +available, or (2) arrange to deprive yourself of the benefit of the
    +patent license for this particular work, or (3) arrange, in a manner
    +consistent with the requirements of this License, to extend the patent
    +license to downstream recipients. "Knowingly relying" means you have
    +actual knowledge that, but for the patent license, your conveying the
    +covered work in a country, or your recipient's use of the covered work
    +in a country, would infringe one or more identifiable patents in that
    +country that you have reason to believe are valid.

    +

    If, pursuant to or in connection with a single transaction or
    +arrangement, you convey, or propagate by procuring conveyance of, a
    +covered work, and grant a patent license to some of the parties
    +receiving the covered work authorizing them to use, propagate, modify
    +or convey a specific copy of the covered work, then the patent license
    +you grant is automatically extended to all recipients of the covered
    +work and works based on it.

    +

    A patent license is "discriminatory" if it does not include within
    +the scope of its coverage, prohibits the exercise of, or is
    +conditioned on the non-exercise of one or more of the rights that are
    +specifically granted under this License. You may not convey a covered
    +work if you are a party to an arrangement with a third party that is
    +in the business of distributing software, under which you make payment
    +to the third party based on the extent of your activity of conveying
    +the work, and under which the third party grants, to any of the
    +parties who would receive the covered work from you, a discriminatory
    +patent license (a) in connection with copies of the covered work
    +conveyed by you (or copies made from those copies), or (b) primarily
    +for and in connection with specific products or compilations that
    +contain the covered work, unless you entered into that arrangement,
    +or that patent license was granted, prior to 28 March 2007.

    +

    Nothing in this License shall be construed as excluding or limiting
    +any implied license or other defenses to infringement that may
    +otherwise be available to you under applicable patent law.

    +
      +
    1. No Surrender of Others' Freedom.
    2. +
    +

    If conditions are imposed on you (whether by court order, agreement or
    +otherwise) that contradict the conditions of this License, they do not
    +excuse you from the conditions of this License. If you cannot convey a
    +covered work so as to satisfy simultaneously your obligations under this
    +License and any other pertinent obligations, then as a consequence you may
    +not convey it at all. For example, if you agree to terms that obligate you
    +to collect a royalty for further conveying from those to whom you convey
    +the Program, the only way you could satisfy both those terms and this
    +License would be to refrain entirely from conveying the Program.

    +
      +
    1. Use with the GNU Affero General Public License.
    2. +
    +

    Notwithstanding any other provision of this License, you have
    +permission to link or combine any covered work with a work licensed
    +under version 3 of the GNU Affero General Public License into a single
    +combined work, and to convey the resulting work. The terms of this
    +License will continue to apply to the part which is the covered work,
    +but the special requirements of the GNU Affero General Public License,
    +section 13, concerning interaction through a network will apply to the
    +combination as such.

    +
      +
    1. Revised Versions of this License.
    2. +
    +

    The Free Software Foundation may publish revised and/or new versions of
    +the GNU General Public License from time to time. Such new versions will
    +be similar in spirit to the present version, but may differ in detail to
    +address new problems or concerns.

    +

    Each version is given a distinguishing version number. If the
    +Program specifies that a certain numbered version of the GNU General
    +Public License "or any later version" applies to it, you have the
    +option of following the terms and conditions either of that numbered
    +version or of any later version published by the Free Software
    +Foundation. If the Program does not specify a version number of the
    +GNU General Public License, you may choose any version ever published
    +by the Free Software Foundation.

    +

    If the Program specifies that a proxy can decide which future
    +versions of the GNU General Public License can be used, that proxy's
    +public statement of acceptance of a version permanently authorizes you
    +to choose that version for the Program.

    +

    Later license versions may give you additional or different
    +permissions. However, no additional obligations are imposed on any
    +author or copyright holder as a result of your choosing to follow a
    +later version.

    +
      +
    1. Disclaimer of Warranty.
    2. +
    +

    THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
    +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
    +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
    +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
    +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
    +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
    +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    +
      +
    1. Limitation of Liability.
    2. +
    +

    IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
    +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
    +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
    +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
    +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
    +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
    +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
    +SUCH DAMAGES.

    +
      +
    1. Interpretation of Sections 15 and 16.
    2. +
    +

    If the disclaimer of warranty and limitation of liability provided
    +above cannot be given local legal effect according to their terms,
    +reviewing courts shall apply local law that most closely approximates
    +an absolute waiver of all civil liability in connection with the
    +Program, unless a warranty or assumption of liability accompanies a
    +copy of the Program in return for a fee.

    +
                     END OF TERMS AND CONDITIONS
    +
    +        How to Apply These Terms to Your New Programs
    +
    +

    If you develop a new program, and you want it to be of the greatest
    +possible use to the public, the best way to achieve this is to make it
    +free software which everyone can redistribute and change under these terms.

    +

    To do so, attach the following notices to the program. It is safest
    +to attach them to the start of each source file to most effectively
    +state the exclusion of warranty; and each file should have at least
    +the "copyright" line and a pointer to where the full notice is found.

    +
    <one line to give the program's name and a brief idea of what it does.>
    +Copyright (C) <year>  <name of author>
    +
    +This program is free software: you can redistribute it and/or modify
    +it under the terms of the GNU General Public License as published by
    +the Free Software Foundation, either version 3 of the License, or
    +(at your option) any later version.
    +
    +This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRANTY; without even the implied warranty of
    +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +GNU General Public License for more details.
    +
    +You should have received a copy of the GNU General Public License
    +along with this program.  If not, see <https://www.gnu.org/licenses/>.
    +
    +

    Also add information on how to contact you by electronic and paper mail.

    +

    If the program does terminal interaction, make it output a short
    +notice like this when it starts in an interactive mode:

    +
    <program>  Copyright (C) <year>  <name of author>
    +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +This is free software, and you are welcome to redistribute it
    +under certain conditions; type `show c' for details.
    +
    +

    The hypothetical commands show w' and show c' should show the appropriate
    +parts of the General Public License. Of course, your program's commands
    +might be different; for a GUI interface, you would use an "about box".

    +

    You should also get your employer (if you work as a programmer) or school,
    +if any, to sign a "copyright disclaimer" for the program, if necessary.
    +For more information on this, and how to apply and follow the GNU GPL, see
    +https://www.gnu.org/licenses/.

    +

    The GNU General Public License does not permit incorporating your program
    +into proprietary programs. If your program is a subroutine library, you
    +may consider it more useful to permit linking proprietary applications with
    +the library. If this is what you want to do, use the GNU Lesser General
    +Public License instead of this License. But first, please read
    +https://www.gnu.org/licenses/why-not-lgpl.html.

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/license/index.html b/post/license/index.html new file mode 100644 index 00000000..d62fa771 --- /dev/null +++ b/post/license/index.html @@ -0,0 +1,356 @@ + + + + + +License (MIT) - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + License (MIT) +

    + +
    +
    + 2020-01-02 · 2 min read +
    + + + + 开源项目 + + +
    +

    MIT License

    +

    Copyright (c) 2024 Stanley

    +

    Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:

    +

    The above copyright notice and this permission notice shall be included in all
    +copies or substantial portions of the Software.

    +

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    +SOFTWARE.

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/mathematica-intro/index.html b/post/mathematica-intro/index.html new file mode 100644 index 00000000..6f5adc42 --- /dev/null +++ b/post/mathematica-intro/index.html @@ -0,0 +1,656 @@ + + + + + +Mathematica 入门 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Mathematica 入门 +

    + +
    +
    + 2024-01-25 · 11 min read +
    + + + + Mathematica & Wolfram Language + + +
    +

    前言

    +

    Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLABMaple 等。

    +

    MMA 官网:https://www.wolfram.com/mathematica/

    +

    MMA 的安装及激活:Mathematica安装激活极简教程 - 科研小飞 (知乎)

    +

    本文适合有一定编程基础的读者。当然,如果你不了解编程也没关系,直接跳过相关部分即可。屏幕截图全部来自 Windows 11,Mathematica 13.3。(最新版本 14.0 已经在 2023 年 12 月发布,语法向下兼容)

    +演示使用的 MMA 版本 +
    演示使用的 MMA 版本
    +

    1. 界面

    +

    安装并正确激活 MMA 后,新建笔记本,应该能看到如下的界面:

    +MMA 基本界面 +

    一张图带你快速熟悉 MMA 的界面:

    +MMA 界面简介 +

    几个需要注意的点:

    +
      +
    • Enter 默认换行,执行代码需要用 Shift+Enter
    • +
    • 指令面板左侧的红三角形也可执行代码,灰色的正方形用于终止正在进行的运算。
    • +
    • MMA 带有 Notebook(笔记本)功能,由于其主要用于计算而不是笔记,本文不详细介绍,若需要使用可自行查阅相关资料。
    • +
    +

    对于任意输入或输出,按下Ctrl+Shift+I即可显示输入(代码)形式,按下Ctrl+Shift+N即可显示数学形式。后面会对两种显示形式进行详细讲解。

    +

    2. 语法

    +

    Mathematica 实质是一个 Wolfram Language 的解释器,所以使用它之前必须学习 WL 的语法。
    +这里介绍基本语法和常用的指令。

    +

    2.1 帮助文档

    +

    首先来了解帮助文档的使用。输入 ? Solve 来获取 Solve 函数的说明:

    +help-solve +

    ? 后面可以跟任何函数名,MMA 会直接在笔记本中输出简化版的帮助文档。可以选择输出右上角的 i 来获取更详细的文档(优先打开离线文档,不存在则默认打开在线文档)。菜单栏中的 “帮助 -> Wolfram 参考资料” 可以打开完整版文档。

    +

    2.2 注释

    +
    (* 注释 *)
    +
    +

    如上,MMA 的注释使用 (**) 来标注,用法类似于 C/C++ 中的 /**/。注释可以添加在代码的任何位置,它们会被自动忽略。例如:

    +
    1 + 1 (*Hello*)
    +1 + (*World*)1 
    +
    +

    这两行代码在实际执行中与 1 + 1 无区别:

    +comment-test +

    2.3 括号

    +

    在学习 MMA 的函数之前,一定要先学会括号的使用!!
    +官方参考文档:正确使用括号和大括号

    +

    MMA 中共有四种括号,分别为 ()[]{}[[]],具体作用如下:

    +

    圆括号 ()

    +

    用作对表达式编组和确定运算的优先次序:

    +圆括号的使用 +

    方括号 []

    +

    表示函数的调用和传参:

    +方括号的使用 +

    大括号 {}

    +

    表示列表:

    +大括号的使用 +

    列表的具体使用后续会介绍。

    +

    双方括号 [[]]

    +

    表示对列表元素的访问,实质是函数 Part 的简写形式:

    +双方括号的使用 +

    同样会在后面具体介绍。

    +

    2.4 运算与表达式

    +

    MMA 支持基本的数学运算,见下表:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    名称符号形式函数形式数学形式
    加法a + bPlus[a, b]a+ba+b
    减法a - bSubtract[a, b]aba-b
    乘法a * b[1]Times[a, b]a×ba\times b
    除法a / bDivide[a, b]ab\frac ab
    a ^ bPower[a, b]aba^b
    模余-Mod[a, b]amodba\bmod b
    +

    数字和符号都可以参与运算:

    +数字和符号的运算 +

    表达式是一个或多个运算/函数调用的组合,使用()指定优先级。上图中 4*5a+a3 x y/y 都是合法的表达式。

    +

    需要注意的是,MMA 只会对输入的表达式进行约分、合并同类项,而不会自动执行需要展开的化简。必要时可以使用 SimplifyFullSimplify 函数:

    +化简示例 +

    关于函数的使用,后面会详解。

    +

    布尔表达式

    +

    表达式也可以是等式或不等式:

    +等式和不等式 +
    +

    注意等式用两个等号 == 连接,单个等号表示变量赋值。
    +不等式可以用 !=(不等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)连接。!=>=<= 在输入时会自动转换为相应的数学符号。

    +
    +

    这类返回值为 True(真)或 False(假)的表达式,我们统称为布尔表达式。可以用 &&|| 运算符来连接两个布尔表达式,分别表示“与”“或”,所得结果仍为布尔表达式。

    +

    绝大部分布尔表达式都不能自动化简,但可以通过 SimplifyFullSimplifySolveReduce 来化简或求解:

    +布尔表达式的化简与求解 +

    2.5 变量与常数

    +

    MMA 中,使用 变量名 = 值 的形式来声明或赋值变量:

    +创建变量 +

    由上方 10a + 3 的计算结果可知,表达式中所有已声明的变量都会被替换成变量值。变量的声明也可以包含其他变量和符号,此时仍符合变量替换法则:

    +替换 +

    用于解方程的 Solve 函数没有返回 aa 的解,而是返回 xx 的解,说明表达式在解析时 aa 被自动替换为了 xx

    +
    +

    除此之外,还可以用类似于 Python 的语法,同时赋值多个变量

    +
    {a, b, c} = {1, 2, 3}
    +
    +

    这行代码可以把变量 a,b,ca,b,c 分别赋值为 1,2,31,2,3

    +
    +

    若要取消声明一个变量,可以使用 Clear[变量名]

    +Clear的使用 +

    在使用 MMA 的过程中,我们会发现某些特定符号不能声明为变量,且有一个固定不变的值。这些是内置常量

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    常量名称近似值数学形式
    Pi圆周率3.1415926543.141592654π\pi
    E自然常数2.7182818282.718281828e\mathrm e
    I虚数单位-ii
    Infinity无穷大-\infty
    Degree-°\degree
    +

    2.6 函数

    +

    在前面的讲解中,我们多次提到函数。现在,让我们详细解读函数的使用。

    +

    调用

    +

    要调用一个函数,只需输入 函数名[参数1, 参数2, ...] 即可:

    +函数的调用1 +

    对于只有一个参数的函数,可以用 参数 // 函数名 的形式调用。这种形式常用于 Simplify(化简)、FullSimplify(完全简化)和 N(数值运算)的调用:

    +函数调用2 +

    这种写法的最大优点在于可以链式调用:

    +链式调用 +

    定义

    +

    说完了函数的调用,再来说说新函数的定义。

    +

    MMA 中,定义新函数的语法为 函数名[参数1_, 参数2_, ...] := 返回值。注意每个参数名后面都要加一个下划线_)。

    +
    +

    定义新函数推荐用 :=,但使用 = 也可行。

    +
    +定义新函数 +
    +

    拓展 - 定义递归函数
    +参考下面定义斐波那契数列的格式:
    +斐波那契数列

    +
    +

    3. 内置函数

    +

    MMA 中有将近 60006000 个内置函数[2],它们都以大写字母开头。下面介绍几种常用的内置函数:

    +

    3.1 数值运算 N

    +

    数值运算函数 N

    +
      +
    • N[expr] 给出 expr\mathrm{expr} 的数值值
    • +
    • N[expr, n] 尝试给出具有 nn 位精度的结果
    • +
    +

    使用示例:

    +N示例 +

    3.2 三角函数

    +

    MMA 内置了各类三角函数,它们全部使用习惯名称且首字母大写(SinSinhArcSin),这里不一一阐释。
    +只说一个注意点,MMA 中三角函数的参数默认是弧度,若要使用角度必须加上 Degree 单位:

    +三角函数 +

    3.3 解方程和不等式 Solve/Reduce

    +

    解方程 Solve

    +Solve解方程 +

    解不等式用 Reduce

    +Reduce解不等式 +

    Reduce 还有更高级的使用,可以约化各种表达式:

    +Reduce的高级应用 +

    这句话说的是:求解 a,ba,b 的范围,使得存在 xx 满足等式 ax=bax=b。实际上就是在求解使一元一次方程有解的参数值。注意 SolveReduce 不一定总返回最简形式的表达式,很多情况下需要手动调用 SimplifyFullSimplify 进行化简。感兴趣的读者可以自行测试上面的例子中不使用 Simplify 的返回结果。

    +

    3.4 解方程的其他方法 NSolve/FindInstance

    +

    NSolve 用法同 Solve,但会返回数值解而不是精确解。相当于 Solve[...] // N
    +FindInstance 用法同 Solve,但添加了一个参数表示至多返回解的个数(默认为 11):

    +FindInstance的使用 +

    3.5 极点值 Maximize/Minimize

    +

    Minimize 返回函数(在限制条件下)的最小值以及取到最小值的(一种)变量值:

    +Minimize的使用 +

    如上图中的示例,Minimize 支持多个变量,可以指定条件,也可指定求解域。
    +Maximize 用法完全相同,返回最大值,此处略过。

    +

    3.6 偏导 D

    +

    偏导 D 的两种最常用用法:

    +
      +
    • D[f, x] 给出 ff 关于 xx 的偏导。
    • +
    • D[f, {x, n}] 给出 ff 关于 xxnn 阶偏导。
    • +
    +

    示例略。注意 f'[x] 可以直接求出 f[x] 的导数:

    +符号求导 +

    3.7 积分 Integrate

    +

    积分 Integrate

    +
      +
    • Integrate[f, x] 给出不定积分 f dx\int f~\mathrm{d}x
    • +
    • Integrate[f, {x, x_min, x_max}] 给出定积分 xminxmaxf dx\int_{x_{min}}^{x_{max}} f~\mathrm{d}x
    • +
    • Integrate[f, {x, x_min, x_max}, {y, y_min, y_max}, ...] 给出多重积分 xminxmaxdxyminymaxdyf\int_{x_{min}}^{x_{max}} \mathrm{d}x \int_{y_{min}}^{y_{max}} \mathrm{d}y\dots f
    • +
    +

    一个简单的定积分示例:

    +Integrate求定积分 +

    3.8 展开 Expand/ExpandAll

    +

    Expand 很好理解,Expand[expr] 会展开表达式 expr\mathrm{expr} 中的乘积和正整数幂。限于篇幅,这里不提供使用范例,可参考官方文档
    +ExpandAllExpand 的基础上,会展开表达式中任意位置的乘积和整数幂。如表达式 Sin[(1 + x)^3]Expand 不会展开其中的 (1+x)^3,而 ExpandAll 会。

    +

    3.9 因式分解 Factor

    +

    Factor[poly]:在整数上对一个多项式分解因式。使用示例参考官方文档

    +

    3.10 绘图 Plot/Plot3D

    +

    PlotPlot3D 的用法较为复杂,这里只介绍最基本的函数绘图:

    +Plot和Plot3D +

    两个语句分别绘制:

    +
      +
    • sin(x)\sin(x) 的图像,其中 2πx2π-2\pi\le x\le 2\pi
    • +
    • sin(x+y2)\sin(x+y^2) 的图像,其中 3x3-3\le x\le 32y2-2\le y\le 2
    • +
    +

    4. 总结

    +

    我自己当初学习 MMA 时,被网上杂乱的教程搞得混乱不堪。因此就想写一篇教程,涵盖所有常用语法知识点,并让初学者避开我自己踩的一些坑。
    +初衷是写个简明的教程,结果一写就是八千多字…… 也感谢认真读到这里的读者们!
    +后续可能还会更一些用 Mathematica 解决数学和实际问题的文章,敬请期待!

    +
    +
    +
      +
    1. 乘法也可简写为 a b(中间必须有空格)。MMA 中,大部分空格可省略,但是乘法的空格不能省略(若写作没有空格的 ab 会被认为是一个变量)。 ↩︎

      +
    2. +
    3. https://www.wolfram.com/language/fast-introduction-for-programmers/en/built-in-functions/ ↩︎

      +
    4. +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/panasonic2020-c/index.html b/post/panasonic2020-c/index.html new file mode 100644 index 00000000..bb3e8f06 --- /dev/null +++ b/post/panasonic2020-c/index.html @@ -0,0 +1,547 @@ + + + + + +Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解 +

    + +
    +
    + 2020-03-16 · 3 min read +
    + + + + C++ + + + + + 算法竞赛 + + +
    +

    题目大意

    +

    输入三个整数aabbcc,如果 a+b<c\sqrt a + \sqrt b < \sqrt c 成立,输出Yes,否则输出No

    +

    样例

    +

    输入 #1

    +
    2 3 9
    +
    +

    输出 #1

    +
    No
    +
    +

    2+3<9\sqrt 2 + \sqrt 3 < \sqrt 9 不成立。

    +

    输入 #2

    +
    2 3 10
    +
    +

    输出 #2

    +
    Yes
    +
    +

    2+3<10\sqrt 2 + \sqrt 3 < \sqrt 10 成立。

    +

    分析

    +

    错误思路

    +

    首先,由于系统sqrt函数的浮点数精度误差,下面这个代码明显会WA:

    +
    #include <cstdio>
    +#include <cmath>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	int a, b, c;
    +	scanf("%d%d%d", &a, &b, &c);
    +	double d = sqrt(double(a)) + sqrt(double(b));
    +	puts(d * d < c? "Yes": "No");
    +	return 0;
    +}
    +
    +

    所以,这个题一定需要特殊思路!!!

    +

    正确思路

    +

    下面是正确方法的推导过程:
    +a+b<c\sqrt a + \sqrt b < \sqrt c
    +(a+b)2<(c)2(\sqrt a + \sqrt b)^2 < (\sqrt c)^2
    +a+b+2ab<ca + b + 2\sqrt ab < c
    +2ab<cab2\sqrt ab < c - a - b
    +(2ab)2<(cab)2(2\sqrt ab)^2 < (c - a - b)^2
    +4ab<(cab)24ab < (c - a - b)^2
    +注意:还有一种情况,就是cab<0c - a - b < 0c<a+bc < a + b,答案应该是No。这种情况不考虑到会WA,因为(cab)2(c - a - b)^2会“直接忽略负数”!

    +

    代码

    +
    #include <cstdio>
    +using namespace std;
    +
    +int main(int argc, char** argv)
    +{
    +	long long a, b, c;
    +	scanf("%lld%lld%lld", &a, &b, &c);
    +	long long d = c - a - b;
    +	if(d < 0) puts("No"); // 特殊情况c - a - b < 0直接输出No
    +	else puts((d * d > 4LL * a * b)? "Yes": "No");
    +	return 0;
    +}
    +
    +AC截屏
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/pws-tencent-us-19ncov/index.html b/post/pws-tencent-us-19ncov/index.html new file mode 100644 index 00000000..d6bc3705 --- /dev/null +++ b/post/pws-tencent-us-19ncov/index.html @@ -0,0 +1,529 @@ + + + + + +【python爬虫】从腾讯API爬取美国疫情数据+制表 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【python爬虫】从腾讯API爬取美国疫情数据+制表 +

    + +
    +
    + 2020-06-03 · 6 min read +
    + + + + Python爬虫 + + + + + Python + + +
    +

    最近(文章撰写时间为2020/6/1 18:40)疫情在中国情况好转,却在美国暴虐。
    +本篇文章将爬取腾讯提供的美国疫情数据并制表。

    +

    1. 爬取数据

    +

    调用API接口

    +

    接口:https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryMerge
    +观察得到的数据:

    +
    {
    +	...,
    +	"data": {
    +		"FAutoCountryMerge": {
    +			...,
    +			"美国": {
    +				"showDash":false,
    +				"list": [
    +					{"date":"01.28","confirm_add":0,"confirm":5,"heal":0,"dead":0},
    +					...,
    +					{"date":"05.29","confirm_add":25069,"confirm":1768461,"heal":510713,"dead":103330},
    +					{"date":"05.30","confirm_add":23290,"confirm":1793530,"heal":519569,"dead":104542},
    +					{"date":"05.31","confirm_add":20350,"confirm":1816820,"heal":535238,"dead":105557},
    +					{"date":"06.01","confirm_add":20350,"confirm":1837170,"heal":599867,"dead":106195}
    +				]
    +			},
    +			...
    +		}
    +	}
    +}
    +
    +

    由如上代码所示,对于一个国家,获取其疫情数据只需要使用:

    +
    json['data']['FAutoCountryMerge']['<国名>']['list']
    +
    +

    对于美国的数据,使用:

    +
    json['data']['FAutoCountryMerge']['美国']['list']
    +
    +

    代码

    +

    上面都是干货,下面才是真正的code

    +
    from requests import get
    +
    +url = 'https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryMerge'
    +data = get(url).json()['data']['FAutoCountryMerge']['美国']['list']
    +
    +

    处理数据

    +

    python中,其结果是一个list对象:

    +
    [
    +	{"date":"01.28","confirm_add":0,"confirm":5,"heal":0,"dead":0},
    +	...,
    +	{"date":"05.29","confirm_add":25069,"confirm":1768461,"heal":510713,"dead":103330},
    +	{"date":"05.30","confirm_add":23290,"confirm":1793530,"heal":519569,"dead":104542},
    +	{"date":"05.31","confirm_add":20350,"confirm":1816820,"heal":535238,"dead":105557},
    +	{"date":"06.01","confirm_add":20350,"confirm":1837170,"heal":599867,"dead":106195}
    +]
    +
    +

    该对象中存放美国每天的疫情数据,
    +date:从1月28日至今的日期;
    +confirm_add:该日新增确诊;
    +confirm:该日累计确诊;
    +heal:该日累计治愈;
    +dead:该日累计死亡。

    +

    筛选数据

    +

    数据的筛选很重要。

    +
      +
    • confirm_add(该日新增确诊)明显没有用,去掉
    • +
    • 应该增加一个now_confirm(该日现存确诊),这样能清楚地看到美国治疗中人数。
      +该值可以通过confirm - heal - head得到。
    • +
    +

    date:从1月28日至今的日期
    +confirm_add:该日新增确诊
    +confirm:该日累计确诊
    +heal:该日累计治愈
    +dead:该日累计死亡
    +now_confirm: 该日现存确诊

    +

    代码

    +

    由于最前面人数太少,数据会影响到最终绘图质量。
    +所以,我从第35个开始保存数据,当然如果您想使用所有数据,将data[35:]改为data即可。

    +
    dates = []
    +confirms = []
    +now_confirms = []
    +heals = []
    +deads = []
    +
    +for day_data in data[35:]:
    +    dates.append(day_data['date'])
    +    confirms.append(day_data['confirm'])
    +    heals.append(day_data['heal'])
    +    deads.append(day_data['dead'])
    +    now_confirms.append(confirms[-1] - heals[-1] - deads[-1])
    +
    +

    2. 绘图

    +

    参考文章:https://www.cnblogs.com/lone5wolf/p/10870200.html
    +由于我在绘图方面还是个小白,所以直接贴出代码,敬请谅解。。。

    +
    import matplotlib.pyplot as plt
    +from matplotlib.font_manager import FontProperties
    +
    +# 绘制文本
    +plt.figure(figsize=(11.4, 7.7))
    +
    +confirm_line, = plt.plot(dates, confirms, color='#8B0000')
    +now_confirm_line, = plt.plot(dates, now_confirms, color='red', linestyle=':')
    +heal_line, = plt.plot(dates, heals, color='green', linestyle='--')
    +dead_line, = plt.plot(dates, deads, color='black', linestyle='-.')
    +
    +# 绘制图形
    +my_font = FontProperties(fname=r'fonts\msyh.ttc')
    +plt.legend(handles=[confirm_line, now_confirm_line, heal_line, dead_line], labels=['累计确诊', '现存确诊', '治愈', '死亡'], prop=my_font)
    +plt.xlabel('日期', fontproperties=my_font)
    +plt.ylabel('人数', fontproperties=my_font)
    +plt.title('美国2019-nCov疫情情况', fontproperties=my_font)
    +plt.gca().xaxis.set_major_locator(plt.MultipleLocator(7))
    +
    +# 保存并显示统计图
    +plt.savefig('AmericaNCovData.png')
    +plt.show()
    +
    +

    结果图片

    +美国nCov +

    3. 完整代码

    +
    # -*- coding: utf-8 -*-
    +from requests import get
    +import matplotlib.pyplot as plt
    +from matplotlib.font_manager import FontProperties
    +
    +url = 'https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryMerge'
    +data = get(url).json()['data']['FAutoCountryMerge']['美国']['list']
    +
    +dates = []
    +confirms = []
    +now_confirms = []
    +heals = []
    +deads = []
    +
    +for day_data in data[35:]:
    +    dates.append(day_data['date'])
    +    confirms.append(day_data['confirm'])
    +    heals.append(day_data['heal'])
    +    deads.append(day_data['dead'])
    +    now_confirms.append(confirms[-1] - heals[-1] - deads[-1])
    +
    +# 绘制文本
    +plt.figure(figsize=(11.4, 7.7))
    +
    +confirm_line, = plt.plot(dates, confirms, color='#8B0000')
    +now_confirm_line, = plt.plot(dates, now_confirms, color='red', linestyle=':')
    +heal_line, = plt.plot(dates, heals, color='green', linestyle='--')
    +dead_line, = plt.plot(dates, deads, color='black', linestyle='-.')
    +
    +# 绘制图形
    +my_font = FontProperties(fname=r'fonts\msyh.ttc')
    +plt.legend(handles=[confirm_line, now_confirm_line, heal_line, dead_line], labels=['累计确诊', '现存确诊', '治愈', '死亡'], prop=my_font)
    +plt.xlabel('日期', fontproperties=my_font)
    +plt.ylabel('人数', fontproperties=my_font)
    +plt.title('美国2019-nCov疫情情况', fontproperties=my_font)
    +plt.gca().xaxis.set_major_locator(plt.MultipleLocator(7))
    +
    +# 保存并显示统计图
    +plt.savefig('AmericaNCovData.png')
    +plt.show()
    +
    +

    代码下载:GitHub

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/py_codelinescounter/index.html b/post/py_codelinescounter/index.html new file mode 100644 index 00000000..53f522f6 --- /dev/null +++ b/post/py_codelinescounter/index.html @@ -0,0 +1,769 @@ + + + + + +【Python】72行实现代码行数统计,简单实用! - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【Python】72行实现代码行数统计,简单实用! +

    + +
    +
    + 2022-03-15 · 11 min read +
    + + + + Python + + +
    +

    0. 前言

    +

    最近突然想知道自己总共写了多少行代码,于是做了这样一个小工具……

    +

    1. 准备工作

    +

    先考虑一下希望得到的效果:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Language(语言)Lines(代码行数)Size(代码文件总大小)Files(代码文件总数)
    A12345300 KB193
    B2345165 KB98
    如上,程序输出一个表格,将代码行数作为关键字排序。
    代码框架:
    +
    # -*- encoding: utf-8 -*-
    +import ...
    +
    +# 代码行数计数类
    +class CodeLinesCounter(object):
    +    SIZES = [('B', 1), ('KB', 1024), ('MB', 1024**2), ('GB', 1024**3), ('TB', 1024**4)]
    +    
    +    def __init__(self, languages):
    +        self._languages = languages # 语言(dict,{文件后缀名:语言})
    +        self._codelines = {suffix: (0, 0, 0) for suffix in languages} # 统计结果,{后缀名:(行数,大小,文件数)}
    +        self._successful = self._error = 0 # 记录成功、失败文件个数
    +    
    +    # @param directory: 要扫描的目录
    +    # @param log: 是否打印日志
    +    def scan(self, directory, log=False):
    +        if log: print('Scanning', directory)
    +        pass
    +    
    +    def report(self): # 输出结果
    +        pass
    +
    +counter = CodeLinesCounter(languages={'py': 'Python', 'c': 'C', 'cpp': 'C++', 'java': 'Java', 'js': 'JavaScript', 'html': 'HTML', 'css': 'CSS', 'txt': 'Plain text'}) # 创建CodeLinesCounter实例
    +counter.scan('E:/') # 扫描E盘(注意不能用'E:')
    +counter.report() # 输出结果
    +
    +

    完成,下面正式进入主要部分

    +

    2. 统计

    +

    2.1 文件扫描

    +

    首先,我们需要获取根目录下的文件列表。这可以用os.walk实现:
    +os.walk(rootdir)返回一个游走器(可迭代),包含根目录下每个子目录的文件及目录列表。我们来看一个例子:
    +有一文件夹Folder如下:

    +
    Folder
    +|   file1
    +|   Folder1
    +|       file2
    +|       file3
    +|   Folder2
    +    |   file4
    +    |   Folder3
    +
    +

    运行如下代码:

    +
    import os
    +
    +for root, dirs, files in os.walk('Folder'):
    +    print(root, dirs, files)
    +
    +

    则输出如下:

    +
    Folder					['Folder1', 'Folder2']	['file1']
    +Folder\Folder1			[]						['file2', 'file3']
    +Folder\Folder2			['Folder3']				['file4']
    +Folder\Folder2\Folder3	[]						[]
    +
    +

    其中第一项是当前的根目录,第二项为目录下的目录列表,第三项则为当前的文件列表。
    +因此,我们可以编写如下代码:

    +
    # -*- encoding: utf-8 -*-
    +from os.path import join, getsize, abspath
    +from os import walk
    +
    +class CodeLinesCounter(object):
    +    SIZES = [('B', 1), ('KB', 1024), ('MB', 1024**2), ('GB', 1024**3), ('TB', 1024**4)]
    +    
    +    def __init__(self, languages):
    +        self._languages = languages
    +        self._results = {suffix: (0, 0, 0) for suffix in languages}
    +        self._successful = self._error = 0
    +    
    +    def scan(self, directory, log=False):
    +        if log: print('Scanning', directory)
    +        try:
    +            for root, _, files in walk(abspath(directory)):
    +                for filename in files:
    +                    suffix = filename[filename.rfind('.') + 1:]
    +                    filename = join(root, filename)
    +                    if suffix in self._results:
    +                        lines, size, numFiles = self._results[suffix]
    +                        lines += 1 # 暂不统计,先按一行计算
    +                        numFiles += 1
    +                        size += getsize(filename) # getsize返回文件大小(字节)
    +                        self._results[suffix] = (lines, size, numFiles)
    +                    if log: print(filename)
    +        except KeyboardInterrupt:
    +            print('\nUser stopped operation')
    +        else:
    +            if log: print('Scan finished')
    +    
    +    def report(self):
    +        print('Language\tLines\tSize\tFiles')
    +        for suffix, (lines, size, files) in sorted(self._results.items(), key=lambda x: x[1], reverse=True):
    +            print(self._languages[suffix], lines, self.__format_size(size), files, sep='\t')
    +
    +    # 单位转换
    +    def __format_size(self, bytes):
    +        for suffix, size in self.SIZES:
    +            if bytes < size * 1024:
    +                return '%.2f %s' % (bytes / size, suffix)
    +        return '%.2f %s' % (bytes / self.SIZES[-1][1], 2, self.SIZES[-1][0])
    +
    +counter = CodeLinesCounter(languages={'py': 'Python', 'c': 'C', 'cpp': 'C++', 'java': 'Java', 'js': 'JavaScript', 'html': 'HTML', 'css': 'CSS', 'txt': 'Plain text'})
    +counter.scan('E:/')
    +counter.report()
    +
    +

    运行结果应类似于下面这样(手动整理了一下):

    +
    Language        Lines   Size    		Files
    +C++     		667     671.51 KB       667
    +Python  		317     981.01 KB       317
    +HTML    		38      466.52 KB       38
    +Plain text    34      90.69 KB        34
    +JavaScript    19      1.43 MB			19
    +CSS     		9       341.04 KB       9
    +C       		2       20.45 KB        2
    +Java    		1       676.00 B        1
    +
    +

    好,下面来到行数统计部分(表格输出后面会介绍)。

    +

    2.2 行数统计

    +

    众所周知,空行不应该算在代码行数中。因此,统计时需忽略空行。先写上如下代码(替换掉刚才的23行):

    +
    with open(filename, 'r', encoding='utf-8') as f: # utf-8编码打开文件
    +    for line in f:
    +        if line and not line.isspace(): # 去掉空行
    +            lines += 1
    +
    +

    但是,正当我们兴致勃勃地运行时——

    +
    Traceback (most recent call last):
    +  ...
    +  File "...\lib\codecs.py", line 322, in decode
    +    (result, consumed) = self._buffer_decode(data, self.errors, final)
    +UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 355: invalid start byte
    +
    +

    程序报错UnicodeDecodeError,分析后发现原因是部分文件使用了GBK编码,而utf-8编码无法正确打开,因此造成错误。
    +我们再次改进程序,使其尝试两种编码:

    +
    try:
    +    ln = 0
    +    with open(filename, 'r', encoding='utf-8') as f:
    +        for line in f:
    +            if line and not line.isspace():
    +                ln += 1
    +except UnicodeDecodeError: # 尝试使用GBK编码打开
    +    try:
    +        ln = 0
    +        with open(filename, 'r', encoding='gbk') as f:
    +            for line in f:
    +                if line and not line.isspace():
    +                    ln += 1
    +    except:
    +        print(filename, '[Error: unknown encoding]')
    +        self._error += 1
    +    else:
    +        lines += ln
    +except Exception as e:
    +    print(filename, '[Unknown error: %s]' % e)
    +    self._error += 1
    +    continue
    +lines += ln
    +if log: print(f'{filename} [{ln}]')
    +self._successful += 1
    +
    +

    这次,我们得到了正确的结果:

    +
    Language        Lines   Size    		Files
    +C++     		35595   671.51 KB       667
    +JavaScript    24485   1.43 MB 		19
    +Python  		24130   982.16 KB       317
    +CSS     		8203    341.04 KB       9
    +HTML    		6138    466.52 KB       38
    +Plain text    741     90.69 KB        34
    +C       		557     20.45 KB        2
    +Java    		29      676.00 B        1
    +
    +

    现在仅剩最后一步了——制表。

    +

    3. 制表

    +

    python输出表格可以使用PrettyTable库。具体用法如下:

    +
    # -*- encoding: utf-8 -*-
    +from os.path import join, getsize, abspath
    +from os import walk
    +from prettytable import PrettyTable
    +
    +class CodeLinesCounter(object):
    +    SIZES = [('B', 1), ('KB', 1024), ('MB', 1024**2), ('GB', 1024**3), ('TB', 1024**4)]
    +    
    +    def __init__(self, languages):
    +        self._languages = languages
    +        self._results = {suffix: (0, 0, 0) for suffix in languages}
    +        self._successful = self._error = 0
    +    
    +    def scan(self, directory, log=False):
    +        if log: print('Scanning', directory)
    +        try:
    +            for root, _, files in walk(abspath(directory)):
    +                for filename in files:
    +                    suffix = filename[filename.rfind('.') + 1:]
    +                    filename = join(root, filename)
    +                    if suffix in self._results:
    +                        lines, size, numFiles = self._results[suffix]
    +                        numFiles += 1
    +                        size += getsize(filename)
    +                        try:
    +                            ln = 0
    +                            with open(filename, 'r', encoding='utf-8') as f:
    +                                for line in f:
    +                                    if line and not line.isspace():
    +                                        ln += 1
    +                        except UnicodeDecodeError: # Try 'gbk' encoding
    +                            try:
    +                                ln = 0
    +                                with open(filename, 'r', encoding='gbk') as f:
    +                                    for line in f:
    +                                        if line and not line.isspace():
    +                                            ln += 1
    +                            except:
    +                                print(filename, '[Error: unknown encoding]')
    +                                self._error += 1
    +                            else:
    +                                lines += ln
    +                        except Exception as e:
    +                            print(filename, '[Unknown error: %s]' % e)
    +                            self._error += 1
    +                            continue
    +                        lines += ln
    +                        if log: print(f'{filename} [{ln}]')
    +                        self._successful += 1
    +                        self._results[suffix] = (lines, size, numFiles)
    +                    elif log:
    +                        print(filename, '[None]')
    +        except KeyboardInterrupt:
    +            print('\nUser stopped operation')
    +        else:
    +            if log: print('Scan finished')
    +    
    +    def report(self):
    +        table = PrettyTable(['Language', 'Lines', 'Size', 'Files'], title=f'Scan result (OK {self._successful}, Error {self._error})') # 创建PrettyTable实例,添加标题
    +        for suffix, (lines, size, files) in sorted(self._results.items(), key=lambda x: x[1], reverse=True):
    +            table.add_row([self._languages[suffix], lines, self.__format_size(size), files]) # 添加行
    +        print(table) # 输出
    +    
    +    def __format_size(self, bytes):
    +        for suffix, size in self.SIZES:
    +            if bytes < size * 1024:
    +                return '%.2f %s' % (bytes / size, suffix)
    +        return '%.2f %s' % (bytes / self.SIZES[-1][1], 2, self.SIZES[-1][0])
    +
    +counter = CodeLinesCounter(languages={'py': 'Python', 'c': 'C', 'cpp': 'C++', 'java': 'Java', 'js': 'JavaScript', 'html': 'HTML', 'css': 'CSS', 'txt': 'Plain text'})
    +counter.scan('E:/')
    +counter.report()
    +
    +

    运行结果:

    +
    +----------------------------------------+
    +|     Scan result (OK 1087, Error 0)     |
    ++------------+-------+-----------+-------+
    +|  Language  | Lines |    Size   | Files |
    ++------------+-------+-----------+-------+
    +|    C++     | 35595 | 671.51 KB |  667  |
    +| JavaScript | 24485 |  1.43 MB  |   19  |
    +|   Python   | 24130 | 982.16 KB |  317  |
    +|    CSS     |  8203 | 341.04 KB |   9   |
    +|    HTML    |  6138 | 466.52 KB |   38  |
    +| Plain text |  741  |  90.69 KB |   34  |
    +|     C      |  557  |  20.45 KB |   2   |
    +|    Java    |   29  |  676.00 B |   1   |
    ++------------+-------+-----------+-------+
    +
    +

    4. 总结

    +

    最终代码(无注释):

    +
    # -*- encoding: utf-8 -*-
    +from os.path import join, getsize, abspath
    +from os import walk
    +from prettytable import PrettyTable
    +
    +class CodeLinesCounter(object):
    +    SIZES = [('B', 1), ('KB', 1024), ('MB', 1024**2), ('GB', 1024**3), ('TB', 1024**4)]
    +    
    +    def __init__(self, languages):
    +        self._languages = languages
    +        self._results = {suffix: (0, 0, 0) for suffix in languages}
    +        self._successful = self._error = 0
    +    
    +    def scan(self, directory, log=False):
    +        if log: print('Scanning', directory)
    +        try:
    +            for root, _, files in walk(abspath(directory)):
    +                for filename in files:
    +                    suffix = filename[filename.rfind('.') + 1:]
    +                    filename = join(root, filename)
    +                    if suffix in self._results:
    +                        lines, size, numFiles = self._results[suffix]
    +                        numFiles += 1
    +                        size += getsize(filename)
    +                        try:
    +                            ln = 0
    +                            with open(filename, 'r', encoding='utf-8') as f:
    +                                for line in f:
    +                                    if line and not line.isspace():
    +                                        ln += 1
    +                        except UnicodeDecodeError: # Try 'gbk' encoding
    +                            try:
    +                                ln = 0
    +                                with open(filename, 'r', encoding='gbk') as f:
    +                                    for line in f:
    +                                        if line and not line.isspace():
    +                                            ln += 1
    +                            except:
    +                                print(filename, '[Error: unknown encoding]')
    +                                self._error += 1
    +                            else:
    +                                lines += ln
    +                        except Exception as e:
    +                            print(filename, '[Unknown error: %s]' % e)
    +                            self._error += 1
    +                            continue
    +                        lines += ln
    +                        if log: print(f'{filename} [{ln}]')
    +                        self._successful += 1
    +                        self._results[suffix] = (lines, size, numFiles)
    +                    elif log:
    +                        print(filename, '[None]')
    +        except KeyboardInterrupt:
    +            print('\nUser stopped operation')
    +        else:
    +            if log: print('Scan finished')
    +    
    +    def report(self):
    +        table = PrettyTable(['Language', 'Lines', 'Size', 'Files'], title=f'Scan result (OK {self._successful}, Error {self._error})')
    +        for suffix, (lines, size, files) in sorted(self._results.items(), key=lambda x: x[1], reverse=True):
    +            table.add_row([self._languages[suffix], lines, self.__format_size(size), files])
    +        print(table)
    +    
    +    def __format_size(self, bytes):
    +        for suffix, size in self.SIZES:
    +            if bytes < size * 1024:
    +                return '%.2f %s' % (bytes / size, suffix)
    +        return '%.2f %s' % (bytes / self.SIZES[-1][1], 2, self.SIZES[-1][0])
    +
    +counter = CodeLinesCounter(languages={'py': 'Python', 'c': 'C', 'cpp': 'C++', 'java': 'Java', 'js': 'JavaScript', 'html': 'HTML', 'css': 'CSS', 'txt': 'Plain text'})
    +counter.scan('E:/')
    +counter.report()
    +
    +

    后期改进:

    +
      +
    • 增加正则表达式忽略文件
    • +
    • matplotlib绘图
    • +
    • PyQt5GUI
    • +
    • ……(欢迎提出宝贵的意见!)
    • +
    +

    P.S. 我的CSDN ID是write_1m_lines,看来还没有一百万行代码……

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/pypi-tsmirror/index.html b/post/pypi-tsmirror/index.html new file mode 100644 index 00000000..285e1300 --- /dev/null +++ b/post/pypi-tsmirror/index.html @@ -0,0 +1,358 @@ + + + + + +pip速度太慢解决(使用清华镜像) - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + pip速度太慢解决(使用清华镜像) +

    + +
    +
    + 2020-07-12 · 1 min read +
    + + + + Python + + +
    +

    python的包管理工具pip速度太慢,经常下载时报错,可以使用清华镜像代替默认下载源。以下两种方法任何电脑都可以使用,演示电脑为Windows 10 版本1909

    +

    临时方法

    +

    使用pip下载时,临时使用镜像(命令行):

    +
    pip install <包名称> -i https://pypi.tuna.tsinghua.edu.cn/simple
    +
    +舒服 +

    永久方法

    +

    打开命令行,执行:

    +
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    +
    +就问你快不快 +
    +

    1.1MB/s 2.2MB/s 6.8MB/s

    +
    +

    P. S. 网上搜了NN篇文章都说自己创建pip.ini文件...

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/pyside6-accountbook/index.html b/post/pyside6-accountbook/index.html new file mode 100644 index 00000000..db32f1a0 --- /dev/null +++ b/post/pyside6-accountbook/index.html @@ -0,0 +1,855 @@ + + + + + +PyQt6/PySide6:账本项目前端制作【附完整项目地址】 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + PyQt6/PySide6:账本项目前端制作【附完整项目地址】 +

    + +
    +
    + 2022-07-23 · 12 min read +
    + + + + GitHub + + + + + Qt教程 + + +
    +

    0. 前言

    +

    最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。

    +

    屏幕截图:
    +MainWindow

    +dlgAdd +stat +

    1. 后端

    +

    后端主要是朋友做的,在这里就不多说了,放个代码:
    +src/api.py

    +
    from collections import defaultdict
    +
    +class ApiError(RuntimeError):
    +    pass
    +
    +def openFile(filename):
    +    '''
    +    Open file.
    +    File format: 4 lines per record for date, event type, money delta, and note.
    +    Such as:
    +    (file.example, encoding=utf-8)
    +      (Record 1)
    +        (ln 1) date1
    +        (ln 2) event_type1
    +        (ln 3) money_delta1
    +        (ln 4) note1
    +      (Record 2)
    +        (ln 5) date2
    +        (ln 6) event_type2
    +        (ln 7) money_delta2
    +        (ln 8) note2
    +    @param filename: File name.
    +    Returns: data in the format [[date1, event_type1, money_delta1, note1], ...]
    +    '''
    +    with open(filename, 'r', encoding='utf-8') as f:
    +        res = []
    +        while date := f.readline():
    +            if (etype := f.readline()) and (mdelta := f.readline()) and (note := f.readline()):
    +                res.append([date.rstrip('\n'), etype.rstrip('\n'), mdelta.rstrip('\n'), note.rstrip('\n')])
    +            else:
    +                raise ApiError('Unexpected EOF at ' + filename)
    +        return res
    +
    +def saveFile(filename, data): # Save
    +    '''
    +    Save with the same format mentioned in openFile().
    +    @param filename: File name.
    +    @param data: Data with the same format returned in openFile().
    +    '''
    +    with open(filename, 'w', encoding='utf-8') as f:
    +        for line in data:
    +            print(*line, sep='\n', file=f)
    +
    +def query(data, key):
    +    return [record for record in data if any(key in x for x in record)] if key else data
    +
    +def total(data):
    +    in_total = out_total = 0
    +    for _, _, mdelta, _ in data:
    +        mdelta = int(mdelta)
    +        if mdelta < 0:
    +            out_total -= mdelta
    +        else:
    +            in_total += mdelta
    +    return in_total, out_total
    +
    +def totalByEvent(data):
    +    cnt = defaultdict(lambda: [0, 0])
    +    for _, event, mdelta, _ in data:
    +        mdelta = int(mdelta)
    +        if mdelta < 0:
    +            cnt[event][1] -= mdelta
    +        else:
    +            cnt[event][0] += mdelta
    +    return cnt
    +
    +def totalByDate(data):
    +    cnt = defaultdict(lambda: [0, 0])
    +    for date, _, mdelta, _ in data:
    +        mdelta = int(mdelta)
    +        if mdelta < 0:
    +            cnt[date][1] -= mdelta
    +        else:
    +            cnt[date][0] += mdelta
    +    return cnt
    +
    +

    详见https://blog.csdn.net/qq_67190987/article/details/125918530

    +

    2. 前端

    +

    正如标题中所说,框架采用Qt6+Python,一般有两种选择(PyQt6PySide6),我这里使用的是PySide6

    +

    2.1 准备资源

    +

    src/icons下存好所有图片资源:
    +图片

    +

    2.2 Designer 窗口绘制

    +

    用Qt Designer绘制好各个窗口,如图:

    +QMainWindow +QDialog +

    2.3 安装依赖项

    +

    准备一份requirements.txt,内容如下:

    +
    PySide6>=6.3.1
    +
    +

    然后,cmd中输入:

    +
    pip install -r requirements.txt
    +
    +

    搞定安装。

    +

    2.4 编译资源和UI

    +

    这个就不用多说了,直接用pyside6-uicpyside6-rcc命令编译文件,编译出的文件列表如下:

    +
    AccountBook
    +└─src
    +    │  dlgAdd.ui
    +    │  dlgCharts.ui
    +    │  MainWindow.ui
    +    │  res.qrc
    +    │  res_rc.py
    +    │  ui_dlgAdd.py
    +    │  ui_dlgCharts.py
    +    │  ui_dlgHelp.py
    +    │  ui_MainWindow.py
    +
    +

    2.5 代码编写

    +

    src/dlgAdd.py
    +“添加账目”窗口,一个简单的QDialog实例。

    +
    from PySide6.QtWidgets import *
    +from PySide6.QtCore import QDate, QRegularExpression
    +from PySide6.QtGui import QRegularExpressionValidator
    +from ui_dlgAdd import Ui_Dialog
    +
    +class dlgAdd(QDialog):
    +    def __init__(self, parent=None):
    +        super().__init__(parent)
    +        self.ui = Ui_Dialog()
    +        self.ui.setupUi(self)
    +        self.ui.dateEdit.setDate(QDate.currentDate())
    +        self.ui.moneyEdit.setValidator(QRegularExpressionValidator(QRegularExpression(r'(\+|\-)[1-9]+[0-9]*')))
    +        self.ui.buttonBox.button(QDialogButtonBox.Ok).setText('确定')
    +        self.ui.buttonBox.button(QDialogButtonBox.Cancel).setText('取消')
    +    
    +    def getRow(self):
    +        date = self.ui.dateEdit.text()
    +        event = self.ui.eventEdit.text()
    +        money = self.ui.moneyEdit.text()
    +        note = self.ui.noteEdit.text()
    +        return [date, event, money, note]
    +
    +    def accept(self):
    +        if not self.ui.eventEdit.text():
    +            QMessageBox.critical(self, "错误", "事件不能为空,请重新填写。")
    +            return
    +        if self.ui.moneyEdit.text() in ('', '+', '-'):
    +            QMessageBox.critical(self, "错误", "金额不能为空,请重新填写。")
    +            return
    +        return super().accept()
    +
    +

    src/dlgCharts.py
    +图表展示窗口,使用QtCharts(用法跟PyQt5/PySide2略有区别)绘制柱状图。后续会考虑增加更多图表。

    +
    from bisect import bisect_left, bisect_right
    +
    +from PySide6.QtCore import QDate, Qt
    +from PySide6.QtWidgets import *
    +from PySide6.QtCharts import QBarCategoryAxis, QBarSeries, QBarSet, QChart, QChartView, QValueAxis
    +
    +from api import total, totalByDate, totalByEvent
    +from ui_dlgCharts import Ui_Dialog
    +
    +class dlgCharts(QDialog):
    +    def __init__(self, data, parent=None):
    +        super().__init__(parent)
    +        self.ui = Ui_Dialog()
    +        self.ui.setupUi(self)
    +        self.showMaximized()
    +
    +        self.data = data
    +        minDate = QDate.fromString(data[0][0], 'yyyy/MM/dd')
    +        maxDate = QDate.fromString(data[-1][0], 'yyyy/MM/dd')
    +        self.ui.startDateEdit.setDateRange(minDate, maxDate)
    +        self.ui.endDateEdit.setDateRange(minDate, maxDate)
    +        self.ui.startDateEdit.setDate(minDate)
    +        self.ui.endDateEdit.setDate(maxDate)
    +
    +        self.__update_totalChart(*total(data))
    +        self.__update_eventChart(totalByEvent(data))
    +        self.__update_dateChart(totalByDate(data))
    +
    +        self.ui.startDateEdit.editingFinished.connect(self.__updateCharts)
    +        self.ui.endDateEdit.editingFinished.connect(self.__updateCharts)
    +
    +    @staticmethod
    +    def createChart(chartView: QChartView, title, xAxis, yAxisList):
    +        chart = QChart()
    +        chart.setTitle(title)
    +        chart.setAnimationOptions(QChart.SeriesAnimations)
    +
    +        series = QBarSeries()
    +        for axisName, data in yAxisList:
    +            barSet = QBarSet(axisName)
    +            barSet.append(data)
    +            series.append(barSet)
    +        chart.addSeries(series)
    +
    +        axisX = QBarCategoryAxis()
    +        axisX.append(xAxis)
    +        chart.addAxis(axisX, Qt.AlignBottom)
    +        series.attachAxis(axisX)
    +
    +        axisY = QValueAxis()
    +        axisY.setLabelFormat('%d')
    +        chart.addAxis(axisY, Qt.AlignLeft)
    +        series.attachAxis(axisY)
    +
    +        chartView.setChart(chart)
    +
    +    def __update_totalChart(self, total_in, total_out):
    +        self.createChart(
    +            chartView = self.ui.totalView,
    +            title     = '总收支',
    +            xAxis     = ['收入', '支出'], 
    +            yAxisList = [
    +                ('金额', [total_in, total_out])
    +            ]
    +        )
    +
    +    def __update_eventChart(self, events):
    +        self.createChart(
    +            chartView = self.ui.eventView,
    +            title     = '收支分类',
    +            xAxis     = list(events.keys()),
    +            yAxisList = [
    +                ('收入', list(map(lambda x: x[0], events.values()))),
    +                ('支出', list(map(lambda x: x[1], events.values())))
    +            ]
    +        )
    +
    +    def __update_dateChart(self, dates):
    +        self.createChart(
    +            chartView = self.ui.dateView,
    +            title     = '每日收支',
    +            xAxis     = list(dates.keys()),
    +            yAxisList = [
    +                ('收入', list(map(lambda x: x[0], dates.values()))),
    +                ('支出', list(map(lambda x: x[1], dates.values())))
    +            ]
    +        )
    +
    +    def __updateCharts(self):
    +        startDate = self.ui.startDateEdit.text()
    +        endDate = self.ui.endDateEdit.text()
    +        left = bisect_left(self.data, startDate, key=lambda x: x[0])
    +        right = bisect_right(self.data, endDate, key=lambda x: x[0])
    +        data = self.data[left:right]
    +        self.__update_totalChart(*total(data))
    +        self.__update_eventChart(totalByEvent(data))
    +        self.__update_dateChart(totalByDate(data))
    +
    +

    src/main.py
    +主程序,同时管理主窗口。最麻烦的地方是QTableView,要同时处理搜索和排序问题。

    +
    import sys
    +from bisect import insort_right
    +from functools import partial
    +from os.path import basename
    +from webbrowser import open_new_tab
    +
    +from PySide6.QtWidgets import *
    +from PySide6.QtCore import Slot, QDate
    +from PySide6.QtGui import QStandardItem, QStandardItemModel
    +
    +from api import ApiError, openFile, query, saveFile
    +from dlgAdd import dlgAdd
    +from dlgCharts import dlgCharts
    +from ui_dlgHelp import Ui_Dialog as Ui_dlgHelp
    +from ui_MainWindow import Ui_MainWindow
    +
    +# Version info
    +VERSION = '1.0.1'
    +CHANNEL = 'stable'
    +BUILD_DATE = '2022-07-01'
    +FULL_VERSION = f'{VERSION}-{CHANNEL} ({BUILD_DATE}) on {sys.platform}'
    +
    +app = QApplication(sys.argv)
    +
    +class AccountBookMainWindow(QMainWindow):
    +    version_str = '账本 ' + VERSION
    +    unsaved_tip = '*'
    +    SUPPORTED_FILTERS = '账本文件(*.abf);;文本文件(*.txt);;所有文件(*.*)'
    +
    +    def __init__(self, parent=None):
    +        # Initialize window
    +        super().__init__(parent)
    +        self.ui = Ui_MainWindow()
    +        self.ui.setupUi(self)
    +        self.setWindowTitle('账本 ' + VERSION)
    +        self.labStatus = QLabel(self)
    +        self.ui.statusBar.addWidget(self.labStatus)
    +
    +        # Initialize table
    +        self.model = QStandardItemModel(0, 4, self)
    +        self.model.setHorizontalHeaderLabels(['日期', '事项', '金额', '备注'])
    +        self.ui.table.setModel(self.model)
    +        self.ui.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
    +
    +        self.__data = []
    +        self.on_actFile_New_triggered()
    +        self.ui.actEdit_Remove.setEnabled(False)
    +
    +        # Connect slots
    +        self.ui.table.selectionModel().selectionChanged.connect(self.__selectionChanged)
    +        self.model.itemChanged.connect(self.__itemChanged)
    +
    +    def __updateTable(self, data):
    +        self.model.itemChanged.disconnect(self.__itemChanged)
    +        self.model.setRowCount(len(data))
    +        for row in range(len(data)):
    +            for col in range(len(data[row])):
    +                self.model.setItem(row, col, QStandardItem(data[row][col]))
    +        self.model.itemChanged.connect(self.__itemChanged)
    +
    +    def __openFile(self, filename):
    +        try:
    +            self.__data = openFile(filename)
    +        except IOError:
    +            QMessageBox.critical(self, '错误', '文件打开失败。请稍后再试。')
    +        except ApiError:
    +            QMessageBox.critical(self, '错误', '文件格式错误。请检查文件完整性。')
    +        except Exception as e:
    +            QMessageBox.critical(self, '错误', '未知错误:' + str(e.with_traceback()))
    +        else:
    +            self.ui.searchEdit.clear()
    +            self.__key = ''
    +            self.__updateTable(self.__data)
    +            self.labStatus.setText(filename)
    +            self.setWindowTitle(self.version_str)
    +            self.__filename = filename
    +
    +    def __saveFile(self, filename):
    +        try:
    +            saveFile(filename, self.__data)
    +        except IOError:
    +            QMessageBox.critical(self, '错误', '文件保存错误。请稍后再试。')
    +        except Exception as e:
    +            QMessageBox.critical(self, '错误', '未知错误:' + str(e.with_traceback()))
    +        else:
    +            self.labStatus.setText('保存成功:' + filename)
    +            self.setWindowTitle(self.version_str)
    +            self.__filename = filename
    +
    +    @Slot()
    +    def on_actFile_New_triggered(self):
    +        self.__filename = self.__key = ''
    +        self.setWindowTitle(self.unsaved_tip + self.version_str)
    +        self.labStatus.setText('新文件')
    +        self.model.setRowCount(0)
    +        self.__data.clear()
    +
    +    @Slot()
    +    def on_actFile_Open_triggered(self):
    +        filename, _ = QFileDialog.getOpenFileName(self, '打开', filter=self.SUPPORTED_FILTERS)
    +        if filename:
    +            self.__openFile(filename)
    +
    +    @Slot()
    +    def on_actFile_Save_triggered(self):
    +        if self.__filename:
    +            self.__saveFile(self.__filename)
    +        else:
    +            filename, _ = QFileDialog.getSaveFileName(self, '保存', filter=self.SUPPORTED_FILTERS)
    +            if filename:
    +                self.__saveFile(filename)
    +
    +    @Slot()
    +    def on_actFile_SaveAs_triggered(self):
    +        filename, _ = QFileDialog.getSaveFileName(self, '另存为', filter=self.SUPPORTED_FILTERS)
    +        if filename:
    +            self.__saveFile(filename)
    +
    +    @Slot()
    +    def on_actHelp_About_triggered(self):
    +        dialog = QDialog(self)
    +        ui = Ui_dlgHelp()
    +        ui.setupUi(dialog)
    +        for link in (ui.githubLink, ui.giteeLink, ui.licenseLink, ui.readmeLink):
    +            link.clicked.connect(partial(open_new_tab, link.description()))
    +        ui.labVersion.setText('版本号:' + FULL_VERSION)
    +        ui.btnUpdate.clicked.connect(partial(open_new_tab, 'https://github.com/GoodCoder666/AccountBook/releases'))
    +        dialog.exec()
    +
    +    @Slot()
    +    def on_actHelp_AboutQt_triggered(self):
    +        QMessageBox.aboutQt(self, '关于Qt')
    +
    +    @Slot()
    +    def on_actEdit_Add_triggered(self):
    +        dialog = dlgAdd(self)
    +        if dialog.exec() == QDialog.Accepted:
    +            row = dialog.getRow()
    +            insort_right(self.__data, row)
    +            self.__updateTable(query(self.__data, self.__key))
    +            self.setWindowTitle(self.unsaved_tip + self.version_str)
    +
    +    @Slot()
    +    def on_actEdit_Remove_triggered(self):
    +        rows = list(set(map(lambda idx: idx.row(), self.ui.table.selectedIndexes())))
    +        for row in rows:
    +            self.__data.remove([self.model.item(row, col).text() for col in range(self.model.columnCount())])
    +        self.model.itemChanged.disconnect(self.__itemChanged)
    +        self.model.removeRows(rows[0], len(rows))
    +        self.model.itemChanged.connect(self.__itemChanged)
    +        self.setWindowTitle(self.unsaved_tip + self.version_str)
    +
    +    def __selectionChanged(self):
    +        self.ui.actEdit_Remove.setEnabled(self.ui.table.selectionModel().hasSelection())
    +
    +    def __itemChanged(self, item: QStandardItem):
    +        i, j, new = item.row(), item.column(), item.text()
    +        if (old := self.__data[i][j]) == new: return
    +        if j == 0 and not QDate.fromString(new, 'yyyy/MM/dd').isValid():
    +            QMessageBox.critical(self, '错误', '日期格式错误。')
    +            self.model.itemChanged.disconnect(self.__itemChanged)
    +            item.setText(old)
    +            self.model.itemChanged.connect(self.__itemChanged)
    +            return
    +        row = self.__data.pop(i)
    +        row[j] = new
    +        insort_right(self.__data, row)
    +        self.__updateTable(query(self.__data, self.__key))
    +        self.setWindowTitle(self.unsaved_tip + self.version_str)
    +
    +    @Slot()
    +    def on_searchEdit_textChanged(self):
    +        self.__key = self.ui.searchEdit.text()
    +        self.__updateTable(query(self.__data, self.__key))
    +
    +    @Slot()
    +    def on_actStat_Show_triggered(self):
    +        if self.__data:
    +            dlgCharts(self.__data, self).exec()
    +        else:
    +            QMessageBox.information(self, '提示', '请添加数据以使用统计功能。')
    +
    +    def closeEvent(self, event):
    +        if not self.windowTitle().startswith(self.unsaved_tip): return
    +        filename = basename(self.__filename) if self.__filename else '新文件'
    +        messageBox = QMessageBox(
    +            parent=self, icon=QMessageBox.Warning, windowTitle='提示',
    +            text=f'是否要保存对 {filename} 的更改?', informativeText='如果不保存,你的更改将丢失。',
    +            standardButtons=QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
    +        )
    +        messageBox.setButtonText(QMessageBox.Save, '保存')
    +        messageBox.setButtonText(QMessageBox.Discard, '不保存')
    +        messageBox.setButtonText(QMessageBox.Cancel, '取消')
    +        reply = messageBox.exec()
    +        if reply == QMessageBox.Save:
    +            self.on_actFile_Save_triggered()
    +            event.accept()
    +        elif reply == QMessageBox.Discard:
    +            event.accept()
    +        else:
    +            event.ignore()
    +
    +    def dropEvent(self, event):
    +        self.__openFile(event.mimeData().text()[8:]) # [8:] is to get rid of 'file:///'
    +
    +mainform = AccountBookMainWindow()
    +mainform.show()
    +
    +sys.exit(app.exec())
    +
    +

    3. 总结

    +

    本项目到此结束。

    +

    【附:项目地址】

    + +

    记得点个Star哦~

    +
    +

    创作不易,若您喜欢这篇文章就请点个三连吧!万分感激!!!

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/python-def-functions/index.html b/post/python-def-functions/index.html new file mode 100644 index 00000000..5a1c70c5 --- /dev/null +++ b/post/python-def-functions/index.html @@ -0,0 +1,516 @@ + + + + + +Python函数之def定义函数 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Python函数之def定义函数 +

    + +
    +
    + 2020-04-21 · 3 min read +
    + + + + Python函数 + + + + + 语法 + + + + + Python + + +
    +

    链接

    +

    想研究Python函数?看这里
    +函数怎样取名?看这里
    +有参数的函数还可以怎么传参?看这里

    +

    一、无参数函数

    +

    结构

    +
    def <函数名>(): # 强制要求
    +	<函数体> # 可省略
    +	return <返回值> # 可省略
    +
    +

    程序举例

    +

    用函数的Hello world程序:

    +
    # prints 'Hello World\nDone'
    +# Author: GoodCoder666
    +def getHelloWorldString():
    +	return 'Hello World'
    +def print_hello_world():
    +	print(getHelloWorldString())
    +print_hello_world()
    +print('Done')
    +# 输出:
    +# Hello World
    +# Done
    +
    +

    程序流程

    +
    flowchat
    +st=>start: 开始,调用print_hello_world()
    +e=>end: 结束
    +get_str_call=>operation: print_hello_world()调用getHelloWorldString()
    +return_str=>operation: getHelloWorldString()返回 'Hello world'
    +print_hi=>inputoutput: 回到print_hello_world(),输出Hello world
    +done=>inputoutput: 回到主程序,输出Done
    +
    +st->get_str_call->return_str->print_hi->done->e
    +
    +

    二、有参数函数

    +

    补充知识

    +

    参数 (parameter):给函数的值,在函数中相当于变量:

    +
    def param_test(a, b):
    +	a, b = b, a
    +	print(a, b)
    +param_test(5, 6) # 输出:6 5
    +
    +

    以上程序等同于:

    +
    def param_test():
    +	a, b = 5, 6
    +	#-----以下部分相同-----#
    +	a, b = b, a
    +	print(a, b)
    +param_test() # 输出:6 5
    +
    +

    结构

    +
    def <函数名>(<参数列表>): # 强制要求
    +	<函数体> # 可省略
    +	return <返回值> # 可省略
    +
    +

    其中,参数列表中的参数用,隔开,例如a, bc(如果只有一个参数直接写)

    +

    程序举例

    +
    # prints 'Hi, {name}!'
    +# Author: GoodCoder666
    +def get_greet_str(name):
    +	return 'Hi, ' + name + '!'
    +
    +def greet(name):
    +	print(get_greet_str(name))
    +
    +greet(input("What's your name? "))
    +print('Done')
    +# 输入: GoodCoder666
    +# 输出
    +# Hi, GoodCoder666!
    +# Done
    +
    +

    程序流程

    +
    flowchat
    +st=>start: 开始,调用input("What's your name?")
    +e=>end: 结束
    +call_greet=>operation: input返回用户名,调用greet(<用户名>)
    +call_get_greet_str=>operation: greet调用get_greet_str(<用户名>)
    +print_hi=>inputoutput: 回到get_greet_str,输出get_greet_str的返回值
    +done=>inputoutput: 回到主程序,输出Done
    +
    +st->call_greet->call_get_greet_str->print_hi->done->e
    +
    +

    函数也是对象

    +

    一个函数也是一个对象。

    +

    证明

    +

    先定义两个函数:

    +
    def a(a, b):
    +	return a + b
    +def b():
    +	return a(1, 2)
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    项目是否支持/存在证明
    赋值Yc = a可执行;执行后c可被调用
    属性Y执行type(a),返回class <'function'>
    类型Y
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/python-functions-argpack/index.html b/post/python-functions-argpack/index.html new file mode 100644 index 00000000..f0e41914 --- /dev/null +++ b/post/python-functions-argpack/index.html @@ -0,0 +1,559 @@ + + + + + +Python函数之*[参数名]和**[参数名]的用处 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Python函数之*[参数名]和**[参数名]的用处 +

    + +
    +
    + 2020-03-03 · 5 min read +
    + + + + Python函数 + + + + + 语法 + + + + + Python + + +
    +

    一、*[参数名]

    +

    调用

    +

    合法调用

    +

    普通调用

    +

    *参数名一般写成*args, 如:

    +
    def func(*args):
    +	print(args)
    +
    +

    可以试着调用func

    +
    >>> func(1)
    +(1,)
    +>>> func()
    +()
    +>>> func(1, 2, 3)
    +(1, 2, 3)
    +>>> func(dict(), set(), str(), int())
    +({}, set(), '', 0)
    +
    +

    所以,我们发现,这样的函数可以传任意个参数(包括0),*会把参数打包成一个tuple,如(1,) () (1, 2, 3) ({}, set(), '', 0)

    +

    特殊调用

    +

    如果已经有一个tuple对象,想传进去作为args呢?
    +首先定义一个tuple对象:

    +
    >>> tuple_object = (1, 2, 3)
    +>>> print(tuple_object)
    +(1, 2, 3)
    +
    +
    错误方法
    +

    一般想到的都是这样的方法:

    +
    >>> func(tuple_object)
    +((1, 2, 3),)
    +
    +

    ((1, 2, 3),)? 不应该是(1, 2, 3)吗?
    +因为系统把它识别为一个args中的参数,所以args就是“tuple中有tuple”,不对。OH NO!

    +
    正确方法
    +

    tuple_object前面打个*,OK:

    +
    >>> func(*tuple_object)
    +(1, 2, 3)
    +
    +

    这就是“解包”。

    +

    非法调用

    +

    如果调用func(a=1, b=2)呢?请看:

    +
    >>> func(a=1, b=2)
    +
    +

    得到TypeError:

    +
    Traceback (most recent call last):
    +  File "<*args test file>", line 1, in <module>
    +    func(a=1, b=2)
    +TypeError: func() got an unexpected keyword argument 'a'
    +
    +

    错误中,keyword argument是什么?

    +
      +
    • keyword argument是像a=1 b=2 c='Hi'这样的传参形式。
    • +
    • 简单地说,keyword argument就是name=value形式的传参。
    • +
    +

    所以,应该用value形式的传参(英文是positional argument),而不应该使用name=value的传参。

    +

    默认参数

    +

    *[参数名]的参数不能有默认参数:
    +尝试设置默认参数失败图

    +

    如上图,尝试设置默认参数会报SyntaxError,如果真要设置默认参数,应该用一种类似“手动设置默认值”的办法:

    +
    # 手动设置*args的参数默认值
    +DEFAULT_VALUE = (1, 2, 3) # 默认值,可自行改变
    +def func(*args):
    +	if args == (): # 如果为空(用户没有传递参数):
    +		args = DEFAULT_VALUE # 设为默认值
    +	print(args)
    +
    +

    这样,就有默认值了:

    +
    >>> func() # 无参数调用
    +(1, 2, 3)
    +
    +

    总结

    +
      +
    • *[参数名]表示应使用value形式传参,参数个数不限,传入后会打包成tuple,供函数体使用。
    • +
    • 特殊传参方法:*[tuple object]
    • +
    • 这种方法不能设置默认值,只能用“手动设置默认值”。
    • +
    +
    +

    二、**[参数名]

    +

    调用

    +

    合法调用

    +

    普通调用

    +

    **参数名一般写成**kwargs, 如:

    +
    def func(**kwargs): # kwargs = keyword arguments
    +	print(kwargs)
    +
    +

    然后调用func,但是这个跟上一个相反,必须是name=value式传参 (这也是为什么它叫kwargs (keyword arguments)):

    +
    >>> func(a=1, b=2, c=3, d=4)
    +{'a': 1, 'b': 2, 'c': 3, 'd': 4}
    +>>> func(_tuple_obj=tuple(), _set_obj=set(), _dict_obj=dict())
    +{'_tuple_obj': (), '_set_obj': set(), '_dict_obj': {}}
    +>>> func()
    +{}
    +
    +

    这样的函数可以传任意个keyword argument(包括0),这里也与上一个相反,会把参数打包成一个dict,如{'a': 1, 'b': 2, 'c': 3, 'd': 4} {'_tuple_obj': (), '_set_obj': set(), '_dict_obj': {}} {}

    +

    特殊调用

    +

    如果已经有一个dict对象,想传进去作为kwargs呢?
    +首先定义一个这样的对象:

    +
    >>> dict_object = {'a': 666, 'b': 888}
    +>>> print(dict_object)
    +{'a': 666, 'b': 888}
    +
    +

    然后,跟上次相似:

    +
    >>> func(dict_object) # 因为不能传positional argument, 这下还报错了(马上会讲到):
    +Traceback (most recent call last):
    +  File "<**kwargs test program>", line 1, in <module>
    +    func(dict_object)
    +TypeError: func() takes 0 positional arguments but 1 was given
    +>>> func(**dict_object) # 正确方法
    +{'a': 666, 'b': 888}
    +
    +

    非法调用

    +

    如果传递positional argument呢?请看:

    +
    >>> func(1, 2)
    +
    +

    得到TypeError:

    +
    Traceback (most recent call last):
    +  File "<**kwargs test program>", line 1, in <module>
    +    func(1, 2)
    +TypeError: func() takes 0 positional arguments but 2 were given
    +
    +

    所以,这里应该用key=value形式的传参(英文是keyword argument),而不应该使用value的传参方法。

    +

    默认参数

    +

    *args的方法类似,应该用手动设置默认值”的方法:

    +
    # 手动设置**kwargs的参数默认值
    +DEFAULT_VALUE = {'a': 1, 'b': 2} # 默认值,可自行改变
    +def func(**kwargs):
    +	if kwargs == {}: # 如果为空(用户没有传递参数):
    +		kwargs = DEFAULT_VALUE # 设为默认值
    +	print(kwargs)
    +
    +

    这样,就有默认值了:

    +
    >>> func() # 无参数调用
    +{'a': 1, 'b': 2}
    +
    +

    总结

    +
      +
    • **[参数名]表示应使用key=value形式传参,参数个数不限,传入后会打包成dict
    • +
    • 特殊传参方法:**[dict object]
    • +
    • 这种方法不能设置默认值,也只能用“手动设置默认值”。
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/python-lambda-functions/index.html b/post/python-lambda-functions/index.html new file mode 100644 index 00000000..86fee4a9 --- /dev/null +++ b/post/python-lambda-functions/index.html @@ -0,0 +1,394 @@ + + + + + +Python函数之lambda函数 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Python函数之lambda函数 +

    + +
    +
    + 2020-04-21 · 1 min read +
    + + + + Python函数 + + + + + 语法 + + + + + Python + + +
    +

    温馨提示:如果读者没有学过def定义函数,请先看这里

    +

    定义形式

    +
    <函数名> = lambda <参数列表>: <返回值>
    +
    +

    等同于:

    +
    def <函数名>(<参数列表>):
    +	return <返回值>
    +
    +

    也可以定义为匿名函数(没有名字的函数):

    +
    lambda <参数列表>: <返回值>
    +
    +

    可以确认lambda函数对象的类型与def定义的一样,都是function
    +img

    +

    调用

    +

    如果是匿名函数,调用形式为:

    +
    (lambda <参数列表>: <返回值>)(<参数列表>)
    +
    +

    如果不是,调用形式为:

    +
    <函数名>(<参数列表>)
    +
    +

    计算a+ba+b的函数:
    +a+b_img

    +

    无返回值

    +

    lambda函数也可无返回值。
    +如:
    +img

    +

    无返回值的lambda函数一般用于做事,如print('Hello World')等。

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/python-naming-standards/index.html b/post/python-naming-standards/index.html new file mode 100644 index 00000000..6e96105d --- /dev/null +++ b/post/python-naming-standards/index.html @@ -0,0 +1,399 @@ + + + + + +【Python】对象(包括类、函数)取名方法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 【Python】对象(包括类、函数)取名方法 +

    + +
    +
    + 2020-04-20 · 1 min read +
    + + + + 语法 + + + + + Python + + +
    +

    先上干货,通用的:
    +字母:A-Z a-z
    +下划线:_
    +数字:0-9(注意:数字不能在开头)
    +理论上可以使用中文变量名,但强烈不建议使用。

    +

    合法名字举例

    +
    abcdef	GoodCoder	AD_fhrygfuigfr
    +A_a_007	__NAME123	_P_T_
    +_123456	Cc_Dd	_
    +
    +

    不合法名字举例

    +
    666Code	C++	1+1=2	(5)4
    +654ty54F	0.123	123456@qq.com
    +ccf-csp		atcoder&codeforces
    +
    +

    取名风格

    +

    首字母一般(类除外)小写。
    +由于对象名称中不能有空格,所以有两种风格:

    +
    helloWorldStr = 'Hello World'
    +hello_world_str = 'Hello World'
    +
    +
      +
    1. 取名为helloWorldStr,将每个单词(除第一个hello)首字母大写;
    2. +
    3. 取名为hello_world_str,将每两个单词之间加一个下划线(_)。
    4. +
    +

    特例:类

    +

    举个例子:

    +
    class AppleTree:
    +	def dropApple():
    +		print('Apple dropped to the ground.')
    +
    +

    AppleTree是将每个单词(第一个apple也不例外)首字母大写。

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/speed-up-github-access/index.html b/post/speed-up-github-access/index.html new file mode 100644 index 00000000..501b1a0d --- /dev/null +++ b/post/speed-up-github-access/index.html @@ -0,0 +1,638 @@ + + + + + +GitHub访问慢的原因以及解决办法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + GitHub访问慢的原因以及解决办法 +

    + +
    +
    + 2022-07-16 · 10 min read +
    + + + + GitHub + + +
    +

    注意:由于某些特殊原因,本文没有在CSDN上发布,因此这里是本文唯一可见的地址。

    +

    前言

    +

    相信大家工作时都难免会遇到。。。

    +GitHub 网页版无法访问 +
    $ git push
    +Error: Failed to connect to github.com port 443: Timed out
    +
    +$ git push
    +Error: OpenSSL SSL_read: Connection was reset, errno 10054
    +
    +$ 滚
    +滚: command not found
    +
    +$ sudo rm -rf /*
    +
    +

    原因分析

    +

    先上ipaddress查一下GitHub的IP地址(有时会403),如图所示:
    +GitHub 第一次查询结果

    +

    过一会再查一下:
    +GitHub 第二次查询结果

    +

    !!!两次结果不一样!!!

    +

    后来发现,GitHub的服务器IP变化极其频繁,平均每半小时变一次,最快时3~5分钟就能变一次。我们知道,系统中有个叫DNS 解析缓存的东西,会存下来我们DNS的解析结果(也就是最近访问的网站的服务器IP),因此需要想办法重新获得正确的IP!!!

    +

    下面提供三种方法,可供参考,希望对大家有帮助。

    +

    解决方法

    +

    1. 刷新DNS解析缓存

    +

    注意:此方法仅适用于Windows系统。
    +可以配合后面的修改DNS方法,效果更佳。

    +

    1.1 手动刷新

    +

    GitHub访问不了的时候,按下Win+R,执行:

    +
    ipconfig /flushdns
    +
    +

    这就是大名鼎鼎的「Windows DNS缓存刷新命令」。
    +若看到下列输出,则算成功:

    +
    Windows IP 配置
    +
    +已成功刷新 DNS 解析缓存。
    +
    +

    这时,重新打开GitHub或使用git远程操作,就大概率能成功了。
    +这样有些麻烦,因为每次都必须得执行命令解决问题,下面有“进阶版”——自动执行:

    +

    1.2 自动刷新

    +

    这种方法与上面的“手动刷新”原理相同,但无需每次手动输入命令,方便很多:
    +打开notepad,输入:

    +
    @echo off
    +:a
    +ipconfig /flushdns > NUL
    +echo [INFO %time:~0,8%] 已成功刷新 DNS 解析缓存。
    +echo 1分钟将再次刷新。按下任意键以立即刷新...
    +timeout /t 60 > NUL
    +echo.
    +goto a
    +
    +

    Ctrl+Shift+S另存为,选择一个位置,保存为.bat后缀名的批处理文件(选择“所有文件”再自己输入后缀名),注意编码使用ANSI,否则会乱码!

    +

    下面直接双击刚才保存好的文件打开,会看到这样的输出:

    +
    [INFO HH:MM:SS] 已成功刷新 DNS 解析缓存。
    +1分钟将再次刷新。按下任意键以立即刷新...
    +
    +

    这时,可将窗口最小化,程序会每分钟自动刷新一次,如果想提前刷新可以在里面按下任意键,会自动再刷新。

    +

    如果想更改刷新频率,可以在bat代码中修改:

    +
    @echo off
    +:a
    +ipconfig /flushdns > NUL
    +echo [INFO %time:~0,8%] 已成功刷新 DNS 解析缓存。
    +echo 1分钟将再次刷新。按下任意键以立即刷新...
    +timeout /t [freq (s), "60"=1min] > NUL
    +echo.
    +goto a
    +
    +

    2. 使用GitHub520项目

    +

    GitHub520 项目地址:https://github.com/521xueweihan/GitHub520
    +官网:https://swh.app/(有时会打不开)
    +镜像地址(非官方,自己弄的):https://gitee.com/GoodCoder666/GitHub520

    +

    这个项目的工作原理是,通过程序自动从ipaddress实时获取GitHub服务器的IP,并修改对应HOSTS,达到代替默认DNS进行IP解析的作用。

    +

    参考文档:GitHub520 README
    +镜像地址:https://gitee.com/goodcoder666/GitHub520/blob/main/README.md

    +

    2.1 基础方法

    +

    打开https://raw.hellogithub.com/hosts,复制内容,添加到系统HOSTS文件的最后边。刷新一下DNS或重启电脑,启用新的IP解析。如果访问不了需要再次更新。

    +

    2.2 SwitchHosts

    +

    上述的方法明显太麻烦了,那有没有方法让电脑自动刷新呢?答案是肯定的。
    +使用「SwitchHosts」,就能实现自动刷新。

    +

    使用步骤:

    +
      +
    1. +

      Release页面下载安装,并打开软件,应该能看到类似于下面的界面(不同操作系统下文件内容略有不同):
      +SwitchHosts 主界面

      +
    2. +
    3. +

      点击左上角的“+”号,弹出如下界面:
      +SwitchHosts 添加界面

      +
    4. +
    5. +

      选择“远程”,输入:
      +标题:GitHub520(随意)
      +URL:https://raw.hellogithub.com/hosts
      +自动刷新:任意,尽量选择5分钟或15分钟
      +SwitchHosts 添加示意图

      +
    6. +
    7. +

      点击“确定”,完成。

      +
    8. +
    +Tip +

    Tip:如果遇到这种情况,请提升 SwitchHosts 进程权限(Windows下的管理员身份运行等)

    +

    2.3 One-liner(适用于类Unix系统)

    +

    sed -i "/# GitHub520 Host Start/Q" /etc/hosts && curl https://raw.hellogithub.com/hosts >> /etc/hosts
    +自动更新/etc/hosts文件,可以添加到cron定时执行。使用前确保Github520内容在该文件最后部分。

    +

    2.4 AdGuard Home 用户

    +

    过滤器>DNS 封锁清单>添加阻止列表>添加一个自定义列表,配置如下:

    +
      +
    • +

      名称: 随意

      +
    • +
    • +

      URL: https://raw.hellogithub.com/hosts(和上面 SwitchHosts 使用的一样)

      +
    • +
    +

    如图:

    +AdGuardHome-01 +

    更新间隔在 设置>常规设置>过滤器更新间隔(设置一小时一次即可),记得勾选上 使用过滤器和 Hosts 文件以拦截指定域名

    +AdGuardHome-02 +

    Tip:不要添加在 DNS 允许清单 内,只能添加在 DNS 封锁清单 才管用。另外,AdGuard for Mac、AdGuard for Windows、AdGuard for Android、AdGuard for IOS 等等 AdGuard 家族软件 添加方法均类似。

    +

    2.5 FasterHosts

    +

    FasterHosts 是个 Chrome 插件,主要原理是拦截浏览器的部分请求,将 domain 替换成访问速度较快的那个。HOSTS 资源来自 GitHub520,每 1 小时更新一次。

    +
    +
      +
    1. 下载 FasterHosts 然后解压,找到 extension 子目录
    2. +
    3. 打开 Chrome,输入: chrome://extensions/
    4. +
    5. 打开「开发者模式」
    6. +
    7. 选择「加载已解压的扩展程序」,然后定位到刚才解压的文件夹里面的 extension 目录,确定
    8. +
    9. 安装好了,可关闭「开发者模式」
    10. +
    +
    +

    Tip: Chromium 内核的浏览器都可以使用,其他主流的 Chromium 浏览器还有Edge,Yandex等。

    +

    3. 使用Gitee镜像规避问题

    +

    Gitee相当于“中国版GitHub”,相对来说访问速度和稳定性都会好很多。
    +那么使用Gitee官方提供的镜像功能,可以暂时规避网络上的问题。

    +

    注意事项:
    +(1) 前三种方法只能解决无法访问的问题,但是下载速度太慢时也可以使用本法。
    +(2) 本方法仅针对代码仓库的访问问题,无法访问GitHub主页。

    +

    3.1 克隆非自己的存储库

    +

    我们以Pygame的GitHub仓库(https://github.com/pygame/pygame)为例:

    +
      +
    1. +

      打开存储库,复制Git地址(只能选HTTPS)。如果打不开也没事,直接在GitHub的repo地址后面加上.git就行了。
      +复制Git地址

      +
    2. +
    3. +

      打开Gitee,选择从GitHub/GitLab导入仓库,填写信息:
      +Gitee 导入仓库

      +
    4. +
    5. +

      点击“导入”,等待自动跳转:
      +等待处理

      +
    6. +
    +加载完成 +

    3.2 创建push/pull镜像

    +

    这种方法主要针对自己拥有/管理的代码库网络访问不稳定的情况。原理就是创建Personal Access Token(PAT)并交给Gitee,push镜像会将Gitee上的修改自动同步到GitHub上,而pull镜像则相反,会自动检测GitHub上的修改并同步至Gitee。

    +

    下面我们来分别介绍两种镜像的使用方式。

    +
    3.2.1 使用前:创建 GitHub 上的 Personal Access Token (PAT)
    +
      +
    1. +

      打开Personal Access Tokens,选择“Generate new token”,如图:
      +创建PAT Token

      +
    2. +
    3. +

      输入密码,转到“New Token”界面,填写信息,其中Note随意填写,Expiration为期限,建议选择60天,后面的权限建议勾选repo、workflow(仅push镜像)、repo_hook(仅pull镜像)。Token 生成

      +
    4. +
    5. +

      点击下面的“Generate token”,生成令牌,点击复制:
      +new token

      +
    6. +
    7. +

      完成!请看下面的“镜像配置”部分。

      +
    8. +
    +
    3.2.2 Push镜像配置
    +

    Gitee提供的镜像既可以用私有GitHub存储库,也可以配置公开的。为了方便演示,我们以私有的为例。

    +

    现在我在GitHub上创建了一个仓库GoodCoder666/test-mirror(私有),如下:
    +test-mirror代码库

    +

    然后使用3.1中的的方法导入,效果如下:
    +test-mirror镜像

    +

    仓库就绪,下面创建镜像。

    +
      +
    1. +

      选择管理\to仓库镜像管理\to添加镜像,如图(需绑定对应GitHub账号):
      +添加镜像

      +
    2. +
    3. +

      选择镜像方向Push和GitHub仓库,再输入刚刚生成好的Token,如图:
      +镜像信息选择

      +
    4. +
    5. +

      点击“添加”,效果图:
      +镜像效果

      +
    6. +
    +

    此时,在Gitee上作出更改,会自动实时同步到GitHub上(可能有1~2分钟的延迟)
    +比如现在修改了Gitee这边:
    +Gitee 修改

    +

    然后看GitHub:
    +GitHub 同步

    +

    注意这里的gitee-org,只有在Gitee网页版更改时会出现(我也不知道为啥),git push时则正常。

    +
    3.3.3 Pull镜像配置
    +

    与Push镜像相似,不同之处为Push是Gitee->GitHub,而Pull实为GitHub->Gitee的镜像。镜像配置请参考3.3.2 Push镜像配置,注意Token需勾选admin:repo_hook

    +

    4. 更换DNS解析服务器

    +

    根据自己的网络情况,选择下表中的一种推荐的首选/备选DNS服务器地址,按照这里的方法修改DNS(此方法适用于Windows,其他操作系统请自行百度)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DNS组合首选DNS备选DNS备注
    CNNIC+1141.2.4.8114.114.114.114强烈推荐/成功率最高/响应最快
    Google+1148.8.8.8114.114.114.114成功率较高/响应较快/主流搭配
    纯114DNS114.114.114.114114.114.115.115成功率较高/响应很快
    114+Cloudflare114.114.114.1141.1.1.1成功率较高/1.1.1.1响应稍慢
    +

    总结

    +

    GitHub访问慢的主要原因是由于DNS的问题导致的(也有部分CDN问题没有提及),刚才的三种方法分别是:

    +
      +
    • DNS刷新
    • +
    • GitHub520
    • +
    • Gitee镜像
    • +
    • 更换DNS解析服务器
    • +
    +

    需要注意的是,没有方法能保证100%100\%成功(Gitee镜像除外,但功能有限),然而成功率最高的是修改DNS,基本上可以说是一劳永逸

    +

    希望以上内容能对大家有帮助!

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/spyderfix/index.html b/post/spyderfix/index.html new file mode 100644 index 00000000..eec51444 --- /dev/null +++ b/post/spyderfix/index.html @@ -0,0 +1,371 @@ + + + + + +Anaconda Spyder点击无响应解决 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + Anaconda Spyder点击无响应解决 +

    + + +

    问题分析

    +

    可能是升级或卸载了spyder依赖的包,导致spyder无法正常运行。
    +我升级了PyQt5spyder要求PyQt5<5.13,而安装的最新版本为5.15,导致spyder启动时出现问题。

    +

    解决方法

    +

    打开Anaconda Prompt,执行:

    +
    pip install spyder
    +
    +

    解释:
    +pip会自动根据要安装的包(spyder也是一个包)安装依赖的包,如spyder要求PyQt5<5.13,安装PyQt5 5.15pip会自动识别,并安装PyQt5 5.12.3(低于5.13的最高版本)。

    +

    20210926 EDIT:
    +如出现“拒绝访问”一类的错误,加上--user选项即可。

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/tkinter-text-undo-redo/index.html b/post/tkinter-text-undo-redo/index.html new file mode 100644 index 00000000..7df368e0 --- /dev/null +++ b/post/tkinter-text-undo-redo/index.html @@ -0,0 +1,378 @@ + + + + + +tkinter Text edit_undo()/edit_redo() 没反应解决方法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + tkinter Text edit_undo()/edit_redo() 没反应解决方法 +

    + +
    +
    + 2020-03-24 · 1 min read +
    + + + + Bug/错误解决 + + + + + Python + + +
    +

    问题

    +

    tkinter.Text调用edit_undo()edit_redo()没反应。

    +

    问题分析

    +

    这是因为没有设置Textundo参数为True,设置后才能“激活”edit_undo()edit_redo()
    +这个错误难发现是因为它没有报错,查了好多资料才发现……
    +希望以后python官方能改进这点。

    +

    解决方法

    +
    from tkinter import *
    +
    +root = Tk()
    +root.title('Undo/redo test')
    +text = Text(root, undo=True)
    +#                 ^^^^^^^^^
    +#                   重要!
    +text.insert(END, 'Hello tkinter!')
    +text.edit_undo()
    +text.edit_redo()
    +
    +root.mainloop()
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-cloud-enable/index.html b/post/wmp-cloud-enable/index.html new file mode 100644 index 00000000..99962485 --- /dev/null +++ b/post/wmp-cloud-enable/index.html @@ -0,0 +1,396 @@ + + + + + +之前的小程序没有使用云开发,现在需要使用云函数怎么办呢? - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 之前的小程序没有使用云开发,现在需要使用云函数怎么办呢? +

    + +
    +
    + 2020-02-03 · 1 min read +
    + + + + 微信小程序 + + +
    +

    前提条件:基础库版本需为2.3.3以上,建议设为最新版本
    +如果是升级自己的项目到云开发,需要做以下修改:

    +
      +
    • +

      点击云开发按钮,按钮位置如下:
      +

      +
    • +
    • +

      开通小程序·云开发

      +
    • +
    • +

      将原来的代码放到 miniprogram 目录

      +
    • +
    • +

      新增 cloudfunctions 目录

      +
    • +
    • +

      app.json 新增配置 "cloud": true

      +
    • +
    • +

      project.config.json 配置 "miniprogramRoot":"miniprogram/""cloudfunctionRoot":"cloudfunctions/"

      +
    • +
    +

    原网址

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-cloud-errcode-401003/index.html b/post/wmp-cloud-errcode-401003/index.html new file mode 100644 index 00000000..8f9953c1 --- /dev/null +++ b/post/wmp-cloud-errcode-401003/index.html @@ -0,0 +1,390 @@ + + + + + +使用微信小程序-云开发时报错: Error: errCode: -401003 api parameter type error | errMsg: parameter.data should ... - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 使用微信小程序-云开发时报错: Error: errCode: -401003 api parameter type error | errMsg: parameter.data should ... +

    + +
    +
    + 2020-02-02 · 1 min read +
    + + + + 微信小程序 + + + + + Bug/错误解决 + + +
    +

    错误

    +
    Uncaught (in promise) thirdScriptError
    +errCode: -401003 api parameter type error | errMsg: parameter.data should be object instead of undefined;
    +Error: errCode: -401003 api parameter type error | errMsg: parameter.data should be object instead of undefined;
    +at new u (...)
    +...
    +
    +

    错误原因

    +

    错误写法

    +
    wx.cloud.init({
    +  env: '我的云ID',
    +  traceUser: true
    +})
    +
    +const db = wx.cloud.database()
    +const people = db.collection('people')
    +
    +people.add({ // <- 报错
    +    'name': 'OnePerson',
    +    'score': 15
    +})
    +
    +

    正确写法

    +
    wx.cloud.init({
    +  env: '我的云ID',
    +  traceUser: true
    +})
    +
    +const db = wx.cloud.database()
    +const people = db.collection('people')
    +
    +people.add({
    +	data: { // 必须加上data!
    +		'name': 'OnePerson',
    +		'score': 15
    +	}
    +})
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-cloud-getopenid/index.html b/post/wmp-cloud-getopenid/index.html new file mode 100644 index 00000000..17ff187c --- /dev/null +++ b/post/wmp-cloud-getopenid/index.html @@ -0,0 +1,425 @@ + + + + + +使用云函数获取小程序用户openId - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 使用云函数获取小程序用户openId +

    + +
    +
    + 2020-02-03 · 1 min read +
    + + + + 微信小程序 + + +
    +

    如何使用云函数获取小程序用户openId?步骤如下:

    +
      +
    • +

      如未开通云开发,请看这篇

      +
    • +
    • +

      基础库版本需为2.3.3以上,建议设为最新版本

      +
    • +
    • +

      新建云函数:
      +

      +
    • +
    • +

      右击cloudfunctions,选择新建Node.js云函数

      +
    • +
    • +

      输入login

      +
        +
      • 现在云开发控制台的样子:
        +
      • +
      +
    • +
    • +

      此函数会保存openID至本地存储,并在出错时调用error

      +
    • +
    +
    function saveOpenID(error) {
    +  if (!wx.getStorageSync('openID')) {
    +    wx.cloud.callFunction({
    +      name: 'login',
    +      data: {},
    +      success: res => {
    +        console.log('Got user openid: ', res.result.openid)
    +        wx.setStorageSync('openID', res.result.openid)
    +      },
    +      fail: err => {
    +        console.error(err)
    +        error()
    +      }
    +    })
    +  }
    +}
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-cloud-invalidkey-openid/index.html b/post/wmp-cloud-invalidkey-openid/index.html new file mode 100644 index 00000000..07266549 --- /dev/null +++ b/post/wmp-cloud-invalidkey-openid/index.html @@ -0,0 +1,388 @@ + + + + + +微信小程序-云开发-数据库 报错:-501007 invalid parameters | errMsg: Invalid Key Name: _openid - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 微信小程序-云开发-数据库 报错:-501007 invalid parameters | errMsg: Invalid Key Name: _openid +

    + +
    +
    + 2020-02-03 · 1 min read +
    + + + + 微信小程序 + + + + + Bug/错误解决 + + +
    +

    微信小程序-云开发-数据库 报错:

    +
    -501007 invalid parameters | errMsg: Invalid Key Name: _openid
    +
    +

    原因:

    +

    不能设置_openid,它是云服务器根据用户的openID自动设置的

    +

    解决:

    +

    不要设置openID

    +

    错误代码

    +
    wx.cloud.database().collection('people').add({
    +  data: {
    +    '_openid': openID,
    +    'name': nickName,
    +    'avatarUrl': avatarUrl,
    +    'score': score
    +  }
    +})
    +
    +

    正确代码

    +
    wx.cloud.database().collection('people').add({
    +  data: {
    +    'name': nickName,
    +    'avatarUrl': avatarUrl,
    +    'score': score
    +  }
    +})
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-cloud-orderby/index.html b/post/wmp-cloud-orderby/index.html new file mode 100644 index 00000000..11c13390 --- /dev/null +++ b/post/wmp-cloud-orderby/index.html @@ -0,0 +1,370 @@ + + + + + +微信小程序 云数据库 Collection/Query .orderBy 用法 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 微信小程序 云数据库 Collection/Query .orderBy 用法 +

    + +
    +
    + 2020-02-04 · 2 min read +
    + + + + 微信小程序 + + +
    +

    Collection.orderBy / Query.orderBy

    +

    指定查询排序条件

    +

    方法签名如下:

    +
    function orderBy(fieldName: string, order: string): Collection | Query
    +
    +

    方法接受一个必填字符串参数fieldName用于定义需要排序的字段,一个字符串参数order定义排序顺序。order只能取ascdesc

    +

    如果需要对嵌套字段排序,需要用 "点表示法" 连接嵌套字段,比如style.color表示字段style里的嵌套字段color

    +

    同时也支持按多个字段排序,多次调用orderBy即可,多字段排序时的顺序会按照orderBy调用顺序先后对多个字段排序

    +

    示例代码:

    +
      +
    • 一个字段排序:按进度排升序取待办事项
    • +
    +
    const db = wx.cloud.database()
    +db.collection('todos').orderBy('progress', 'asc')
    +  .get()
    +  .then(console.log)
    +  .catch(console.error)
    +
    +
      +
    • 多个字段排序:
      +先按progress排降序(progress越大越靠前)、再按description排升序(字母序越前越靠前)取待办事项:
    • +
    +
    const db = wx.cloud.database()
    +db.collection('todos')
    +  .orderBy('progress', 'desc')
    +  .orderBy('description', 'asc')
    +  .get()
    +  .then(console.log)
    +  .catch(console.error)
    +
    +

    原文:微信官方文档 · 小程序 -> 云开发 -> 数据库 -> Collection.orderBy / Query.orderBy

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-component-not-found/index.html b/post/wmp-component-not-found/index.html new file mode 100644 index 00000000..0aac47c9 --- /dev/null +++ b/post/wmp-component-not-found/index.html @@ -0,0 +1,380 @@ + + + + + +微信小程序报错:Component is not found in path "components/comp/comp.js" - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 微信小程序报错:Component is not found in path "components/comp/comp.js" +

    + +
    +
    + 2020-02-05 · 1 min read +
    + + + + 微信小程序 + + + + + Bug/错误解决 + + +
    +

    完整错误

    +
    jsEnginScriptError:
    +Component is not found in path "components/comp/comp.js" (using by pages/index/index); onAppRoute
    +Error: Component is not found in path "components/comp/comp.js" (using by pages/index/index)
    +	in e(...)
    +	...
    +
    +

    错误代码(json)

    +
    {
    +  "backgroundTextStyle": "light",
    +  "navigationBarBackgroundColor": "#fff",
    +  "navigationBarTitleText": "WeApp",
    +  "navigationBarTextStyle": "black",
    +  "usingComponents": {
    +    "MyComp": "../../components/comp/comp.js"
    +  }
    +}
    +
    +

    解决

    +

    去掉.js, 改为../../components/comp/comp

    +
    {
    +  "backgroundTextStyle": "light",
    +  "navigationBarBackgroundColor": "#fff",
    +  "navigationBarTitleText": "WeApp",
    +  "navigationBarTextStyle": "black",
    +  "usingComponents": {
    +    "MyComp": "../../components/comp/comp"
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-diy-nkeyboard/index.html b/post/wmp-diy-nkeyboard/index.html new file mode 100644 index 00000000..1af3332a --- /dev/null +++ b/post/wmp-diy-nkeyboard/index.html @@ -0,0 +1,465 @@ + + + + + +在微信小程序中做自己的数字键盘 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 在微信小程序中做自己的数字键盘 +

    + +
    +
    + 2020-01-31 · 4 min read +
    + + + + 微信小程序 + + +
    +

    为什么要自制键盘?

    +

    我最近在开发一款微信小程序,现在需要用户输入一个数字。

    +

    使用系统键盘带来的不便

    +

    如果使用系统键盘,有以下几个问题:

    +
      +
    • 数字键太小,不方便;
    • +
    • 无法阻止用户输入不合法字符(如:“&”);
    • +
    • 小数点在一些手机上很难找到;
    • +
    • 用户需要点击输入框;
    • +
    • 无法控制按钮样式。
    • +
    +

    理想的自制键盘效果

    +

    123
    +456
    +789
    +.0提交
    +退格清空

    +

    怎样自制键盘?

    +

    每一行按钮捆绑成一个view:
    +WXML

    +
    <!--pages/a/a.wxml-->
    +<!--输入键盘-->
    +<!--五行,每行一个view-->
    +<view class='keyboard-row'>
    +  <button type='default' plain='true' class='one' data-key='1'  bindtap='tapKey'>1</button>
    +  <button type='default' plain='true' class='two' data-key='2' bindtap='tapKey'>2</button>
    +  <button type='default' plain='true' class='three' data-key='3' bindtap='tapKey'>3</button>
    +</view>
    +<view class='keyboard-row'>
    +  <button type='default' plain='true' class='four' data-key='4' bindtap='tapKey'>4</button>
    +  <button type='default' plain='true' class='five' data-key='5' bindtap='tapKey'>5</button>
    +  <button type='default' plain='true' class='six' data-key='6' bindtap='tapKey'>6</button>
    +</view>
    +<view class='keyboard-row'>
    +  <button type='default' plain='true' class='seven' data-key='7' bindtap='tapKey'>7</button>
    +  <button type='default' plain='true' class='eight' data-key='8' bindtap='tapKey'>8</button>
    +  <button type='default' plain='true' class='nine' data-key='9' bindtap='tapKey'>9</button>
    +</view>
    +<view class='keyboard-row'>
    +  <button type='default' plain='true' class='dot' data-key='.' bindtap='tapKey'>.</button>
    +  <button type='default' plain='true' class='zero' data-key='0' bindtap='tapKey'>0</button>
    +  <button type='default' plain='true' class='submit' bindtap='tapSubmit'>提交</button>
    +</view>
    +<!--clear&delete-->
    +<view class='keyboard-row'>
    +  <button type='default' plain='true' class='del'  bindtap='tapDel'>退格</button>
    +  <button type='default' plain='true' class='clear' bindtap='tapClear'>清除</button>
    +</view>
    +
    +

    WXSS

    +
    /*pages/a/a.wxss*/
    +.keyboard-row {
    +  width: 100%;
    +  height: 35%;
    +  border-radius: 98rpx;
    +  display: flex;
    +  flex-direction: row;
    +  align-items: center;
    +  justify-content: center;
    +}
    +
    +

    JS

    +
    // pages/a/a.js
    +Page({
    +  data: {
    +    num: 0,
    +    hasDot: false // 防止用户多次输入小数点
    +  },
    +  tapKey: function(evt) {
    +    var x = evt.currentTarget.dataset.key
    +    if(x == '.') {
    +      if(this.data.hasDot) return
    +      this.setData({
    +        hasDot: true
    +      })
    +    }
    +    this.setData({
    +      num: this.data.num == '0'? x: this.data.num + x
    +    })
    +  },
    +  tapSubmit: function() {
    +    // 用户已提交
    +    console.log('res =', this.data.num)
    +  },
    +  tapDel: function() {
    +    if(this.data.num == '0') return
    +    if(this.data.num[this.data.num.length - 1] == '.') this.setData({
    +      hasDot: false
    +    })
    +    this.setData({
    +      num: this.data.num.length == 1? '0': this.data.num.substring(0, this.data.num.length - 1)
    +    })
    +  },
    +  tapClear: function() {
    +    this.setData({
    +      num: '0',
    +      hasDot: false
    +    })
    +  }
    +})
    +
    +

    键盘的效果

    +键盘效果图 +

    CSDN:https://blog.csdn.net/write_1m_lines/article/details/104121630

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wmp-enable-onpulldownrefresh/index.html b/post/wmp-enable-onpulldownrefresh/index.html new file mode 100644 index 00000000..9fe7cdcb --- /dev/null +++ b/post/wmp-enable-onpulldownrefresh/index.html @@ -0,0 +1,374 @@ + + + + + +为什么微信小程序设置的onPullDownRefresh无效 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + 为什么微信小程序设置的onPullDownRefresh无效 +

    + +
    +
    + 2020-02-04 · 1 min read +
    + + + + 微信小程序 + + + + + Bug/错误解决 + + +
    +

    因为仅有onPullDownRefresh是不行的,需要配置:

    +
      +
    • 如果是单个页面需要onPullDownRefresh,在对应页面的json文件中设置"enablePullDownRefresh": true,如:
    • +
    +
    {
    +  "backgroundTextStyle": "light",
    +  "navigationBarBackgroundColor": "#fff",
    +  "navigationBarTitleText": "演示页面",
    +  "navigationBarTextStyle": "black",
    +  "enablePullDownRefresh": true
    +}
    +
    +
      +
    • 如果每个页面都需要onPullDownRefresh,可以给每个页面都设置"enablePullDownRefresh": true,也可以在app.json中设置:
    • +
    +
    {
    +	...
    +	window: {
    +		"enablePullDownRefresh": true
    +	}
    +}
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/post/wx-showtoast-problem/index.html b/post/wx-showtoast-problem/index.html new file mode 100644 index 00000000..4ee73339 --- /dev/null +++ b/post/wx-showtoast-problem/index.html @@ -0,0 +1,394 @@ + + + + + +wx.showToast中的一个问题 - + GoodCoder666的个人博客 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GoodCoder666的个人博客 + +
    +
    +

    + wx.showToast中的一个问题 +

    + +
    +
    + 2020-02-02 · 1 min read +
    + + + + 微信小程序 + + + + + Bug/错误解决 + + +
    +

    wx.showToast中的一个问题

    +
    wx.showToast({
    +	title: '成功',
    +	icon: 'fail',
    +	duration: 2000,
    +	success: func
    +})
    +
    +
    wx.showToast({
    +	title: '成功',
    +	icon: 'fail',
    +	duration: 2000,
    +	success: res => {
    +		func()
    +	}
    +})
    +
    +

    使用以上两种语句都会“马上”执行func, WHY?

    +

    因为只要成功弹出了窗口就会调用success, 所以如果要在duration毫秒后执行func, 代码如下:

    +
    wx.showToast({
    +	title: '成功',
    +	icon: 'fail',
    +	duration: 2000,
    +})
    +setTimeout(func, 2000)
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    + + +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/main.css b/styles/main.css new file mode 100644 index 00000000..6b4648db --- /dev/null +++ b/styles/main.css @@ -0,0 +1,163 @@ +body { + color: #333; + background-color: #faf9f7; +} +@font-face { + font-family: '霞骛文楷'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff2/Light.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff/Light.woff') format('woff'); + font-weight: lighter; + font-style: normal; +} +@font-face { + font-family: '霞骛文楷'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff2/Regular.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff/Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: '霞骛文楷'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff2/Bold.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/LXGWWenKaiLite/woff/Bold.woff') format('woff'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'Fira Code'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff2/Light.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff/Light.woff') format('woff'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Fira Code'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff2/Regular.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff/Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Fira Code'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff2/Medium.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff/Medium.woff') format('woff'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Fira Code'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff2/SemiBold.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff/SemiBold.woff') format('woff'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Fira Code'; + src: url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff2/Bold.woff2') format('woff2'), url('https://jsd.onmicrosoft.cn/gh/Waoap/waoap.github.io@main/fonts/FiraCode/woff/Bold.woff') format('woff'); + font-weight: 700; + font-style: normal; +} +a:not([class]) { + border-bottom-style: solid; + border-bottom-width: 0.2rem; + color: #0f61ff; + text-decoration: none; + transition: all 0.3s ease 0s; + border-color: rgba(15, 97, 255, 0.1); +} +a:not([class]):hover { + border-color: rgba(15, 97, 255, 0.5); +} +@media (prefers-color-scheme: dark) { + a:not([class]) { + color: #81a5f8; + } +} +@media (prefers-color-scheme: dark) { + body { + background: #333; + color: #999; + } +} +.yellow-btn { + box-shadow: rgba(255, 214, 2, 0.6) 0px 6px 12px 0px; +} +.yellow-btn:hover { + box-shadow: rgba(255, 214, 2, 0.6) 0px 2px 4px 0px; +} +@media (prefers-color-scheme: dark) { + .yellow-btn { + box-shadow: none; + } +} +.wechat img { + display: none; +} +.wechat:hover img { + display: inline-block; +} +.s3-round { + border-radius: 100px; +} +.s3-hover:hover { + -webkit-transition: all 0.5s ease-out; + -moz-transition: all 0.5s ease-out; + -o-transition: all 0.5s ease-out; + transition: all 0.5s ease-out; + animation: s3-rotate 5s infinite linear, s3-opacity 5s infinite; +} +.s3-transition { + -webkit-transition: all 0.5s ease-out; + -moz-transition: all 0.5s ease-out; + -o-transition: all 0.5s ease-out; + transition: all 0.5s ease-out; +} +@keyframes s3-rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +@keyframes s3-opacity { + 0% { + opacity: 1; + } + 25% { + opacity: 0.2; + } + 50% { + opacity: 0.5; + } + 75% { + opacity: 0.7; + } + 100% { + opacity: 0.1; + } +} +.s3-dotted { + border-radius: 100px; +} +.s3-dotted:hover { + -webkit-transition: all 0.5s ease-out; + -moz-transition: all 0.5s ease-out; + -o-transition: all 0.5s ease-out; + transition: all 0.5s ease-out; + animation: s3-rotate 5s infinite linear, s3-opacity 5s infinite; +} +.s3-dashed { + border-radius: 100px; +} +.s3-dashed:hover { + -webkit-transition: all 0.5s ease-out; + -moz-transition: all 0.5s ease-out; + -o-transition: all 0.5s ease-out; + transition: all 0.5s ease-out; + animation: s3-rotate 5s infinite linear, s3-opacity 5s infinite; +} + + body { + font-family: "霞骛文楷"; + } + + @supports (font-variation-settings: normal) { + body { + font-family: "霞骛文楷"; + } + } + \ No newline at end of file diff --git a/tag/2048plus/index.html b/tag/2048plus/index.html new file mode 100644 index 00000000..3721fc4a --- /dev/null +++ b/tag/2048plus/index.html @@ -0,0 +1,130 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 2048 Plus +

    +
    + +
    + +
    +

    + + 《2048 - Plus》益智小游戏隐私策略声明 + +

    +
    2022-02-10
    +
    + 《2048 - Plus》是一款益智小游戏。它的设计思想源自经典的数字小游戏2048。本隐私策略声明函盖了用户对于该应用程序中所有内容的使用。 + + +免责声明 +您在使用本应用过程中,请遵守《中华人民共和国宪法》、《中华人民共和国网络安全法》、... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/AccountBook/index.html b/tag/AccountBook/index.html new file mode 100644 index 00000000..d81beb21 --- /dev/null +++ b/tag/AccountBook/index.html @@ -0,0 +1,129 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 账本 +

    +
    + +
    + +
    +

    + + README - 账本 + +

    +
    2022-06-28
    +
    + https://github.com/GoodCoder666/AccountBook/blob/main/README.md + +AccountBook +*For English-speaking users: This project ... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/algonotes/index.html b/tag/algonotes/index.html new file mode 100644 index 00000000..ba24eea8 --- /dev/null +++ b/tag/algonotes/index.html @@ -0,0 +1,331 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法笔记 +

    +
    + +
    + +
    +

    + + 【算法笔记】最近公共祖先(LCA)问题求解——倍增算法 + +

    +
    2023-01-06
    +
    + 0. 前言 +最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 +这种算法应用很广泛,可以很容易解决树上最短路等问题。 +为了方便,我们记某点集 S={... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树 + +

    +
    2023-01-05
    +
    + 0. 前言 +好久没更算法笔记专栏了,正好学了新算法来更新…… +这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! +1. 关于 RMQ 问题 +RMQ 的全称是 Range Minimum/Maximum... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】位运算详解 + +

    +
    2022-10-18
    +
    + 0. 前言 +突然想到位运算是个好东西,就来水一波文章了…… +注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! +本文中参考代码均使用C++编写。 +废话不多说,... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree + +

    +
    2022-08-20
    +
    + 前言 +树状数组,即树形存储的数组,又称Binary Indexed Tree或Fenwick Tree。 +抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「 树」没什么关系: + +有一个序列A=(A1,A2,…,AN)A=(A_1,A_... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】三种背包问题——背包 DP + +

    +
    2022-08-18
    +
    + 前言 +背包(Knapsack)问题是经典的动态规划问题,也很有实际价值。 +01背包 + +洛谷 P2871 [USACO07DEC] Charm Bracelet S +AtCoder Educational DP Contest D - Kna... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】Kruskal/Prim算法——求解最小生成树问题 + +

    +
    2022-08-15
    +
    + 前言 +生活中经常遇到类似这种的问题: + +公路修建 +有一些城市,城市之间要修建高速公路,每两个城市之间都可以修双向的路。其中每两个城市之间修路都需要花费对应的金额。请问如何修路,使得总花费的金额最少,且任意两个城市之间都可以直接或间接通过修建... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化) + +

    +
    2022-08-13
    +
    + 0. 前言 +Dijkstra算法可在O(mlog⁡m)\mathcal O(m\log m)O(mlogm)或O(mlog⁡n)\mathcal O(m\log n)O(mlogn)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】多源最短路问题——Floyd算法 + +

    +
    2022-08-12
    +
    + 0. 前言 +在图中,如果要求任意两点间的距离,则可以使用Floyd(O(N3)\mathcal O(N^3)O(N3)😉)和Dijkstra(O(NMlog⁡M)\mathcal O(NM\log M)O(NMlogM)😃)。对于比较小... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树形DP算法总结&详解 + +

    +
    2022-08-12
    +
    + 0. 定义 +树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 +1. 基础 +令f[u]= f[u]=~f[u]= 与树上顶点uuu有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行DP\tex... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/bugfix/index.html b/tag/bugfix/index.html new file mode 100644 index 00000000..d5acf486 --- /dev/null +++ b/tag/bugfix/index.html @@ -0,0 +1,311 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Bug/错误解决 +

    +
    + +
    + +
    +

    + + Anaconda Spyder点击无响应解决 + +

    +
    2020-07-12
    +
    + 问题分析 +可能是升级或卸载了spyder依赖的包,导致spyder无法正常运行。 +我升级了PyQt5,spyder要求PyQt5<5.13,而安装的最新版本为5.15,导致spyder启动时出现问题。 +解决方法 +打开Anaconda ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java.lang.IllegalArgumentException: input == null! 解决方法 + +

    +
    2020-03-29
    +
    + 最近在编一个Java游戏,处理图片时遇到如下问题: +完整错误信息 +Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: in... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + tkinter Text edit_undo()/edit_redo() 没反应解决方法 + +

    +
    2020-03-24
    +
    + 问题 +tkinter.Text调用edit_undo()和edit_redo()没反应。 +问题分析 +这是因为没有设置Text的undo参数为True,设置后才能“激活”edit_undo()和edit_redo()。 +这个错误难发现是因为它... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序报错:Component is not found in path "components/comp/comp.js" + +

    +
    2020-02-05
    +
    + 完整错误 +jsEnginScriptError: +Component is not found in path "components/comp/comp.js" (using by pages/index/index)... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 为什么微信小程序设置的onPullDownRefresh无效 + +

    +
    2020-02-04
    +
    + 因为仅有onPullDownRefresh是不行的,需要配置: + +如果是单个页面需要onPullDownRefresh,在对应页面的json文件中设置"enablePullDownRefresh": true,如: + +{... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序-云开发-数据库 报错:-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +

    +
    2020-02-03
    +
    + 微信小程序-云开发-数据库 报错: +-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +原因: +不能设置_openid,它是云服务器根据用户的openID自动设置的... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + wx.showToast中的一个问题 + +

    +
    2020-02-02
    +
    + wx.showToast中的一个问题 +wx.showToast({ + title: '成功', + icon: 'fail', + duration: 2000, + success: func +}) + +wx.showToast({ + title... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 使用微信小程序-云开发时报错: Error: errCode: -401003 api parameter type error | errMsg: parameter.data should ... + +

    +
    2020-02-02
    +
    + 错误 +Uncaught (in promise) thirdScriptError +errCode: -401003 api parameter type error | errMsg: parameter.data should be o... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/cpp/index.html b/tag/cpp/index.html new file mode 100644 index 00000000..833e33be --- /dev/null +++ b/tag/cpp/index.html @@ -0,0 +1,392 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + C++ +

    +
    + +
    + +
    +

    + + UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解 + +

    +
    2023-12-24
    +
    + A - Christmas Present +题目大意 +给定两个正整数 B,GB,GB,G(1≤B,G≤10001\le B,G\le 10001≤B,G≤1000 且 B≠GB\ne GB​=G),判断哪个更大。 +分析 +模拟即可。 +代码 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 洛谷 P9754 [CSP-S 2023] 结构体 题解 + +

    +
    2023-10-29
    +
    + 题目传送门 +洛谷博客 CSDN +CSP-S 2023 T3 结构体 题解 +基本思路 +本题主要考查编码能力,所以直接给出基本思路: + +由于可以递归式的创建元素,最多可以同时存在 100100100^{100}100100 个不同的基础类型的元... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 318 G - Typical Path Problem 题解 + +

    +
    2023-09-03
    +
    + G - Typical Path Problem +题目大意 +给定一张 NNN 个点、MMM 条边的简单无向图 GGG 和三个整数 A,B,CA,B,CA,B,C。 +是否存在一条从顶点 AAA 到 CCC,且经过 BBB 的简单路径? +数据范... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解 + +

    +
    2023-04-19
    +
    + 好久没写题解了,这就来水一篇。 +A - Job Interview +题目大意 +给定一个长为 NNN 的字符串 SSS,由 o、-、x 组成。 +判断 SSS 是否符合下列条件: + +SSS 中至少有一个 o。 +SSS 中没有 x。 + +1≤N≤1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 274 A~E 题解 + +

    +
    2022-10-24
    +
    + 吐槽:这比赛名字为啥没有英文版。。。 +A - Batting Average +题目大意 +给定整数A,BA,BA,B,输出BA\frac BAAB​,保留三位小数。 +1≤A≤101\le A\le 101≤A≤10 +0≤B≤A0\le B\l... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解 + +

    +
    2022-08-07
    +
    + A - Full House +题目大意 +来自一个掼蛋爱好者的翻译qwq +给定一副扑克牌中五张牌的编号A,B,C,D,EA,B,C,D,EA,B,C,D,E,判断这五张是否为一组“三带二”。(不懂的自行百度 +数据范围:1≤A,B,C,D,E≤... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 260 A~F 题解 + +

    +
    2022-07-19
    +
    + A - A Unique Letter +题目大意 +给定一个长度为333的字符串SSS。 +输出SSS中出现正好一次的字母(任意,如abc中,三个字母都可为答案)。 +如果没有,输出-1。 +数据保证SSS的长为333,且由小写英文字母组成。 +输入... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 258 A~Ex 题解 + +

    +
    2022-07-04
    +
    + D - Trophy +题目大意 +有一个游戏,由NNN个关卡组成。第iii个关卡由一个数对(Ai,Bi)(A_i,B_i)(Ai​,Bi​)组成。 +要通过一个关卡,你必须先花AiA_iAi​的时间看一次介绍。然后,用BiB_iBi​的时间打通... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 254 A~E 题解 + +

    +
    2022-06-04
    +
    + A - Last Two Digits +题目大意 +给定正整数NNN,求NNN的后两位。 +100≤N≤999100\le N\le 999100≤N≤999 +输入格式 +NNN +输出格式 +输出NNN的后两位,注意输出可能有前导0。 +样例 + + + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 253 A~E 题解 + +

    +
    2022-05-29
    +
    + A - Median? +题目大意 +给定正整数a,b,ca,b,ca,b,c,判断bbb是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。 +1≤a,b,c≤1001\le a,b,c\le 1001≤a,b,c≤100 +输入格式... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/cpp/page/2/index.html b/tag/cpp/page/2/index.html new file mode 100644 index 00000000..29679ebc --- /dev/null +++ b/tag/cpp/page/2/index.html @@ -0,0 +1,386 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + C++ +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 252 A~G 题解 + +

    +
    2022-05-22
    +
    + +前言 + +这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! + + +A - ASCII code +题目大意 +给定正整数NNN,输出ASCII码是NNN的字母。 +97≤N≤12297... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 250 C~E 题解 + +

    +
    2022-05-11
    +
    + C - Adjacent Swaps +题目大意 +NNN个球从左到右排成一列。开始时,从左往右的第iii个球上写着数字iii。 +请执行QQQ个操作,第iii个操作如下: + +令j= Nj=~Nj= N个球中写着数字xix_ixi​的球的位置 +如... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248)C~D 题解 + +

    +
    2022-04-17
    +
    + C - Dice Sum +题目大意 +有多少个整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)符合如下条件: + +1≤Ai≤M1\le A_i\le M1≤Ai​≤M +∑i=1NAi≤K\sum\lim... +
    + + 阅读更多 + +
    + +
    + +
    + + + +
    +

    + + AtCoder题解集锦 + +

    +
    2022-04-15
    +
    + 本文在CSDN随时更新,详见: +https://blog.csdn.net/write_1m_lines/article/details/124204736 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + ARC138 B - 01 Generation 题解 + +

    +
    2022-04-14
    +
    + ARC138 B - 01 Generation +思路 +考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 245 A~E 题解 + +

    +
    2022-03-28
    +
    + A - Good morning +题目大意 +在同一天里,Takahashi在AAA时BBB分起床,Aoki在CCC时DDD分111秒起床,请问谁起床更早? +0≤A,C<240\le A,C<240≤A,C<24 +0≤B,D... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 244 D~F 题解 + +

    +
    2022-03-20
    +
    + D - Swap Hats +题目大意 +有333个Takahashi,他们帽子的颜色分别为S1,S2,S3S_1,S_2,S_3S1​,S2​,S3​。 +我们现在想通过正好101810^{18}1018次操作,使得Si=TiS_i=T_iSi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 242 C~E 题解 + +

    +
    2022-03-08
    +
    + C - 1111gal password +题目大意 +给定正整数NNN,求符合下列条件的整数XXX的个数,对998244353998244353998244353取模: + +XXX是NNN位的正整数 +XXX的每一位数都在[1,9][1,9][1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解 + +

    +
    2022-03-05
    +
    + D - Sequence Query +题目大意 +我们有一个空序列AAA。请依次处理QQQ个命令,每个命令有三种类型,每种类型的格式如下: + +1 x:将xxx加入AAA(不去重) +2 x k:求在AAA的≤x\le x≤x的元素中,第kkk大... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Denso Create Programming Contest 2022 (AtCoder Beginner Contest 239) C~E 题解 + +

    +
    2022-02-25
    +
    + C - Knight Fork +题目大意 +在二维平面上是否有一个整数坐标点到(x1,y1)(x_1,y_1)(x1​,y1​)和(x2,y2)(x_2,y_2)(x2​,y2​)的欧几里得距离都是5\sqrt55​? +输入格式 +x1 y1 ... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/cpp/page/3/index.html b/tag/cpp/page/3/index.html new file mode 100644 index 00000000..4f2e85e4 --- /dev/null +++ b/tag/cpp/page/3/index.html @@ -0,0 +1,392 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + C++ +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 205 A~E 题解 + +

    +
    2021-07-07
    +
    + A - kcal +题目大意 +我们有一种每100100100毫升含有AAA千卡热量的饮料。BBB毫升的这种饮料含有多少千卡热量? +0≤A,B≤10000\le A, B\le 10000≤A,B≤1000 +输入格式 +A BA~BA B +输出格... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-13
    +
    + A - Square Inequality +题目大意 +给定三个整数A,B,CA,B,CA,B,C。判断A2+B2<C2A^2+B^2<C^2A2+B2<C2是否成立。 +0≤A,B,C≤10000\le A,B,C\le 1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解 + +

    +
    2021-06-10
    +
    + A - Century +题目大意 +公元NNN年在第几个世纪中? + +一个世纪是由100100100个年份组成的一个区间。如,111世纪为[1,100][1,100][1,100]年,222世纪为[101,200][101,200][101,2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 204 A~E 题解 + +

    +
    2021-06-07
    +
    + A - Rock-paper-scissors +三个人玩石头剪刀布平局,其中两个出的分别是x,yx,yx,y,求另一个人出的。 +0≤x,y≤20\le x,y\le 20≤x,y≤2(0,1,20,1,20,1,2分别表示石头,剪刀,布) +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AISing Programming Contest 2021 (AtCoder Beginner Contest 202) A~E 题解 + +

    +
    2021-06-06
    +
    + A - Three Dice +一个人抛了三个骰子,它们的顶面分别是a,b,ca,b,ca,b,c。求它们的底面之和。 +这里用的骰子是标准骰子,即两个相对的面之和为777。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-03
    +
    + A - Chinchirorin +题目大意 +给定三个整数a,b,ca,b,ca,b,c,如果它们中有两个相等,输出另一个;否则,输出000。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +输入格式 +a b ca~b~c... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解 + +

    +
    2021-05-18
    +
    + A - Tiny Arithmetic Sequence +题目大意 +给定序列A=(A1,A2,A3)A=(A_1,A_2,A_3)A=(A1​,A2​,A3​)。能否将AAA重新排列,使得A3−A2=A2−A1A_3-A_2=A_2-A_1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 198 A~E 题解 + +

    +
    2021-04-13
    +
    + A - Div +题目大意 +两个男孩要分NNN颗糖。问一共有几种分法(每个男孩都必须分到糖)? +1≤N≤151\le N\le 151≤N≤15 +输入格式 +NNN +输出格式 +将答案输出为一个整数。 +样例 + + + +NNN +输出 + + + + +222 +1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 196 A~E 题解 + +

    +
    2021-04-01
    +
    + A - Difference Max +题目大意 +给定四个整数a,b,ca,b,ca,b,c和ddd。 +我们要选择两个整数xxx和yyy(a≤x≤ba\le x\le ba≤x≤b;c≤y≤dc\le y\le dc≤y≤d)。输出最大的x−... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Panasonic Programming Contest (AtCoder Beginner Contest 195) A~E 题解 + +

    +
    2021-03-25
    +
    + A - Health M Death +题目大意 +有一位魔术师,他正在打一个血量为HHH?的怪兽。 +当怪兽的血量是MMM的倍数时,魔术师能打败怪兽。 +魔术师能打败怪兽吗? +1≤M,H≤10001\le M,H\le 10001≤M,H≤100... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/cpp/page/4/index.html b/tag/cpp/page/4/index.html new file mode 100644 index 00000000..fe570376 --- /dev/null +++ b/tag/cpp/page/4/index.html @@ -0,0 +1,405 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + C++ +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 194 A~E 题解 + +

    +
    2021-03-17
    +
    + A - I Scream +题目大意 +在日本,有如下四种冰淇淋产品: + +至少有15%15\%15%的milk solids和8%8\%8%的milk fat的产品称为“冰淇淋”; +至少有10%10\%10%的milk solids和3%3\%... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Caddi Programming Contest 2021 (AtCoder Beginner Contest 193) A~D 题解 + +

    +
    2021-03-08
    +
    + A - Discount +题目大意 +一件商品原价为AAA元,现价为BBB元,现价优惠了百分之几? +1≤B<A≤1051\le B<A\le 10^51≤B<A≤105 +输入格式 +A BA~BA B +输出格式 +输出答案(不加... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 192 A~D 题解 + +

    +
    2021-02-28
    +
    + A - Star +题目大意 +下一个大于XXX的100100100的倍数与XXX的差是多少? +1≤X≤1051\le X\le 10^51≤X≤105 +输入格式 +XXX +输出格式 +输出答案。 +样例 + + + +XXX +输出 + + + + +14014014... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 191 A~D 题解 + +

    +
    2021-02-09
    +
    + A - Vanishing Pitch +题目大意 +一个球的速度是V m/sV~\text{m/s}V m/s,它飞了TTT秒后会隐形,飞了SSS秒时会接触隐形。 +球在飞了DDD米后,人能看见它吗?输出Yes或者No。 +1≤V≤10001\l... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 190 A~D 题解 + +

    +
    2021-02-01
    +
    + A - Very Very Primitive Game +题目大意 +Takahashi和Aoki在玩一个游戏。 +游戏规则是这样的: + +最开始,Takahashi和Aoki分别有AAA和BBB颗糖。 +他们将轮流吃一颗糖,第一个无法吃糖的人算输... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 189 A~D 题解 + +

    +
    2021-01-25
    +
    + A - Slots +题目大意 +给定三个大写英文字母C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​,判断它们是否相同。 +输入格式 +C1C2C3C_1C_2C_3C1​C2​C3​ +输出格式 +如果C1,C2,C3C_1,C_2,C... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 177 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Don't be late +题目大意 +Takahashi要和Aoki见面。 +他们计划在距离Takahashi家DDD米的地方TTT分钟后见面。 +Takahashi将立即出门并以SSS米/分钟的速度朝见面地点走去。 +Takahashi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 188 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Three-Point Shot +题目大意 +有两个球队,分别得到XXX分和YYY分,问得分较少的球队能否在获得三分后超越对方。 +0≤X,Y≤1000\le X,Y\le 1000≤X,Y≤100 +X≠YX \ne YX​=Y +XX... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 187 A~D 题解 + +

    +
    2021-01-03
    +
    + A - Large Digits +题目大意 +给定两个三位整数AAA和BBB,求它们数位和的最大值。 +数位和:例如,123123123的数位和是1+2+3=61+2+3=61+2+3=6。 +100≤A,B≤999100\le A,B\le 9... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 173 A~D 题解 + +

    +
    2020-07-20
    +
    + A - Payment +题目大意 +如果使用价值100010001000元的纸币(假设有)支付NNN元,服务员会找多少钱? +1≤N≤100001\le N\le 100001≤N≤10000 +输入格式 +NNN +输出格式 +一行,即服务员找的钱数... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/cpp/page/5/index.html b/tag/cpp/page/5/index.html new file mode 100644 index 00000000..37f590f0 --- /dev/null +++ b/tag/cpp/page/5/index.html @@ -0,0 +1,260 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + C++ +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 171 A~D 题解 + +

    +
    2020-06-22
    +
    + A - αlphabet +题目大意 +输入一个英文字母aaa,判断它是大写还是小写。 +输入格式 +aaa +输出格式 +如果aaa为小写,输出a; +如果aaa为大写,输出A。 +样例输入1 +B + +样例输出1 +A + +B为大写,所以输出A。 +样例输入2 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 168 C~D 题解 + +

    +
    2020-05-19
    +
    + 这次比赛的题名很特殊,是由符号+(+英文+)组成的 😃 +C - : (Colon) +题目大意 +在AAA时BBB分,长度为HHH厘米的时针和长度为MMM厘米的分针的顶点的距离是多少? +1≤A,B≤10001\le A, B\le 10001... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 161D 题解 + +

    +
    2020-04-05
    +
    + 原题链接:洛谷链接;AtCoder链接 +思路 +每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第KKK次弹出的整数。 +注意事项 + +不用long long会WA! +上一位为000时下一位不能为−1-1−1!(要... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解 + +

    +
    2020-03-16
    +
    + 题目大意 +输入三个整数aaa,bbb,ccc,如果 a+b<c\sqrt a + \sqrt b < \sqrt ca​+b​<c​ 成立,输出Yes,否则输出No。 +样例 +输入 #1 +2 3 9 + +输出 #1 +No + +2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + CodeForces Round #621 ABC (1307A+1307B+1307C) 题解 + +

    +
    2020-02-22
    +
    + A. Cow and Haybales +题面 +The USA Construction Operation (USACO) recently ordered Farmer John to arrange a row of n haybale... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/github/index.html b/tag/github/index.html new file mode 100644 index 00000000..6a15e1df --- /dev/null +++ b/tag/github/index.html @@ -0,0 +1,162 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + GitHub +

    +
    + +
    + +
    +

    + + PyQt6/PySide6:账本项目前端制作【附完整项目地址】 + +

    +
    2022-07-23
    +
    + 0. 前言 +最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。 +屏幕截图: + + + +1. 后端 +后端主要是朋友做的,在这里就不多说了,放个代码: +src/api.py +f... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + GitHub访问慢的原因以及解决办法 + +

    +
    2022-07-16
    +
    + 注意:由于某些特殊原因,本文没有在CSDN上发布,因此这里是本文唯一可见的地址。 +前言 +相信大家工作时都难免会遇到。。。 + +$ git push +Error: Failed to connect to github.com port 443... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/ide/index.html b/tag/ide/index.html new file mode 100644 index 00000000..5cdd023c --- /dev/null +++ b/tag/ide/index.html @@ -0,0 +1,184 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 集成开发环境/IDE +

    +
    + +
    + +
    +

    + + Anaconda Spyder点击无响应解决 + +

    +
    2020-07-12
    +
    + 问题分析 +可能是升级或卸载了spyder依赖的包,导致spyder无法正常运行。 +我升级了PyQt5,spyder要求PyQt5<5.13,而安装的最新版本为5.15,导致spyder启动时出现问题。 +解决方法 +打开Anaconda ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Eclipse安装包下载慢解决方法 + +

    +
    2020-04-10
    +
    + +最近开始学习Java,使用经典的Eclipse IDE,结果发现下载太慢…… + +问题分析 + +Eclipse的下载依赖于其他镜像,(在我这里)默认为朝鲜的镜像(可能在不同电脑中默认不同): + +点击Select Another Mirror:... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Eclipse Check For Updates总是检查不到更新-解决方法 + +

    +
    2020-04-08
    +
    + 最近想用流行的Java IDE —— Eclipse的Help -> Check For Updates更新Eclipse,结果总是说未找到更新: + +1. 检查是否有更新 +首先,访问Eclipse下载地址获得最新版本(目前为2020-... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/java/index.html b/tag/java/index.html new file mode 100644 index 00000000..84a73d0a --- /dev/null +++ b/tag/java/index.html @@ -0,0 +1,177 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Java +

    +
    + +
    + +
    +

    + + Java中的整数移位运算符 + +

    +
    2020-04-04
    +
    + 对于<<, >>两种运算符,可以这样说: +a<<b=a∗2ba<<b=a*2^ba<<b=a∗2b +a>>b=a/2ba>>b=a/2^ba>>... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java final关键字语法 + +

    +
    2020-04-01
    +
    + 一、final类和方法 +英文文档 +原文:Java官方文档 -> Writing Final Classes and Methods +You can declare some or all of a class's methods fi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java.lang.IllegalArgumentException: input == null! 解决方法 + +

    +
    2020-03-29
    +
    + 最近在编一个Java游戏,处理图片时遇到如下问题: +完整错误信息 +Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: in... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/js/index.html b/tag/js/index.html new file mode 100644 index 00000000..e14df0ab --- /dev/null +++ b/tag/js/index.html @@ -0,0 +1,155 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + JavaScript +

    +
    + +
    + +
    +

    + + js产生随机数 + +

    +
    2020-02-09
    +
    + +产生[0,1)[0,1)[0,1)之间的随机实数,即0≤Math.random()<10\le\text{Math.random()}<10≤Math.random()<1 + +Math.random() +// 返回值样例... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + js获取1970.1.1到当前的毫秒数 + +

    +
    2020-01-31
    +
    + Date.now() // 获取1970.1.1到当前的毫秒数 +Date.UTC(2000, 1, 1) // 获取1970.1.1到2000.1.1的毫秒数 + +... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/mathematica-and-wolfram-language/index.html b/tag/mathematica-and-wolfram-language/index.html new file mode 100644 index 00000000..66ca28d7 --- /dev/null +++ b/tag/mathematica-and-wolfram-language/index.html @@ -0,0 +1,128 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Mathematica & Wolfram Language +

    +
    + +
    + +
    +

    + + Mathematica 入门 + +

    +
    2024-01-25
    +
    + 前言 +Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLAB 和 Maple 等。 +M... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/oi/index.html b/tag/oi/index.html new file mode 100644 index 00000000..aaa84a50 --- /dev/null +++ b/tag/oi/index.html @@ -0,0 +1,383 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) A~G 题解 + +

    +
    2023-12-24
    +
    + A - Christmas Present +题目大意 +给定两个正整数 B,GB,GB,G(1≤B,G≤10001\le B,G\le 10001≤B,G≤1000 且 B≠GB\ne GB​=G),判断哪个更大。 +分析 +模拟即可。 +代码 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 洛谷 P9754 [CSP-S 2023] 结构体 题解 + +

    +
    2023-10-29
    +
    + 题目传送门 +洛谷博客 CSDN +CSP-S 2023 T3 结构体 题解 +基本思路 +本题主要考查编码能力,所以直接给出基本思路: + +由于可以递归式的创建元素,最多可以同时存在 100100100^{100}100100 个不同的基础类型的元... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 318 G - Typical Path Problem 题解 + +

    +
    2023-09-03
    +
    + G - Typical Path Problem +题目大意 +给定一张 NNN 个点、MMM 条边的简单无向图 GGG 和三个整数 A,B,CA,B,CA,B,C。 +是否存在一条从顶点 AAA 到 CCC,且经过 BBB 的简单路径? +数据范... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) A~G 题解 + +

    +
    2023-04-19
    +
    + 好久没写题解了,这就来水一篇。 +A - Job Interview +题目大意 +给定一个长为 NNN 的字符串 SSS,由 o、-、x 组成。 +判断 SSS 是否符合下列条件: + +SSS 中至少有一个 o。 +SSS 中没有 x。 + +1≤N≤1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】最近公共祖先(LCA)问题求解——倍增算法 + +

    +
    2023-01-06
    +
    + 0. 前言 +最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 +这种算法应用很广泛,可以很容易解决树上最短路等问题。 +为了方便,我们记某点集 S={... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树 + +

    +
    2023-01-05
    +
    + 0. 前言 +好久没更算法笔记专栏了,正好学了新算法来更新…… +这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! +1. 关于 RMQ 问题 +RMQ 的全称是 Range Minimum/Maximum... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 274 A~E 题解 + +

    +
    2022-10-24
    +
    + 吐槽:这比赛名字为啥没有英文版。。。 +A - Batting Average +题目大意 +给定整数A,BA,BA,B,输出BA\frac BAAB​,保留三位小数。 +1≤A≤101\le A\le 101≤A≤10 +0≤B≤A0\le B\l... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】位运算详解 + +

    +
    2022-10-18
    +
    + 0. 前言 +突然想到位运算是个好东西,就来水一波文章了…… +注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! +本文中参考代码均使用C++编写。 +废话不多说,... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree + +

    +
    2022-08-20
    +
    + 前言 +树状数组,即树形存储的数组,又称Binary Indexed Tree或Fenwick Tree。 +抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「 树」没什么关系: + +有一个序列A=(A1,A2,…,AN)A=(A_1,A_... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】三种背包问题——背包 DP + +

    +
    2022-08-18
    +
    + 前言 +背包(Knapsack)问题是经典的动态规划问题,也很有实际价值。 +01背包 + +洛谷 P2871 [USACO07DEC] Charm Bracelet S +AtCoder Educational DP Contest D - Kna... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/oi/page/2/index.html b/tag/oi/page/2/index.html new file mode 100644 index 00000000..abc96660 --- /dev/null +++ b/tag/oi/page/2/index.html @@ -0,0 +1,385 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + 【算法笔记】Kruskal/Prim算法——求解最小生成树问题 + +

    +
    2022-08-15
    +
    + 前言 +生活中经常遇到类似这种的问题: + +公路修建 +有一些城市,城市之间要修建高速公路,每两个城市之间都可以修双向的路。其中每两个城市之间修路都需要花费对应的金额。请问如何修路,使得总花费的金额最少,且任意两个城市之间都可以直接或间接通过修建... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化) + +

    +
    2022-08-13
    +
    + 0. 前言 +Dijkstra算法可在O(mlog⁡m)\mathcal O(m\log m)O(mlogm)或O(mlog⁡n)\mathcal O(m\log n)O(mlogn)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】多源最短路问题——Floyd算法 + +

    +
    2022-08-12
    +
    + 0. 前言 +在图中,如果要求任意两点间的距离,则可以使用Floyd(O(N3)\mathcal O(N^3)O(N3)😉)和Dijkstra(O(NMlog⁡M)\mathcal O(NM\log M)O(NMlogM)😃)。对于比较小... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树形DP算法总结&详解 + +

    +
    2022-08-12
    +
    + 0. 定义 +树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 +1. 基础 +令f[u]= f[u]=~f[u]= 与树上顶点uuu有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行DP\tex... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解 + +

    +
    2022-08-07
    +
    + A - Full House +题目大意 +来自一个掼蛋爱好者的翻译qwq +给定一副扑克牌中五张牌的编号A,B,C,D,EA,B,C,D,EA,B,C,D,E,判断这五张是否为一组“三带二”。(不懂的自行百度 +数据范围:1≤A,B,C,D,E≤... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 260 A~F 题解 + +

    +
    2022-07-19
    +
    + A - A Unique Letter +题目大意 +给定一个长度为333的字符串SSS。 +输出SSS中出现正好一次的字母(任意,如abc中,三个字母都可为答案)。 +如果没有,输出-1。 +数据保证SSS的长为333,且由小写英文字母组成。 +输入... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 258 A~Ex 题解 + +

    +
    2022-07-04
    +
    + D - Trophy +题目大意 +有一个游戏,由NNN个关卡组成。第iii个关卡由一个数对(Ai,Bi)(A_i,B_i)(Ai​,Bi​)组成。 +要通过一个关卡,你必须先花AiA_iAi​的时间看一次介绍。然后,用BiB_iBi​的时间打通... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 254 A~E 题解 + +

    +
    2022-06-04
    +
    + A - Last Two Digits +题目大意 +给定正整数NNN,求NNN的后两位。 +100≤N≤999100\le N\le 999100≤N≤999 +输入格式 +NNN +输出格式 +输出NNN的后两位,注意输出可能有前导0。 +样例 + + + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 253 A~E 题解 + +

    +
    2022-05-29
    +
    + A - Median? +题目大意 +给定正整数a,b,ca,b,ca,b,c,判断bbb是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。 +1≤a,b,c≤1001\le a,b,c\le 1001≤a,b,c≤100 +输入格式... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 252 A~G 题解 + +

    +
    2022-05-22
    +
    + +前言 + +这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! + + +A - ASCII code +题目大意 +给定正整数NNN,输出ASCII码是NNN的字母。 +97≤N≤12297... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/oi/page/3/index.html b/tag/oi/page/3/index.html new file mode 100644 index 00000000..277f05c2 --- /dev/null +++ b/tag/oi/page/3/index.html @@ -0,0 +1,383 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 250 C~E 题解 + +

    +
    2022-05-11
    +
    + C - Adjacent Swaps +题目大意 +NNN个球从左到右排成一列。开始时,从左往右的第iii个球上写着数字iii。 +请执行QQQ个操作,第iii个操作如下: + +令j= Nj=~Nj= N个球中写着数字xix_ixi​的球的位置 +如... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + UNIQUE VISION Programming Contest 2022(AtCoder Beginner Contest 248)C~D 题解 + +

    +
    2022-04-17
    +
    + C - Dice Sum +题目大意 +有多少个整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)符合如下条件: + +1≤Ai≤M1\le A_i\le M1≤Ai​≤M +∑i=1NAi≤K\sum\lim... +
    + + 阅读更多 + +
    + +
    + +
    + + + +
    +

    + + AtCoder题解集锦 + +

    +
    2022-04-15
    +
    + 本文在CSDN随时更新,详见: +https://blog.csdn.net/write_1m_lines/article/details/124204736 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + ARC138 B - 01 Generation 题解 + +

    +
    2022-04-14
    +
    + ARC138 B - 01 Generation +思路 +考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 245 A~E 题解 + +

    +
    2022-03-28
    +
    + A - Good morning +题目大意 +在同一天里,Takahashi在AAA时BBB分起床,Aoki在CCC时DDD分111秒起床,请问谁起床更早? +0≤A,C<240\le A,C<240≤A,C<24 +0≤B,D... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 244 D~F 题解 + +

    +
    2022-03-20
    +
    + D - Swap Hats +题目大意 +有333个Takahashi,他们帽子的颜色分别为S1,S2,S3S_1,S_2,S_3S1​,S2​,S3​。 +我们现在想通过正好101810^{18}1018次操作,使得Si=TiS_i=T_iSi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 242 C~E 题解 + +

    +
    2022-03-08
    +
    + C - 1111gal password +题目大意 +给定正整数NNN,求符合下列条件的整数XXX的个数,对998244353998244353998244353取模: + +XXX是NNN位的正整数 +XXX的每一位数都在[1,9][1,9][1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解 + +

    +
    2022-03-05
    +
    + D - Sequence Query +题目大意 +我们有一个空序列AAA。请依次处理QQQ个命令,每个命令有三种类型,每种类型的格式如下: + +1 x:将xxx加入AAA(不去重) +2 x k:求在AAA的≤x\le x≤x的元素中,第kkk大... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Denso Create Programming Contest 2022 (AtCoder Beginner Contest 239) C~E 题解 + +

    +
    2022-02-25
    +
    + C - Knight Fork +题目大意 +在二维平面上是否有一个整数坐标点到(x1,y1)(x_1,y_1)(x1​,y1​)和(x2,y2)(x_2,y_2)(x2​,y2​)的欧几里得距离都是5\sqrt55​? +输入格式 +x1 y1 ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 205 A~E 题解 + +

    +
    2021-07-07
    +
    + A - kcal +题目大意 +我们有一种每100100100毫升含有AAA千卡热量的饮料。BBB毫升的这种饮料含有多少千卡热量? +0≤A,B≤10000\le A, B\le 10000≤A,B≤1000 +输入格式 +A BA~BA B +输出格... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/oi/page/4/index.html b/tag/oi/page/4/index.html new file mode 100644 index 00000000..3dcf6419 --- /dev/null +++ b/tag/oi/page/4/index.html @@ -0,0 +1,391 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 199 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-13
    +
    + A - Square Inequality +题目大意 +给定三个整数A,B,CA,B,CA,B,C。判断A2+B2<C2A^2+B^2<C^2A2+B2<C2是否成立。 +0≤A,B,C≤10000\le A,B,C\le 1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解 + +

    +
    2021-06-10
    +
    + A - Century +题目大意 +公元NNN年在第几个世纪中? + +一个世纪是由100100100个年份组成的一个区间。如,111世纪为[1,100][1,100][1,100]年,222世纪为[101,200][101,200][101,2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 204 A~E 题解 + +

    +
    2021-06-07
    +
    + A - Rock-paper-scissors +三个人玩石头剪刀布平局,其中两个出的分别是x,yx,yx,y,求另一个人出的。 +0≤x,y≤20\le x,y\le 20≤x,y≤2(0,1,20,1,20,1,2分别表示石头,剪刀,布) +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AISing Programming Contest 2021 (AtCoder Beginner Contest 202) A~E 题解 + +

    +
    2021-06-06
    +
    + A - Three Dice +一个人抛了三个骰子,它们的顶面分别是a,b,ca,b,ca,b,c。求它们的底面之和。 +这里用的骰子是标准骰子,即两个相对的面之和为777。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解 + +

    +
    2021-06-03
    +
    + A - Chinchirorin +题目大意 +给定三个整数a,b,ca,b,ca,b,c,如果它们中有两个相等,输出另一个;否则,输出000。 +1≤a,b,c≤61\le a,b,c\le 61≤a,b,c≤6 +输入格式 +a b ca~b~c... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解 + +

    +
    2021-05-18
    +
    + A - Tiny Arithmetic Sequence +题目大意 +给定序列A=(A1,A2,A3)A=(A_1,A_2,A_3)A=(A1​,A2​,A3​)。能否将AAA重新排列,使得A3−A2=A2−A1A_3-A_2=A_2-A_1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 198 A~E 题解 + +

    +
    2021-04-13
    +
    + A - Div +题目大意 +两个男孩要分NNN颗糖。问一共有几种分法(每个男孩都必须分到糖)? +1≤N≤151\le N\le 151≤N≤15 +输入格式 +NNN +输出格式 +将答案输出为一个整数。 +样例 + + + +NNN +输出 + + + + +222 +1... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 196 A~E 题解 + +

    +
    2021-04-01
    +
    + A - Difference Max +题目大意 +给定四个整数a,b,ca,b,ca,b,c和ddd。 +我们要选择两个整数xxx和yyy(a≤x≤ba\le x\le ba≤x≤b;c≤y≤dc\le y\le dc≤y≤d)。输出最大的x−... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Panasonic Programming Contest (AtCoder Beginner Contest 195) A~E 题解 + +

    +
    2021-03-25
    +
    + A - Health M Death +题目大意 +有一位魔术师,他正在打一个血量为HHH?的怪兽。 +当怪兽的血量是MMM的倍数时,魔术师能打败怪兽。 +魔术师能打败怪兽吗? +1≤M,H≤10001\le M,H\le 10001≤M,H≤100... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 194 A~E 题解 + +

    +
    2021-03-17
    +
    + A - I Scream +题目大意 +在日本,有如下四种冰淇淋产品: + +至少有15%15\%15%的milk solids和8%8\%8%的milk fat的产品称为“冰淇淋”; +至少有10%10\%10%的milk solids和3%3\%... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/oi/page/5/index.html b/tag/oi/page/5/index.html new file mode 100644 index 00000000..fead66e7 --- /dev/null +++ b/tag/oi/page/5/index.html @@ -0,0 +1,416 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + Caddi Programming Contest 2021 (AtCoder Beginner Contest 193) A~D 题解 + +

    +
    2021-03-08
    +
    + A - Discount +题目大意 +一件商品原价为AAA元,现价为BBB元,现价优惠了百分之几? +1≤B<A≤1051\le B<A\le 10^51≤B<A≤105 +输入格式 +A BA~BA B +输出格式 +输出答案(不加... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 192 A~D 题解 + +

    +
    2021-02-28
    +
    + A - Star +题目大意 +下一个大于XXX的100100100的倍数与XXX的差是多少? +1≤X≤1051\le X\le 10^51≤X≤105 +输入格式 +XXX +输出格式 +输出答案。 +样例 + + + +XXX +输出 + + + + +14014014... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 191 A~D 题解 + +

    +
    2021-02-09
    +
    + A - Vanishing Pitch +题目大意 +一个球的速度是V m/sV~\text{m/s}V m/s,它飞了TTT秒后会隐形,飞了SSS秒时会接触隐形。 +球在飞了DDD米后,人能看见它吗?输出Yes或者No。 +1≤V≤10001\l... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 190 A~D 题解 + +

    +
    2021-02-01
    +
    + A - Very Very Primitive Game +题目大意 +Takahashi和Aoki在玩一个游戏。 +游戏规则是这样的: + +最开始,Takahashi和Aoki分别有AAA和BBB颗糖。 +他们将轮流吃一颗糖,第一个无法吃糖的人算输... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 189 A~D 题解 + +

    +
    2021-01-25
    +
    + A - Slots +题目大意 +给定三个大写英文字母C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​,判断它们是否相同。 +输入格式 +C1C2C3C_1C_2C_3C1​C2​C3​ +输出格式 +如果C1,C2,C3C_1,C_2,C... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 177 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Don't be late +题目大意 +Takahashi要和Aoki见面。 +他们计划在距离Takahashi家DDD米的地方TTT分钟后见面。 +Takahashi将立即出门并以SSS米/分钟的速度朝见面地点走去。 +Takahashi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 188 A~D 题解 + +

    +
    2021-01-13
    +
    + A - Three-Point Shot +题目大意 +有两个球队,分别得到XXX分和YYY分,问得分较少的球队能否在获得三分后超越对方。 +0≤X,Y≤1000\le X,Y\le 1000≤X,Y≤100 +X≠YX \ne YX​=Y +XX... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 187 A~D 题解 + +

    +
    2021-01-03
    +
    + A - Large Digits +题目大意 +给定两个三位整数AAA和BBB,求它们数位和的最大值。 +数位和:例如,123123123的数位和是1+2+3=61+2+3=61+2+3=6。 +100≤A,B≤999100\le A,B\le 9... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 173 A~D 题解 + +

    +
    2020-07-20
    +
    + A - Payment +题目大意 +如果使用价值100010001000元的纸币(假设有)支付NNN元,服务员会找多少钱? +1≤N≤100001\le N\le 100001≤N≤10000 +输入格式 +NNN +输出格式 +一行,即服务员找的钱数... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 171 A~D 题解 + +

    +
    2020-06-22
    +
    + A - αlphabet +题目大意 +输入一个英文字母aaa,判断它是大写还是小写。 +输入格式 +aaa +输出格式 +如果aaa为小写,输出a; +如果aaa为大写,输出A。 +样例输入1 +B + +样例输出1 +A + +B为大写,所以输出A。 +样例输入2 +... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/oi/page/6/index.html b/tag/oi/page/6/index.html new file mode 100644 index 00000000..1893998f --- /dev/null +++ b/tag/oi/page/6/index.html @@ -0,0 +1,222 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 算法竞赛 +

    +
    + +
    + +
    +

    + + AtCoder Beginner Contest 168 C~D 题解 + +

    +
    2020-05-19
    +
    + 这次比赛的题名很特殊,是由符号+(+英文+)组成的 😃 +C - : (Colon) +题目大意 +在AAA时BBB分,长度为HHH厘米的时针和长度为MMM厘米的分针的顶点的距离是多少? +1≤A,B≤10001\le A, B\le 10001... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 161D 题解 + +

    +
    2020-04-05
    +
    + 原题链接:洛谷链接;AtCoder链接 +思路 +每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第KKK次弹出的整数。 +注意事项 + +不用long long会WA! +上一位为000时下一位不能为−1-1−1!(要... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解 + +

    +
    2020-03-16
    +
    + 题目大意 +输入三个整数aaa,bbb,ccc,如果 a+b<c\sqrt a + \sqrt b < \sqrt ca​+b​<c​ 成立,输出Yes,否则输出No。 +样例 +输入 #1 +2 3 9 + +输出 #1 +No + +2... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + CodeForces Round #621 ABC (1307A+1307B+1307C) 题解 + +

    +
    2020-02-22
    +
    + A. Cow and Haybales +题面 +The USA Construction Operation (USACO) recently ordered Farmer John to arrange a row of n haybale... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +
    + + + + diff --git a/tag/opensource-projects/index.html b/tag/opensource-projects/index.html new file mode 100644 index 00000000..b9b9a16d --- /dev/null +++ b/tag/opensource-projects/index.html @@ -0,0 +1,179 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 开源项目 +

    +
    + +
    + +
    +

    + + README - 账本 + +

    +
    2022-06-28
    +
    + https://github.com/GoodCoder666/AccountBook/blob/main/README.md + +AccountBook +*For English-speaking users: This project ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + License (GPLv3) + +

    +
    2020-01-02
    +
    + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + License (MIT) + +

    +
    2020-01-02
    +
    + MIT License +Copyright (c) 2024 Stanley +Permission is hereby granted, free of charge, to any person obtaining a copy +of t... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/python-functions/index.html b/tag/python-functions/index.html new file mode 100644 index 00000000..aa1a595e --- /dev/null +++ b/tag/python-functions/index.html @@ -0,0 +1,195 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Python函数 +

    +
    + +
    + +
    +

    + + Python函数之lambda函数 + +

    +
    2020-04-21
    +
    + 温馨提示:如果读者没有学过def定义函数,请先看这里 +定义形式 +<函数名> = lambda <参数列表>: <返回值> + +等同于: +def <函数名>(<参数列表>): + ret... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之def定义函数 + +

    +
    2020-04-21
    +
    + 链接 +想研究Python函数?看这里 +函数怎样取名?看这里 +有参数的函数还可以怎么传参?看这里 +一、无参数函数 +结构 +def <函数名>(): # 强制要求 + <函数体> # 可省略 + return <返回值&... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之*[参数名]和**[参数名]的用处 + +

    +
    2020-03-03
    +
    + 一、*[参数名] +调用 +合法调用 +普通调用 +*参数名一般写成*args, 如: +def func(*args): + print(args) + +可以试着调用func: +>>> func(1) +(1,) +>>>... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/python/index.html b/tag/python/index.html new file mode 100644 index 00000000..6deb6c2e --- /dev/null +++ b/tag/python/index.html @@ -0,0 +1,363 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Python +

    +
    + +
    + +
    +

    + + 【Python】72行实现代码行数统计,简单实用! + +

    +
    2022-03-15
    +
    + 0. 前言 +最近突然想知道自己总共写了多少行代码,于是做了这样一个小工具…… +1. 准备工作 +先考虑一下希望得到的效果: + + + +Language(语言) +Lines(代码行数) +Size(代码文件总大小) +Files(代码文件总数) + + + +... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Anaconda Spyder点击无响应解决 + +

    +
    2020-07-12
    +
    + 问题分析 +可能是升级或卸载了spyder依赖的包,导致spyder无法正常运行。 +我升级了PyQt5,spyder要求PyQt5<5.13,而安装的最新版本为5.15,导致spyder启动时出现问题。 +解决方法 +打开Anaconda ... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + pip速度太慢解决(使用清华镜像) + +

    +
    2020-07-12
    +
    + python的包管理工具pip速度太慢,经常下载时报错,可以使用清华镜像代替默认下载源。以下两种方法任何电脑都可以使用,演示电脑为Windows 10 版本1909。 +临时方法 +使用pip下载时,临时使用镜像(命令行): +pip insta... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【python爬虫】从腾讯API爬取美国疫情数据+制表 + +

    +
    2020-06-03
    +
    + 最近(文章撰写时间为2020/6/1 18:40)疫情在中国情况好转,却在美国暴虐。 +本篇文章将爬取腾讯提供的美国疫情数据并制表。 +1. 爬取数据 +调用API接口 +接口:https://api.inews.qq.com/newsqa/v1/... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之lambda函数 + +

    +
    2020-04-21
    +
    + 温馨提示:如果读者没有学过def定义函数,请先看这里 +定义形式 +<函数名> = lambda <参数列表>: <返回值> + +等同于: +def <函数名>(<参数列表>): + ret... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之def定义函数 + +

    +
    2020-04-21
    +
    + 链接 +想研究Python函数?看这里 +函数怎样取名?看这里 +有参数的函数还可以怎么传参?看这里 +一、无参数函数 +结构 +def <函数名>(): # 强制要求 + <函数体> # 可省略 + return <返回值&... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【Python】对象(包括类、函数)取名方法 + +

    +
    2020-04-20
    +
    + 先上干货,通用的: +字母:A-Z a-z +下划线:_ +数字:0-9(注意:数字不能在开头) +理论上可以使用中文变量名,但强烈不建议使用。 +合法名字举例 +abcdef GoodCoder AD_fhrygfuigfr +A_a_007 __NA... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + tkinter Text edit_undo()/edit_redo() 没反应解决方法 + +

    +
    2020-03-24
    +
    + 问题 +tkinter.Text调用edit_undo()和edit_redo()没反应。 +问题分析 +这是因为没有设置Text的undo参数为True,设置后才能“激活”edit_undo()和edit_redo()。 +这个错误难发现是因为它... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之*[参数名]和**[参数名]的用处 + +

    +
    2020-03-03
    +
    + 一、*[参数名] +调用 +合法调用 +普通调用 +*参数名一般写成*args, 如: +def func(*args): + print(args) + +可以试着调用func: +>>> func(1) +(1,) +>>>... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/pywebscraping/index.html b/tag/pywebscraping/index.html new file mode 100644 index 00000000..668d1331 --- /dev/null +++ b/tag/pywebscraping/index.html @@ -0,0 +1,130 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Python爬虫 +

    +
    + +
    + +
    +

    + + 【python爬虫】从腾讯API爬取美国疫情数据+制表 + +

    +
    2020-06-03
    +
    + 最近(文章撰写时间为2020/6/1 18:40)疫情在中国情况好转,却在美国暴虐。 +本篇文章将爬取腾讯提供的美国疫情数据并制表。 +1. 爬取数据 +调用API接口 +接口:https://api.inews.qq.com/newsqa/v1/... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/qt-tutorial/index.html b/tag/qt-tutorial/index.html new file mode 100644 index 00000000..5796b1a2 --- /dev/null +++ b/tag/qt-tutorial/index.html @@ -0,0 +1,135 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + Qt教程 +

    +
    + +
    + +
    +

    + + PyQt6/PySide6:账本项目前端制作【附完整项目地址】 + +

    +
    2022-07-23
    +
    + 0. 前言 +最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。 +屏幕截图: + + + +1. 后端 +后端主要是朋友做的,在这里就不多说了,放个代码: +src/api.py +f... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/syntax/index.html b/tag/syntax/index.html new file mode 100644 index 00000000..fcc6a060 --- /dev/null +++ b/tag/syntax/index.html @@ -0,0 +1,273 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 语法 +

    +
    + +
    + +
    +

    + + Python函数之lambda函数 + +

    +
    2020-04-21
    +
    + 温馨提示:如果读者没有学过def定义函数,请先看这里 +定义形式 +<函数名> = lambda <参数列表>: <返回值> + +等同于: +def <函数名>(<参数列表>): + ret... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之def定义函数 + +

    +
    2020-04-21
    +
    + 链接 +想研究Python函数?看这里 +函数怎样取名?看这里 +有参数的函数还可以怎么传参?看这里 +一、无参数函数 +结构 +def <函数名>(): # 强制要求 + <函数体> # 可省略 + return <返回值&... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【Python】对象(包括类、函数)取名方法 + +

    +
    2020-04-20
    +
    + 先上干货,通用的: +字母:A-Z a-z +下划线:_ +数字:0-9(注意:数字不能在开头) +理论上可以使用中文变量名,但强烈不建议使用。 +合法名字举例 +abcdef GoodCoder AD_fhrygfuigfr +A_a_007 __NA... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Java中的整数移位运算符 + +

    +
    2020-04-04
    +
    + 对于<<, >>两种运算符,可以这样说: +a<<b=a∗2ba<<b=a*2^ba<<b=a∗2b +a>>b=a/2ba>>b=a/2^ba>>... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + java final关键字语法 + +

    +
    2020-04-01
    +
    + 一、final类和方法 +英文文档 +原文:Java官方文档 -> Writing Final Classes and Methods +You can declare some or all of a class's methods fi... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + Python函数之*[参数名]和**[参数名]的用处 + +

    +
    2020-03-03
    +
    + 一、*[参数名] +调用 +合法调用 +普通调用 +*参数名一般写成*args, 如: +def func(*args): + print(args) + +可以试着调用func: +>>> func(1) +(1,) +>>>... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tag/wmp/index.html b/tag/wmp/index.html new file mode 100644 index 00000000..9d32c473 --- /dev/null +++ b/tag/wmp/index.html @@ -0,0 +1,390 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + +
    + + + +
    +

    + + 微信小程序 +

    +
    + +
    + +
    +

    + + 微信小程序报错:Component is not found in path "components/comp/comp.js" + +

    +
    2020-02-05
    +
    + 完整错误 +jsEnginScriptError: +Component is not found in path "components/comp/comp.js" (using by pages/index/index)... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序 云数据库 Collection/Query .orderBy 用法 + +

    +
    2020-02-04
    +
    + Collection.orderBy / Query.orderBy +指定查询排序条件 +方法签名如下: +function orderBy(fieldName: string, order: string): Collection | Que... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 为什么微信小程序设置的onPullDownRefresh无效 + +

    +
    2020-02-04
    +
    + 因为仅有onPullDownRefresh是不行的,需要配置: + +如果是单个页面需要onPullDownRefresh,在对应页面的json文件中设置"enablePullDownRefresh": true,如: + +{... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 微信小程序-云开发-数据库 报错:-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +

    +
    2020-02-03
    +
    + 微信小程序-云开发-数据库 报错: +-501007 invalid parameters | errMsg: Invalid Key Name: _openid + +原因: +不能设置_openid,它是云服务器根据用户的openID自动设置的... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 使用云函数获取小程序用户openId + +

    +
    2020-02-03
    +
    +

    如何使用云函数获取小程序用户openId?步骤如下:

    +
      +
    • +

      如未开通云开发,请看这篇

      +
    • +
    • +

      基础库版本需为2.3.3以上,建议设为最新版本

      +
    • +
    • +

      新建云函数:
      +

      +
    • +
    • +

      右击cloudfunctions,选择新建Node.js云函数

      +
    • +
    • +

      输入login

      +
        +
      • 现在云开发控制台的样子:
        +
      • +
      +
    • +
    • +

      此函数会保存openID至本地存储,并在出错时调用error

      +
    • +
    +
    function saveOpenID(error) {
    +  if (!wx.getStorageSync('openID')) {
    +    wx.cloud.callFunction({
    +      name: 'login',
    +      data: {},
    +      success: res => {
    +        console.log('Got user openid: ', res.result.openid)
    +        wx.setStorageSync('openID', res.result.openid)
    +      },
    +      fail: err => {
    +        console.error(err)
    +        error()
    +      }
    +    })
    +  }
    +}
    +
    + +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 之前的小程序没有使用云开发,现在需要使用云函数怎么办呢? + +

    +
    2020-02-03
    +
    + 前提条件:基础库版本需为2.3.3以上,建议设为最新版本 +如果是升级自己的项目到云开发,需要做以下修改: + + +点击云开发按钮,按钮位置如下: + + + +开通小程序·云开发 + + +将原来的代码放到 miniprogram 目录 + + +新增 cloud... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + wx.showToast中的一个问题 + +

    +
    2020-02-02
    +
    + wx.showToast中的一个问题 +wx.showToast({ + title: '成功', + icon: 'fail', + duration: 2000, + success: func +}) + +wx.showToast({ + title... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 使用微信小程序-云开发时报错: Error: errCode: -401003 api parameter type error | errMsg: parameter.data should ... + +

    +
    2020-02-02
    +
    + 错误 +Uncaught (in promise) thirdScriptError +errCode: -401003 api parameter type error | errMsg: parameter.data should be o... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 在微信小程序中做自己的数字键盘 + +

    +
    2020-01-31
    +
    + 为什么要自制键盘? +我最近在开发一款微信小程序,现在需要用户输入一个数字。 +使用系统键盘带来的不便 +如果使用系统键盘,有以下几个问题: + +数字键太小,不方便; +无法阻止用户输入不合法字符(如:“&”); +小数点在一些手机上很难找到;... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + +
    +
    + + + + diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 00000000..70dbe65f --- /dev/null +++ b/tags/index.html @@ -0,0 +1,249 @@ + + + + + +GoodCoder666的个人博客 + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    + +
    + +
    +

    + + 【算法笔记】位运算详解 + +

    +
    2022-10-18
    +
    + 0. 前言 +突然想到位运算是个好东西,就来水一波文章了…… +注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! +本文中参考代码均使用C++编写。 +废话不多说,... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree + +

    +
    2022-08-20
    +
    + 前言 +树状数组,即树形存储的数组,又称Binary Indexed Tree或Fenwick Tree。 +抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「 树」没什么关系: + +有一个序列A=(A1,A2,…,AN)A=(A_1,A_... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】三种背包问题——背包 DP + +

    +
    2022-08-18
    +
    + 前言 +背包(Knapsack)问题是经典的动态规划问题,也很有实际价值。 +01背包 + +洛谷 P2871 [USACO07DEC] Charm Bracelet S +AtCoder Educational DP Contest D - Kna... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】Kruskal/Prim算法——求解最小生成树问题 + +

    +
    2022-08-15
    +
    + 前言 +生活中经常遇到类似这种的问题: + +公路修建 +有一些城市,城市之间要修建高速公路,每两个城市之间都可以修双向的路。其中每两个城市之间修路都需要花费对应的金额。请问如何修路,使得总花费的金额最少,且任意两个城市之间都可以直接或间接通过修建... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化) + +

    +
    2022-08-13
    +
    + 0. 前言 +Dijkstra算法可在O(mlog⁡m)\mathcal O(m\log m)O(mlogm)或O(mlog⁡n)\mathcal O(m\log n)O(mlogn)的时间内求解无负权单源最短路问题。本文中,我们将详细介绍算... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】多源最短路问题——Floyd算法 + +

    +
    2022-08-12
    +
    + 0. 前言 +在图中,如果要求任意两点间的距离,则可以使用Floyd(O(N3)\mathcal O(N^3)O(N3)😉)和Dijkstra(O(NMlog⁡M)\mathcal O(NM\log M)O(NMlogM)😃)。对于比较小... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + 【算法笔记】树形DP算法总结&详解 + +

    +
    2022-08-12
    +
    + 0. 定义 +树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 +1. 基础 +令f[u]= f[u]=~f[u]= 与树上顶点uuu有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行DP\tex... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解 + +

    +
    2022-08-07
    +
    + A - Full House +题目大意 +来自一个掼蛋爱好者的翻译qwq +给定一副扑克牌中五张牌的编号A,B,C,D,EA,B,C,D,EA,B,C,D,E,判断这五张是否为一组“三带二”。(不懂的自行百度 +数据范围:1≤A,B,C,D,E≤... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + PyQt6/PySide6:账本项目前端制作【附完整项目地址】 + +

    +
    2022-07-23
    +
    + 0. 前言 +最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。 +屏幕截图: + + + +1. 后端 +后端主要是朋友做的,在这里就不多说了,放个代码: +src/api.py +f... +
    + + 阅读更多 + +
    + +
    + +
    + +
    +

    + + AtCoder Beginner Contest 260 A~F 题解 + +

    +
    2022-07-19
    +
    + A - A Unique Letter +题目大意 +给定一个长度为333的字符串SSS。 +输出SSS中出现正好一次的字母(任意,如abc中,三个字母都可为答案)。 +如果没有,输出-1。 +数据保证SSS的长为333,且由小写英文字母组成。 +输入... +
    + + 阅读更多 + +
    + +
    + + +
    + + + + + + +
    +