#L3650. 「2021 集训队互测」子集匹配
「2021 集训队互测」子集匹配
题目背景
小 P 本来想投个很有意思的改编题,但是它被原题做法直接爆过去了。
小 P 心态非常爆炸,于是他决定投一个简单题送温暖。
题目描述
小 P 学了 Hall 定理,感觉很有意思。
小 P 发现 Hall 定理的一个直接推论是,如果左部点集合 的大小不超过右部点集合 的大小,且左部点度数相等、右部点度数相等,且边集不为空,那么一定存在大小为 的匹配。
小 P 发现 Hall 定理的一个问题是,它只给了存在性而没给构造。
小 P 随机了一道题,想让你帮他做:
给定 ,保证 。设 。设 为所有 的大小为 的子集组成的集合, 为所有 的大小为 的子集组成的集合,并且对于 , 之间有边当且仅当 。请你求出一组大小为 的匹配。
为了减小 IO 所用时间,本题采用交互的形式评测。
请不要尝试 hack 交互库!
实现细节
你必须引用 hall.h
头文件。
你需要实现下面的过程:
int solve(int n, int K, int s);
其中 表示一个 的子集 , 当且仅当 的二进制从低到高的第 位为 。保证 。你需要返回一个非负整数 ,以同样的格式表示集合 ,并满足 。
solve
函数可能被调用多次,请注意变量的初始化。保证每次调用时给出的 都不变,且同一个 只会被询问一次。
评测方式
样例评测库将读入如下格式的输入数据:
一行,两个正整数,表示 。
样例评测库将输出如下格式的输出数据:
设样例评测库调用了 次 solve
函数,那么会输出 行,第 行 形如 s -> t
,其中 是由 组成的长度为 的字符串,表示 solve
函数的参数和返回值,从左到右依次为低位至高位。第 行会输出 OK
或 WA
,表示匹配是否合法。
样例
输入
5 3
输出
00111 -> 00101
01011 -> 00011
01101 -> 01100
01110 -> 01010
10011 -> 10010
10101 -> 10001
10110 -> 00110
11001 -> 01001
11010 -> 11000
11100 -> 10100
OK
数据范围与提示
保证 、 。
- 对于 的数据,保证 。
- 对于 的数据,保证 。
- 对于 的数据,保证 。
- 对于 的数据,保证 。
请注意本题的空间限制。
保证交互库消耗时间不超过 ,消耗空间不超过 (其中包括 #include<bits/stdc++.h>
和 using namespace std;
)。