#YDSP2024SF. 二色莲花蝶
二色莲花蝶
题目描述
给一张 个点的随机无向完全图 , 的每条边被染上了黑色或者白色。
给定两个 到 的排列 ,保证不存在 使得 且 或 且 (此处且的优先级比或高)。如下构造无向图 :
- 初始 。
- 对于每个 ,将 上的边 染黑。
- 对于每个 ,将 上的边 染白。
现在,对于 中的每个正整数 ,求一条 上的哈密顿路使得其上恰有 条黑边。保证有解。
输入格式
第一行一个正整数 。
第二行 个正整数描述排列 。
第三行 个正整数描述排列 。
无向图 由如下 C++ 代码生成:
// col[u][v] 表示无向边 (u, v) 的颜色:0 表示白色,1 表示黑色
auto popcount = [&](unsigned x)
{
int ans = 0;
while (x){++ans; x &= x-1;}
return ans;
};
auto X = [&](unsigned x)
{
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
return x;
};
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++) col[i][j] = popcount(X(i) ^ X(j)) & 1;
输出格式
行,每行 个正整数,第 行按顺序描述你对于 构造的路径上的点。如果有多种可能解答,输出任意一个即可。
样例组
输入样例
5
1 2 3 4 5
1 3 5 2 4
输出样例
1 3 4 2 5
4 5 2 3 1
5 3 2 1 4
4 3 2 1 5
数据范围
共 20 个测试点,对于第 个测试点,,所有测试点均为 5 分。保证不存在 使得 且 或 且 。
对于某个测试点,如果你答对了 的 对应的路径,你就可以获得 的分数。注意,如果你不知道某个 所对应的路径,你也至少应该在那一行输出 个 到 之间的整数。
选手可以在下发文件获取一份 SPJ 来在本地测试输出正确性(checker、testlib)。使用方法:
- 首先将
testlib.h
和checker.cpp
置于同一目录下,然后编译checker.cpp
得到可执行文件checker.exe
(Windows)或checker
(Linux)。 - 如果输入文件是
<input-file>
、你的输出文件是<output-file>
、答案文件是<answer-file>
(在本题中只需要在这个位置放一个空文件),在命令行运行:
观察输出结果即可获得checker.exe <input-file> <output-file> <answer-file> (Windows) ./checker <input-file> <output-file> <answer-file> (Linux)
<output-file>
输出文件的得分。
具体也可以参考 OI Wiki 上的对应页面。