你现在要把一个由 01
组成的比特串编码为一张
评测方式
你需要提交一个程序。你的程序需要支持三个运行模式 N, A, B
,分别表示输出比特串长度、加密、解密。每次加密或解密时,你的程序都会被重新执行。
首先评测程序会将单个字母 N
作为输入运行你的程序,你需要输出一个正整数
然后,以下过程会被执行若干次:
- 评测程序会运行你的程序,输入两行,第一行是单个字母
A
,第二行是一个长度为 的比特串。你需要输出一张 个顶点的无向图,具体格式见下文。 - 评测程序会打乱这张无向图的点标号和边标号。
- 评测程序会重新运行你的程序,输入若干行,第一行是单个字母
B
,第二行及以后表示一张 个顶点的无向图。你的程序需要输出一个长度为 的比特串,且输出串需要和这一轮最开始输入的串相同。
上述的无向图的格式如下:首先一行一个整数
范例代码与执行过程
例如,假设你写了这样的程序:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n = 1;
string s;
cin >> s;
if (s == "N") {
cout << n << endl;
} else if (s == "A") {
string z;
cin >> z;
if (z == "0") {
cout << 0 << endl;
} else {
cout << 1 << endl;
cout << 1 << ' ' << 2 << endl;
}
} else if (s == "B") {
int e;
cin >> e;
if (e == 0) {
cout << "0" << endl;
} else if (e == 1) {
cout << "1" << endl;
}
}
}
这个程序会把长度为 0
,1
分别加密为空图和只有一条
交互库会先运行该程序,将 N
输入进去,得到长度
A
0
或
A
1
输入该程序,该程序会分别输出
0
或
1
1 2
对于这两种图,评测器会试图将它们点边打乱;当然打乱空图毫无意义。该程序会再次被执行,以下面的内容为输入:
B
0
或
B
1
11 45
或者一些别的什么数字;该程序当然会正确恢复出原来的两个一位比特串。
给分方式
该题目与常见算法竞赛题目有显著不同,因此有奇妙的给分方式。首先,我们鼓励你写保证正确性的算法,因此在这些测试中,解密错误哪怕一次都会有较高的惩罚;其次,你能加密的比特串越长越好。
假设在
其中
是对你的解密犯错的惩罚次数:换言之,你哪怕犯错一次都会让分数下降大约一半。
是对你能加密的比特串的长度的奖励。注意,不要被这个式子的长度给吓到;这是一个单调的函数,这里有几个特殊值可以给你参考:
自测程序
你可以使用这份程序来在本地对你的代码进行测试。
致谢
这道题目归功于 kczno1 同学。感谢 mcfx 同学提供的打爆标程的题解。感谢 UOJ 各位管理员群友帮我按后台的按钮。