From 685fa056e0591fbf2e3da79314f7a4e340e5b42f Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Mon, 9 Feb 2026 16:52:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?docs:=20=E4=BF=AE=E6=AD=A3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=AD=E7=9A=84=E9=87=8D=E5=A4=8D=E7=94=A8=E8=AF=8D?= =?UTF-8?q?=E2=80=9C=E6=B2=A1=E6=9C=89=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/manual/luogu/problem/remote-judge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/luogu/problem/remote-judge.md b/docs/manual/luogu/problem/remote-judge.md index 6e940c5..9a38a89 100644 --- a/docs/manual/luogu/problem/remote-judge.md +++ b/docs/manual/luogu/problem/remote-judge.md @@ -32,7 +32,7 @@ Q:Codeforces 为什么不能提交测评/什么时候能修好/可不可以只爬取题目? -A:截至目前,Codeforces 使用了 Cloudflare 进行**全站**防护,导致洛谷测评机无法成功爬取题目/提交测评/绑定账号,详见[此帖子](https://www.luogu.com.cn/discuss/598533)。**暂时没有没有成本合理且稳定的解决方案**。 +A:截至目前,Codeforces 使用了 Cloudflare 进行**全站**防护,导致洛谷测评机无法成功爬取题目/提交测评/绑定账号,详见[此帖子](https://www.luogu.com.cn/discuss/598533)。**暂时没有成本合理且稳定的解决方案**。 Q:测评记录一直在 Judging? From e140a470b63ab93e54a0ee3c3a5f94f5587c6aad Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Mon, 9 Feb 2026 16:54:18 +0800 Subject: [PATCH 2/6] =?UTF-8?q?docs:=20=E5=AE=8C=E5=96=84=E6=B4=9B?= =?UTF-8?q?=E8=B0=B7=20Special=20Judge=20=E5=8A=9F=E8=83=BD=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重写文档以提升可读性和实用性,将内容结构化为基础教程、常用案例和测试方法。更新了 Testlib 的使用说明,补充了多个实际代码示例,包括浮点数比较、Yes/No 判断和 Case #%d 格式解析。统一了术语表述,使指南更清晰易懂。 --- docs/manual/luogu/problem/special-judge.md | 278 +++++++++++++++------ 1 file changed, 205 insertions(+), 73 deletions(-) diff --git a/docs/manual/luogu/problem/special-judge.md b/docs/manual/luogu/problem/special-judge.md index cbaa279..d5904bf 100644 --- a/docs/manual/luogu/problem/special-judge.md +++ b/docs/manual/luogu/problem/special-judge.md @@ -1,149 +1,281 @@ # Special Judge 功能说明 -当一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被 Special Judge。 +当一道题目的答案不唯一,即存在多组符合要求的解时,必须使用 Special Judge(以下简称 SPJ)进行评测。 -Special Judge 程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回. +SPJ 程序会根据输入数据以及其他相关信息来判定选手程序的输出是否正确,并返回评测结果。 -洛谷的 SPJ 采用了跟 Codeforces 一样的 SPJ 标准,即 Testlib 库。 +洛谷采用的 SPJ 标准与 Codeforces 一致,均基于 Testlib 库。 下载地址: [https://github.com/MikeMirzayanov/testlib/releases/download/0.9.41/testlib-0.9.41.zip](https://github.com/MikeMirzayanov/testlib/releases/download/0.9.41/testlib-0.9.41.zip) -Testlib 库 0.9.41 版 引入了一些重大变更,具体见:[https://github.com/MikeMirzayanov/testlib/releases/tag/0.9.41](https://github.com/MikeMirzayanov/testlib/releases/tag/0.9.41) - -Checker 的编译参数为:`g++ -fno-asm -std=c++14 -O2`,即已经开启 C++14 以及 O2 优化。 +在洛谷上,SPJ 的编译参数为:`g++ -fno-asm -std=c++14 -O2`,即已经开启 C++14 以及 O2 优化。 ## 使用方法 -只能使用 C++。不过写 spj 就跟写别的题目一样,只是输入输出有所不同。首先新建文件 checker.cpp。然后将这个压缩包的里的所有内容解压到你的 checker.cpp 相同的文件夹。 +### 基础教程 + +SPJ 仅支持使用 C++ 编写。其编写方式与普通题目类似,主要区别在于输入输出的处理。首先创建文件 `checker.cpp`,并将上述压缩包中的所有内容解压至与该文件相同的目录下。 -这里给出一个例子,当标准输出和选手输出的差小于 0.01,那么可以 AC,否则 WA。 +以下为一个简单示例:若选手答案和标准答案输出的差值小于 $0.01$,则判定为通过(AC),否则判定为错误(WA)。 ```cpp #include "testlib.h" int main(int argc, char* argv[]) { - registerTestlibCmd(argc, argv); - double pans = ouf.readDouble(); - double jans = ans.readDouble(); + setName("compares two doubles"); + registerTestlibCmd(argc, argv); // 初始化 checker,必须在最前面调用一次。 + double pans = ouf.readDouble(); // 从选手输出读取一个 double 类型变量 + double jans = ans.readDouble(); // 从标准答案读取一个 double 类型变量 - if (fabs(pans - jans)<0.01) + if (fabs(pans - jans) < 0.01) // 如果差值小于 0.01,返回答案正确 quitf(_ok, "The answer is correct."); - else + else // 否则返回答案错误 quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans); } ``` -在程序中,有 3 个重要的结构体:inf 指数据输入文件(本例没有),ouf 指选手输出文件,ans 指标准答案。 +在 Testlib checker 中,不使用 cin/cout 来读写判题数据,而是使用三条输入流(由评测系统提供): -然后,可以从这 3 表结构体读入数据,不需要用到标准输入输出。如果读到的数据和下面的期望不一致,则 spj 返回 fail 结果。 +- `inf`:测试输入文件(题目输入数据),在上例中未使用; +- `ans`:标准答案文件(参考输出/最优值/一组可行解等,不一定唯一); +- `ouf`:选手输出文件(你要判定的对象); -这边继续给出一个多行(不定行数)的 spj 判断: +Checker 的职责通常是验证 ouf 是否满足题意(例如:选手的输出是否是一组合法的可行解)。 -```cpp -#include "testlib.h" +在 testlib.h 中,有四种常见的答案判定: +- `_ok`:通过本题; +- `_wa`:答案错误; +- `_pe`:格式错误(洛谷目前不支持此类评测结果); +- `_fail`:checker 自身异常,**不要用它表示选手答案错误**; -int main(int argc, char* argv[]) { - registerTestlibCmd(argc, argv); +对于 checker,有以下的常用指令,可以用于读入测试数据: - while(!ans.eof()){ - double pans = ouf.readDouble(); - double jans = ans.readDouble(); - ans.readEoln(); +- `void registerTestlibCmd(argc, argv)`:初始化 checker,必须在最前面调用一次。 +- `char readChar()`:读入一个 char,指针后移一位。 +- `char readChar(char c)`:和上面一样,但是只能读到一个字母 c。 +- `char readSpace()`:同 readChar(' ')。 +- `string readToken()`:读入一个字符串,但是遇到空格、换行、eof 为止。 +- `long long readLong()`:读入一个 long long。 +- `long long readLong(long long L, long long R)`:同上,但是限定只能读入 $[L, R]$ 范围的整数。$L,R$ 必须是 long long 类型的变量。 +- `int readInt()`:读入一个 int。 +- `int readInt(int L, int R)`:同上,但是限定只能读入 $[L, R]$ 范围的整数。 +- `double readReal()`:读入一个实数。 +- `double readReal(double L, double R)`:同上,但是限定只能读入 $[L, R]$ 范围的实数。 +- `double readStrictReal(double L, double R, int minPrecision, int maxPrecision)`:读入一个限定范围精度位数的实数。 +- `string readString()`、`string readLine()`:碰撞一行 string,到换行或者 eof 为止。 +- `void readEoln()`:读入一个换行符。 +- `void readEof()`:读入一个 eof。 +- `void skipBlanks()`:跳过空白字符,跳到下一个非空白字符。如果需要对输入格式做严格的换行校验,但是不在意输出行末空格的话,务必先使用 `skipBlanks` 再 `readEoln`,否则对用户输出格式的要求可能将过于苛刻。 +- `bool seekEof()`:跳过空白字符后,返回是否读到了 eof。 - if (fabs(pans - jans)>0.01) - quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans); +当读入完毕测试数据后,即可和其他正常程序一样,通过编写 C++ 代码,对选手的输出进行校验,最后需要返回评测结果,类似于 printf 的使用方式: - } - quitf(_ok, "The answer is correct."); - return 0; +- `quitf(_ok, "The answer is correct. answer is %d", ans);`:返回 AC。 +- `quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans);`:返回 WA。 +- `quitp(0.5,"Partially Correct get %d percent", 50);`:给出 50% 的部分分。 -} -``` +testlib.h 要求程序必须以 quitf 或者 quitp 结束,不允许没有返回评测结果的情况。 -以下读入命令可以使用: +### 常用案例 -`void registerTestlibCmd(argc, argv)` +接下来,提供 testlib.h 官方提供的若干个案例,它们可以用于你进一步了解 testlib.h 的使用,也可以直接用于试题中。 -初始化 checker,必须在最前面调用一次。 +#### 浮点数比较 -`char readChar()` +该文件可以用于任意数量的浮点数判断。该程序用于判断两个浮点数的绝对误差或者相对误差是否小于 $\epsilon$。换句话说,如果你的程序输出 $a$ 而正确值为 $b$,当满足以下条件时答案被接受: -读入一个 char,指针后移一位。 +$$ +\frac{|a - b|}{\max(1, b)} \le \epsilon +$$ -`char readChar(char c)` +```cpp +#include "testlib.h" -和上面一样,但是只能读到一个字母 c +using namespace std; -`char readSpace()` +const double EPS = 1E-6; -同 readChar(' '). +int main(int argc, char *argv[]) { + setName("compare two sequences of doubles, max absolute or relative error = %.7f", EPS); + registerTestlibCmd(argc, argv); -`string readToken()` + int n = 0; + double j = 0, p = 0; + + while (!ans.seekEof()) { + n++; + j = ans.readDouble(); + p = ouf.readDouble(); + if (!doubleCompare(j, p, EPS)) { + quitf(_wa, "%d%s numbers differ - expected: '%.7f', found: '%.7f', error = '%.7f'", + n, englishEnding(n).c_str(), j, p, doubleDelta(j, p)); + } + } -读入一个字符串,但是遇到空格、换行、eof 为止、 + if (n == 1) + quitf(_ok, "found '%.7f', expected '%.7f', error '%.7f'", p, j, doubleDelta(j, p)); -`long long readLong()` + quitf(_ok, "%d numbers", n); +} +``` -读入一个 longlong/int64 +需要指出,通常推荐使用 testlib.h 自带的 `doubleCompare` 函数进行浮点数比较,而非自己随意实现。`doubleCompare` 传参分别是标准答案、用户答案和容许的相对误差,返回 true 表示用户答案在误差范围内,返回 false 表示用户答案超过误差范围。 -`long long readLong(long long L, long long R)` +#### 判断 Yes/No -同上,但是限定范围(包括 L,R) +该文件可以用于任意数量的 Yes 和 No 判断,且大小写不敏感。例如:如果标准答案是 Yes,那么选手答案是 YEs 也视作正确。 -`int readInt()` +```cpp +#include "testlib.h" +#include -读入一个 int +using namespace std; -`int readInt(int L, int R)`, +const string YES = "YES"; +const string NO = "NO"; -同上,但是限定范围(包括 L,R) +int main(int argc, char *argv[]) { + setName("%s", ("multiple " + YES + "/" + NO + " (case insensitive)").c_str()); + registerTestlibCmd(argc, argv); -`double readReal()` + int index = 0, yesCount = 0, noCount = 0; + string pa; + while (!ans.seekEof() && !ouf.seekEof()) { + index++; + string ja = upperCase(ans.readToken()); + pa = upperCase(ouf.readToken()); + + if (ja != YES && ja != NO) + quitf(_fail, "%s or %s expected in answer, but %s found [%d%s token]", + YES.c_str(), NO.c_str(), compress(ja).c_str(), index, englishEnding(index).c_str()); + + if (pa == YES) + yesCount++; + else if (pa == NO) + noCount++; + else + quitf(_pe, "%s or %s expected, but %s found [%d%s token]", + YES.c_str(), NO.c_str(), compress(pa).c_str(), index, englishEnding(index).c_str()); + + if (ja != pa) + quitf(_wa, "expected %s, found %s [%d%s token]", + compress(ja).c_str(), compress(pa).c_str(), index, englishEnding(index).c_str()); + } -读入一个实数 + int extraInAnsCount = 0; + while (!ans.seekEof()) { + ans.readToken(); + extraInAnsCount++; + } -`double readReal(double L, double R)`, + int extraInOufCount = 0; + while (!ouf.seekEof()) { + ouf.readToken(); + extraInOufCount++; + } -同上,但是限定范围(包括 L,R) + if (extraInAnsCount > 0) + quitf(_wa, "Answer contains longer sequence [length = %d], but output contains %d elements", + index + extraInAnsCount, index); -`double readStrictReal(double L, double R, int minPrecision, int maxPrecision)`, + if (extraInOufCount > 0) + quitf(_wa, "Output contains longer sequence [length = %d], but answer contains %d elements", + index + extraInOufCount, index); -读入一个限定范围精度位数的实数。 + if (index == 0) + quitf(_ok, "Empty output"); + else if (index == 1) + quitf(_ok, "%s", pa.c_str()); + else + quitf(_ok, "%d token(s): yes count is %d, no count is %d", index, yesCount, noCount); -`string readString()`, + quitf(_fail, "Impossible case"); +} +``` -`string readLine()` +#### 针对 Case #%d: 的解析: -碰撞一行 string,到换行或者 eof 为止 +部分 ICPC 试题以及 Google CodeJam 试题会使用形如: + +``` +Case #1: 2 +Case #2: 4 +Case #3: 0 +``` -`void readEoln()` +的形式输出答案。对于此类情形,testlib.h 提供了一个官方的解析模板,可以在此基础上增加需要自定义校验的内容: -读入一个换行符 +```cpp +/** + * Checker to compare output and answer in the form: + * + * Case #1: + * Case #2: + * ... + * Case #n: + * + */ -`void readEof()` +#include "testlib.h" +#include +#include -读入一个 eof +using namespace std; -`int eof()` +vector readStream(InStream &in) { + vector result; -读完数据后,就可以开始 spj 了。选手程序能用的功能,spj 一样能用。在洛谷中,spj 照样受到时间空间限制。而且不能标准输入输出。 + for (int testCase = 1; !in.seekEof(); testCase++) { + string caseStr = in.readToken(); + if (caseStr != "Case") + in.quitf(_pe, "Expected 'Case' but found '%s' [test case %d]", compress(caseStr).c_str(), testCase); -最后就是输出啦。输出跟 printf 有点像。 + string numExpStr = "#" + to_string(testCase) + ":"; + string numStr = in.readToken(); + if (numExpStr != numStr) + in.quitf(_pe, "Expected '%s' but found '%s' [test case %d]", compress(numExpStr).c_str(), + compress(numStr).c_str(), testCase); -`quitf(_ok, "The answer is correct. answer is %d", ans);` + result.push_back(in.readLong()); // 如果一行内有多个整数,可以编辑这里。 + } -给出 AC + return result; +} -`quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans);` +int main(int argc, char *argv[]) { + setName("Single int64 checker with testcase-support"); + registerTestlibCmd(argc, argv); -给出 WA + vector ja = readStream(ans); + vector pa = readStream(ouf); + + for (unsigned int i = 0; i < min(ja.size(), pa.size()); i++) + if (ja[i] != pa[i]) + quitf(_wa, "Expected %s found %s [test case %d]", vtos(ja[i]).c_str(), vtos(pa[i]).c_str(), i + 1); + + if (ja.size() != pa.size()) + quitf(_pe, "Expected %u test case(s) but found %u", (unsigned int) (ja.size()), (unsigned int) (pa.size())); + + string message = format("%u case(s):", (unsigned int) (ja.size())); + if (ja.size() <= 5) { + for (auto elem: ja) + message += " " + vtos(elem); + } else { + for (int i = 0; i < 3; i++) + message += " " + vtos(ja[i]); + message += " ..."; + for (int i = 0; i < 2; i++) + message += " " + vtos(ja[ja.size() - 2 + i]); + } -`quitp(0.5,"Partially Correct get %d percent", 50);` + quitf(_ok, "%s", message.c_str()); +} +``` -给出 PC(Partially Correct),并且可以获得该点 50% 的分数 +可以在这个案例中发现,为了便于处理 `ans` 流和 `ouf` 流,可以编写一个通用的函数。事实上,`ans`、`ouf` 和 `inf` 都是 `InStream` 类型的对象,因此它们可以共享相同的读取处理方法。`readStream` 函数接受的是一个 `InStream` 类型的引用。由于 `InStream` 是一个通用的输入流类,`ans` 和 `ouf` 都可以作为参数传递给该函数,执行相同的读取操作。当需要编写较复杂的处理逻辑时,可以通过这一点优化代码编写。 ## 测试 @@ -168,7 +300,7 @@ checker.exe in.txt out.txt ans.txt (Windows) ::: -然后,就没有然后了。 +由于在线评测时需要编译 checker.cpp 并且执行比较,评测带有 Special Judge 的试题会慢于正常试题。 ## Codeforces 赛制 From 63026a94f2dcd33fcd2f62448442a8f6c12f6793 Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Mon, 9 Feb 2026 17:18:40 +0800 Subject: [PATCH 3/6] =?UTF-8?q?docs(luogu):=20=E9=87=8D=E6=9E=84=E5=AE=9E?= =?UTF-8?q?=E4=BA=BA=E8=AE=A4=E8=AF=81=E6=96=87=E6=A1=A3=E5=B9=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BE=A7=E8=BE=B9=E6=A0=8F=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将实人认证的详细说明从奖项认证文档中提取出来,创建独立的文档文件。调整相关文档的侧边栏排序以反映新的结构。这提高了文档的模块化程度,避免了重复内容,使认证流程的说明更加清晰。 --- .../manual/luogu/account/award-certify-cpc.md | 29 ++-------------- docs/manual/luogu/account/award-certify-oi.md | 21 ++---------- docs/manual/luogu/account/elo-ranking.md | 2 +- docs/manual/luogu/account/id-verify.md | 33 +++++++++++++++++++ 4 files changed, 40 insertions(+), 45 deletions(-) create mode 100644 docs/manual/luogu/account/id-verify.md diff --git a/docs/manual/luogu/account/award-certify-cpc.md b/docs/manual/luogu/account/award-certify-cpc.md index a41b67e..f82b293 100644 --- a/docs/manual/luogu/account/award-certify-cpc.md +++ b/docs/manual/luogu/account/award-certify-cpc.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 sidebar_label: 奖项认证(ICPC/CCPC) --- @@ -33,37 +33,14 @@ sidebar_label: 奖项认证(ICPC/CCPC) 目前我们已尽最大努力收集数据,但部分场次仍可能存在缺失或数据错误的问题,如您愿意贡献早期区域赛队伍成员名单(即**带队伍成员**的获奖名单或参赛手册)或向现有数据提出反馈,欢迎发送邮件至 `panda$luogu.com.cn`(`$`换成`@`) 向我们提供或补全相关数据,同时我们也会在未来支持个人认证。 -## 认证方式 - -奖项认证分为 2 个步骤,实人认证和奖项认证。 - -:::caution - -同一人的实人认证和奖项认证信息只能绑定在同一个洛谷账号上,且不接受奖项迁移申请。 - -::: - -### 实人认证 {#id-verify} +## 认证方式 {#award-certify} :::caution -- 洛谷将通过第三方提供的人脸核验服务来核实用户提供的**姓名、18 位居民身份证(或港澳台居民居住证)号码**与申请者是否一致。 -- 未持有以上证件请直接[人工认证](award-certify-oi.md#manual-certify)。 -- 实人认证仅确认用户的真实身份,是进行奖项认证的前置条件。 -- 即使您已有奖项认证,在追加新的奖项认证前,也需要先完成实人认证。 -- 一旦认证通过认证,绑定的实人信息无法自主更改。**请务必**使用自己的身份信息进行认证,如有错误请立即联系管理员处理。 +认证奖项前,需要先完成[实人认证](id-verify.md)。 ::: -具体流程为: - -1. 进入[用户设置-安全设置](https://www.luogu.com.cn/user/setting/security),找到实人认证设置项,点击【开始认证】。 -2. 输入真实姓名和身份证号码(或港澳台居民居住证号码),点击提交。 -3. 使用手机扫描页面上显示的二维码,根据页面提示完成人脸识别操作。(可使用系统自带浏览器、微信、支付宝) -4. 认证通过后将自动返回安全设置页。 - -### 奖项认证 {#award-certify} - #### 首次认证 1. 实人认证完成后,进入[用户设置-奖项认证](https://www.luogu.com.cn/user/setting/prize),点击【奖项认证】。 diff --git a/docs/manual/luogu/account/award-certify-oi.md b/docs/manual/luogu/account/award-certify-oi.md index 4d0a67a..26ee9c2 100644 --- a/docs/manual/luogu/account/award-certify-oi.md +++ b/docs/manual/luogu/account/award-certify-oi.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 sidebar_label: 奖项认证(OI) slug: award-certify --- @@ -48,28 +48,13 @@ OI 系列比赛积分计算参考 [CCF 评价标准](https://www.noi.cn/xw/2019- ### 认证方式 1: 自动认证 {#auto-certify} -奖项认证分为 2 个步骤,实人认证和奖项认证。 - -#### 实人认证 {#id-verify} - :::caution -- 洛谷将通过第三方提供的人脸核验服务来核实用户提供的**姓名、18 位居民身份证(或港澳台居民居住证)号码**与申请者是否一致。 -- 未持有以上证件请直接[人工认证](#manual-certify)。 -- 实人认证仅确认用户的真实身份,是进行奖项认证的前置条件。 -- 即使您已有奖项认证,在追加新的奖项认证前,也需要先完成实人认证。 -- 一旦认证通过认证,绑定的实人信息无法自主更改。**请务必**使用自己的身份信息进行认证,如有错误请立即联系管理员处理。 +认证奖项前,需要先完成[实人认证](id-verify.md)。 ::: -具体流程为: - -1. 进入[用户设置-安全设置](https://www.luogu.com.cn/user/setting/security),找到实人认证设置项,点击【开始认证】。 -2. 输入真实姓名和身份证号码(或港澳台居民居住证号码),点击提交。 -3. 使用手机扫描页面上显示的二维码,根据页面提示完成人脸识别操作。(可使用系统相机、浏览器、微信、支付宝等能扫描二维码的应用。) -4. 认证通过后将自动返回安全设置页。 - -#### 奖项认证 {#award-certify} +认证流程: 1. 实人认证完成后,进入[用户设置-奖项认证](https://www.luogu.com.cn/user/setting/prize),点击【奖项认证】。 2. 选择认证类型。 diff --git a/docs/manual/luogu/account/elo-ranking.md b/docs/manual/luogu/account/elo-ranking.md index a58f6d4..03d23e7 100644 --- a/docs/manual/luogu/account/elo-ranking.md +++ b/docs/manual/luogu/account/elo-ranking.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 sidebar_label: 洛谷比赛等级分 --- diff --git a/docs/manual/luogu/account/id-verify.md b/docs/manual/luogu/account/id-verify.md new file mode 100644 index 0000000..beeca92 --- /dev/null +++ b/docs/manual/luogu/account/id-verify.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 3 +sidebar_label: 实人认证 +--- + +# 实人认证 + +:::caution + +- 洛谷将通过第三方提供的人脸核验服务来核实用户提供的**姓名、18 位居民身份证(或港澳台居民居住证)号码**与申请者是否一致。 +- 未持有以上证件请直接[人工认证](#manual-certify)。 +- 实人认证仅确认用户的真实身份,是进行奖项认证的前置条件。 +- 即使您已有奖项认证,在追加新的奖项认证前,也需要先完成实人认证。 +- 一旦认证通过认证,绑定的实人信息无法自主更改。**请务必**使用自己的身份信息进行认证,如有错误请立即联系管理员处理。 + +::: + +具体流程为: + +1. 进入[用户设置-安全设置](https://www.luogu.com.cn/user/setting/security),找到实人认证设置项,点击【开始认证】。 +2. 输入真实姓名和身份证号码(或港澳台居民居住证号码),点击提交。 +3. 使用手机扫描页面上显示的二维码,根据页面提示完成人脸识别操作。(可使用系统相机、浏览器、微信、支付宝等能扫描二维码的应用。) +4. 认证通过后将自动返回安全设置页。 + +## 人工认证 {#manual-certify} + +对于无法完成自动实人认证的用户,可以在工单系统提交工单认证。 + +具体受理的情形为: + +- 其他证件类型:未持有 18 位居民身份证(或港澳台居民居住证)号码。 +- 认证信息迁移:用户的实人认证与奖项认证分布在不同账号。 +- 认证信息错误:账号的实人认证信息非本人。 From 916a3697ac8ceed1c67ae855f244884004ad16b3 Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Tue, 10 Feb 2026 12:14:14 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=96=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=BF=85=E8=AF=BB=E9=93=BE=E6=8E=A5=E7=9A=84=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新链接以指向正确的讨论帖子地址,避免用户访问无效页面 --- src/pages/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/index.md b/src/pages/index.md index e67d6f3..a383162 100644 --- a/src/pages/index.md +++ b/src/pages/index.md @@ -12,7 +12,7 @@ hide_table_of_contents: true 此网站为洛谷网([https://www.luogu.com.cn](https://www.luogu.com.cn))、洛谷网校([https://class.luogu.com.cn](https://class.luogu.com.cn))的帮助中心。 -对于洛谷新用户,请先阅读[洛谷新用户必读](https://www.luogu.com.cn/sadmin/discuss/post/241461)后再查阅帮助中心。 +对于洛谷新用户,请先阅读[洛谷新用户必读](https://www.luogu.com.cn/discuss/241461)后再查阅帮助中心。 本帮助中心分为以下几个板块: From 7a3653c0e26e28d3e40e7f30b74844e304f4bda9 Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Tue, 10 Feb 2026 12:56:23 +0800 Subject: [PATCH 5/6] =?UTF-8?q?docs(luogu):=20=E6=9B=B4=E6=96=B0=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E8=AE=BE=E7=BD=AE=E4=B8=8E=E5=AE=9E=E4=BA=BA=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在账户设置页面添加“安全手机”说明,明确仅支持中国境内手机号绑定 - 在实人认证页面详细说明认证流程、材料要求与注意事项 - 更新账户常见问题,补充实名认证要求说明 - 调整文档结构,将“人工认证”流程独立说明 --- docs/manual/luogu/account/id-verify.md | 32 ++++++++++++++++++++++---- docs/manual/luogu/account/index.md | 1 + docs/manual/luogu/account/setting.md | 8 ++++++- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/docs/manual/luogu/account/id-verify.md b/docs/manual/luogu/account/id-verify.md index beeca92..c2185c7 100644 --- a/docs/manual/luogu/account/id-verify.md +++ b/docs/manual/luogu/account/id-verify.md @@ -5,17 +5,26 @@ sidebar_label: 实人认证 # 实人认证 +完成实人认证后您可以访问需要实名认证(绑定手机号)的功能。 + +请**务必**确认实人认证绑定的账号是你的**常用账号**。 + +请**务必**使用自己的实名信息进行认证,不要使用父母的实名信息。 + +实人认证是进行奖项认证的前置条件。奖项认证将直接使用账户的实人认证信息。 + :::caution - 洛谷将通过第三方提供的人脸核验服务来核实用户提供的**姓名、18 位居民身份证(或港澳台居民居住证)号码**与申请者是否一致。 - 未持有以上证件请直接[人工认证](#manual-certify)。 -- 实人认证仅确认用户的真实身份,是进行奖项认证的前置条件。 - 即使您已有奖项认证,在追加新的奖项认证前,也需要先完成实人认证。 - 一旦认证通过认证,绑定的实人信息无法自主更改。**请务必**使用自己的身份信息进行认证,如有错误请立即联系管理员处理。 - + ::: -具体流程为: +## 自助认证 + +如持有 18 位居民身份证(或港澳台居民居住证)号码,请按照以下步骤进行自助认证。 1. 进入[用户设置-安全设置](https://www.luogu.com.cn/user/setting/security),找到实人认证设置项,点击【开始认证】。 2. 输入真实姓名和身份证号码(或港澳台居民居住证号码),点击提交。 @@ -29,5 +38,20 @@ sidebar_label: 实人认证 具体受理的情形为: - 其他证件类型:未持有 18 位居民身份证(或港澳台居民居住证)号码。 -- 认证信息迁移:用户的实人认证与奖项认证分布在不同账号。 - 认证信息错误:账号的实人认证信息非本人。 +- 认证信息迁移:用户的实人认证与奖项认证分布在不同账号。 + +材料要求: + +**无法自助实人认证(或重新认证),请提供:** + +- 本人身份证件:身份证(含港澳台居民居住证)个人信息页、户口本个人信息页、港澳台居民来往大陆通行证、护照个人信息页。 +- 本人手持该证件的照片。 +- 以上两张照片都需要(强烈建议参考下方示例加上水印)。 +- 对于证件上的名称是外文的,请同时确认获奖记录与获奖记录上的名字是否一致。如不一致请提供相应的证明材料。 + +**申请迁移认证信息,请提供:** + +- 将实人认证信息迁移到奖项认证所在账号。无需提供其他材料。 +- 其他的实人认证由所在账号迁出的申请,需写明迁出原因。 +- 其他复杂情景,请提供详细的说明。由管理员判断是否需要其他补充材料。 diff --git a/docs/manual/luogu/account/index.md b/docs/manual/luogu/account/index.md index ec59921..9b2e9c4 100644 --- a/docs/manual/luogu/account/index.md +++ b/docs/manual/luogu/account/index.md @@ -9,6 +9,7 @@ sidebar_position: 3 ## 账号常见问题 {#common-questions} - 注册:[注册](https://www.luogu.com.cn/auth/register)时你需要提供一个合法邮箱或手机号。对于使用临时邮箱/手机号注册的账号,洛谷有权在不提前通知用户的情况下永久封禁该账号。 +- 实名认证要求:洛谷的一部分社区功能要求用户进行实名认证(即绑定手机号或完成实人认证),才能使用。 - 修改密码/安全邮箱/安全手机,设置两步验证,实人认证:请前往[用户设置-安全设置](https://www.luogu.com.cn/user/setting/security)点击对应按钮进行修改。(绑定手机号或完成实人认证即可完成实名认证) - 使用微信/GitHub 账号登录:若要使用微信或 GitHub 账号登录,需要先在[用户设置-个人信息](https://www.luogu.com.cn/user/setting)中绑定微信或 GitHub 账号。 - 忘记密码/解绑两步验证码:当你忘记密码时,请在登录界面点击“忘记密码”,输入注册时使用的邮箱或手机号,即可重设密码并解绑两步验证码。如果你忘记了邮箱或手机号或者现有邮箱或手机号不再使用,可以向[管理员申诉](/contact-us#email)。 diff --git a/docs/manual/luogu/account/setting.md b/docs/manual/luogu/account/setting.md index 3315b63..6972915 100644 --- a/docs/manual/luogu/account/setting.md +++ b/docs/manual/luogu/account/setting.md @@ -29,9 +29,15 @@ sidebar_label: 个人设置 可以修改自己的用户名。每 365 天可以修改一次。 +### 安全手机 + +目前仅支持绑定中国境内手机号,一旦绑定只能换绑其他手机号,无法解绑。 + +洛谷的社区功能要求用户进行实名认证,如果未持有中国境内手机号,可实人认证(支持使用护照人工认证)解锁相关功能。 + ### 实人认证 -实人认证后才可进行奖项认证。 +实人认证后才可进行奖项认证。请务必使用自己的信息进行实人认证。具体流程请参考[实人认证](./id-Verify.md)。 ### 两步验证 From bdd7c0097e79672ce36cfeb4d06a28515e8b4b5d Mon Sep 17 00:00:00 2001 From: hh0592821 Date: Tue, 10 Feb 2026 13:58:11 +0800 Subject: [PATCH 6/6] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E6=96=87=E6=A1=A3=E7=9A=84=E7=BB=93=E6=9E=84=E4=B8=8E?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在账户首页添加“洛谷用户信任等级体系”章节 - 调整“私信”和“通知”章节至页面末尾以优化阅读顺序 - 将“实人认证”页面的列表项标题格式化为 Markdown 标题 - 修正“个人设置”页面中指向其他文档的链接格式,移除多余的 './' 前缀 --- docs/manual/luogu/account/id-verify.md | 6 +++--- docs/manual/luogu/account/index.md | 24 ++++++++++++++++-------- docs/manual/luogu/account/setting.md | 4 ++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/manual/luogu/account/id-verify.md b/docs/manual/luogu/account/id-verify.md index c2185c7..7c4ee52 100644 --- a/docs/manual/luogu/account/id-verify.md +++ b/docs/manual/luogu/account/id-verify.md @@ -35,13 +35,13 @@ sidebar_label: 实人认证 对于无法完成自动实人认证的用户,可以在工单系统提交工单认证。 -具体受理的情形为: +### 具体受理的情形 - 其他证件类型:未持有 18 位居民身份证(或港澳台居民居住证)号码。 - 认证信息错误:账号的实人认证信息非本人。 -- 认证信息迁移:用户的实人认证与奖项认证分布在不同账号。 +- 认证信息迁移:用户的实人认证的迁移申请。 -材料要求: +### 材料要求 **无法自助实人认证(或重新认证),请提供:** diff --git a/docs/manual/luogu/account/index.md b/docs/manual/luogu/account/index.md index 9b2e9c4..329303f 100644 --- a/docs/manual/luogu/account/index.md +++ b/docs/manual/luogu/account/index.md @@ -18,6 +18,14 @@ sidebar_position: 3 - 注销账户:若要注销账户,详见[注销账户](./deletion.md)。 - 为什么被提示“您已被禁言或非受信任的用户,无法回复”:请参考[为什么被提示“您已被禁言或非受信任的用户,无法回复”](#cannot-reply)。 +## 洛谷用户权限体系 {#user-permissions} + +洛谷对于用户的功能使用权限由一系列规则确定。可大概分为以下几个等级: + +1.仅绑定邮箱:可以使用网站的基本功能,可登录后查看题目、提交代码进行评测、查看讨论等。基本满足训练学习需求。 +2.绑定手机号或完成实人认证:可以使用需要实名认证的功能如发布讨论、回复讨论、提交题解/文章、提交部分工单等。 +3.成为受信任的用户:满足任意一个条件,即已认证的奖项不少于一个,或比赛等级分不低于 1000,或用户名颜色为橙名及以上。可获得更高的用户权限,可在学术版发帖回复、回复题目对应讨论版帖子、举报其他用户等。 + ## 动态等级与用户名颜色 动态等级是根据用户在一段时间内的刷题、社区活跃、打卡、题解、违规情况,按照一定算法得出的结果,该算法不公开。动态等级比较准确的表现了用户一段时间内在洛谷的综合行为。动态等级由 -1 到 4,用户名的颜色为分别对应为棕色、灰色、蓝色、绿色、橙色、红色。管理员的用户名颜色为紫色,不受动态等级影响。 @@ -37,14 +45,6 @@ sidebar_position: 3 动态等级影响洛谷内很多权限,例如创建比赛、团队、提交冷却时间、图床、下载数据等。灰名会有较多的限制。 -## 私信 - -用户可以通过私信对其他用户留言,私信的内容不会被别人看到。用户可以在设置中设定接受或者不接受特定人群的私信。 - -## 通知 - -系统的通知将会出现在通知里面。包括:其他用户的@、题解审核结果、题目审核结果、举报审核结果、升级通知和其他的通知。 - ## 为什么被提示“您已被禁言或非受信任的用户,无法回复” {#cannot-reply} 收到此提示意味着您当前无法进行回复操作,通常是因为以下两种情况之一: @@ -67,3 +67,11 @@ sidebar_position: 3 2. **比赛等级分**:不低于 1000 分。 3. **用户等级**:用户名颜色为**橙名**及以上(通过持续刷题和参加比赛提升活跃度)。 - **建议**:如果您暂时未达标,建议先专注于提升自己的做题数量和比赛成绩,达成上述任一条件后即自动解锁相应权限。 + +## 私信 + +用户可以通过私信对其他用户留言,私信的内容不会被别人看到。用户可以在设置中设定接受或者不接受特定人群的私信。 + +## 通知 + +系统的通知将会出现在通知里面。包括:其他用户的@、题解审核结果、题目审核结果、举报审核结果、升级通知和其他的通知。 diff --git a/docs/manual/luogu/account/setting.md b/docs/manual/luogu/account/setting.md index 6972915..b7bab90 100644 --- a/docs/manual/luogu/account/setting.md +++ b/docs/manual/luogu/account/setting.md @@ -21,7 +21,7 @@ sidebar_label: 个人设置 认证后的用户可以在个人中心中显示自己曾经获得的奖项,用户名旁边根据奖项显示已认证标记(OI 系列的钩子和 ICPC/CCPC 系列的气球),增加社区活动的学术可信度。 -进行奖项认证的方法可以参照[奖项认证(OI)](./award-certify-oi.md)和[奖项认证(ICPC/CCPC)](./award-certify-cpc.md)。 +进行奖项认证的方法可以参照[奖项认证(OI)](award-certify-oi.md)和[奖项认证(ICPC/CCPC)](award-certify-cpc.md)。 ## 安全设置 @@ -37,7 +37,7 @@ sidebar_label: 个人设置 ### 实人认证 -实人认证后才可进行奖项认证。请务必使用自己的信息进行实人认证。具体流程请参考[实人认证](./id-Verify.md)。 +实人认证后才可进行奖项认证。请务必使用自己的信息进行实人认证。具体流程请参考[实人认证](id-verify.md)。 ### 两步验证