agc060 B - Unique XOR Path
题意:
在 矩阵中,从左上角走到右下角,每一步只能向下或向右的路径用一个长为 的只含 两种字母的字符串 表示。给定整数 和串 ,问能否构造这样一个矩阵,矩阵的每个元素为 中的整数,且 是从左上角走到右下角的唯一一条异或和为 的路径
思路:
定义:若一个集合的元素都为 间的整数,且其任一子集的异或和都不为 ,则该集合称为 “d好集”;元素最多的k好集称为 “最大d好集”
发现1.1:最大d好集的子集的异或和取遍
解释:假设最大d好集 没有任何子集的异或和为某数 ,则 也是d好集,则 不是最大d好集
发现1.2:最大d好集 的不同子集 的异或和不同
解释:假设 的异或和相等,则 的异或和为 ,则 不是最大d好集
发现1.3:最大d好集的大小为
解释:由发现2.1和发现2.2,并注意到大小为 的集合有 个非空子集
发现2:只需考虑题中路径 上的数全为 的情况
解释:若存在某符合题意的矩阵 ,则对于路径 上的每个数 ,令 所在对角线(左下-右上对角线)上的每个数异或上 ,即 。这样处理以后所有路径的异或和不变,且路径 上的每个数全为
发现4:合法矩阵中不同正数的个数大于等于 “拐角数”
解释:记不相交拐角数为 。考虑一个拐角RD,即下图中的路径
显然要求 ,且所有这种 必须两两不同。进一步地, 的取值集合 是一个d好集。理想情况下 应是一个最大k好集,可取
注意!形如RDR的路径只计一个拐角,因为在下图中
可以等于 。因此拐角数为 中不相交的LR和RL子串的个数
发现5:存在一种构造方案,不同正数恰有拐角数个
解释:给每个拐角处的 位置赋值 。若不相交拐角数大于 则没有答案。
矩阵被路径 分成两侧(即两个连通块)。对每个上述 ,把与 同侧且在 所属左下-右上的对角线上的位置全赋成
(也可以不仅赋单侧,即把 所属对角线上的全部位置赋成 )
两个例子:
void sol() {
int n, m, k; string s;
cin >> n >> m >> k >> s;
for(int i = 0; i + 1 < s.length(); i++)
if(s[i] != s[i + 1]) k--, i++;
cout << (k < 0 ? "No\n" : "Yes\n");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-01-03 cf1010 D. Mars rover(树)