ABC050D/ARC066D Xor Sum
题目大意
可表为
①
②
我的思考
考虑
问题转化成
$ 0 \le x < 2^k
二元组
这个问题并不容易,思路至此中断。
参考题解
https://blog.csdn.net/just_sort/article/details/54288233
Key observation
可以给
③
在这三条约束下,可以证明
证明:设
至此问题化为在上述三个约束下,满足
解法一(DP,top-down with memoization)
令
边界条件:
问题:算出
据说状态数在
解法二(DP)
DP 状态
dp[i][ j ][k]:
转移方式
对于状态 dp[i][ j ][k],枚举
dp[i][ j ][0] -- (0, 0) --> dp[i+1][ j ][0]
dp[i][ j ][0] -- (0, 1) --> dp[i+1][2][0]
dp[i][ j ][0] -- (1, 1) --> dp[i+1][ j ][1]
dp[i][ j ][1] -- (0, 0) --> dp[i+1][2][0]
dp[i][ j][1] -- (0, 1) --> dp[i+1][ j][1]
dp[i][ j][1] -- (1, 1) --> dp[i+1][ 2][1]
dp[i][ j][0] -- (0, 0) --> dp[i+1][0][0]
dp[i][ j][0] -- (0, 1) --> dp[i+1][ j][0]
dp[i][ j][0] -- (1, 1) --> dp[i+1][0][1]
dp[i][ j][1] -- (0, 0) --> dp[i+1][ j][0]
dp[i][ j][1] -- (0, 1) --> dp[i+1][0][1]
dp[i][ j][1] -- (1, 1) --> dp[i+1][ j][1]
代码
https://atcoder.jp/contests/abc050/submissions/8191466
DP 状态优化
上述 dp 数组的第二维可以优化。以 j = 0 表示小于等于,j = 1 表示大于;或者以 j = 0 表示小于等于,j = 1 表示不计大小关系(即小于、等于、大于三种情况之和)。 按前一种定义,dp[i][j][k] 的转移方式为
dp[i][ j ][0] -- (0, 0) --> dp[i+1][ j ][0]
dp[i][ j ][0] -- (0, 1) --> dp[i+1][1][0]
dp[i][ j ][0] -- (1, 1) --> dp[i+1][ j ][1]
dp[i][ j ][1] -- (0, 0) --> dp[i+1][1][0]
dp[i][ j][1] -- (0, 1) --> dp[i+1][ j][1]
dp[i][ j][1] -- (1, 1) --> dp[i+1][1][1]
dp[i][ j][0] -- (0, 0) --> dp[i+1][0][0]
dp[i][ j][0] -- (0, 1) --> dp[i+1][ j][0]
dp[i][ j][0] -- (1, 1) --> dp[i+1][0][1]
dp[i][ j][1] -- (0, 0) --> dp[i+1][ j][0]
dp[i][ j][1] -- (0, 1) --> dp[i+1][0][1]
dp[i][ j][1] -- (1, 1) --> dp[i+1][ j][1]
参考代码
https://atcoder.jp/contests/abc050/submissions/8192354
按后一种定义,dp[i][j][k] 的转移方式为
dp[i][ j ][0] -- (0, 0) --> dp[i+1][ j ][0]
dp[i][1][0] -- (0, 1) --> dp[i+1][1][0]
dp[i][ j][0] -- (1, 1) --> dp[i+1][ j ][1]
dp[i][1][1] -- (0, 0) --> dp[i+1][1][0]
dp[i][ j][1] -- (0, 1) --> dp[i+1][ j][1]
dp[i][1][1] -- (1, 1) --> dp[i+1][1][1]
dp[i][1][0] -- (0, 0) --> dp[i+1][0][0]
dp[i][1][0] -- (1, 1) --> dp[i+1][0][1]
dp[i][ j][0] -- (0, 1) --> dp[i+1][ j][0]
dp[i][ j][1] -- (0, 0) --> dp[i+1][ j][0]
dp[i][ j][1] -- (1, 1) --> dp[i+1][ j][1]
dp[i][1][1] -- (0, 1) --> dp[i+1][0][1]
这种状态定义的好处是转移路径少,坏处是状态转移过程容易写错。
另一种 DP
仍按上述思路,下面介绍官方题解给出的 DP 方法。这种方法的复杂度比较清楚,并且其思想可以用于求解更为一般的数位 DP 问题。
DP 状态
dp[i][ j ]:(N >> i) - ((a + b) >> i) == j
)的情况有多少种。
举例言之,N = 10101。a + b = 1(符号 * 表示暂不考虑这些位上的值)属于状态 dp[4][0],1 - 1 = 0;a + b = 0 属于状态 dp[4][1],1 - 0 = 1;a + b = 00*** 属于状态 dp[3][2],10 - 00 = 2;a + b = 10*** 属于状态 dp[3][0],10 - 10 = 0;a + b = 100** 属于状态 dp[2][1],101 - 100 = 1;000** 属于状态 dp[2][5],101 - 000 = 5。
对于状态 dp[i][ j ],注意到当
转移方式
只有 dp[i][0] 和 dp[i][1] 需要转移;看
(1)
dp[i][0] -- (0, 0) --> dp[i - 1][0]
dp[i][1] -- (0, 0) --> dp[i - 1][2]
dp[i][1] -- (0, 1) --> dp[i - 1][1]
dp[i][1] -- (1, 1) --> dp[i - 1][0]
(2)
dp[i][0] -- (0, 0) --> dp[i - 1][1]
dp[i][0] -- (0, 1) --> dp[i - 1][0]
dp[i][1] -- (0, 0) --> dp[i - 1][2]
dp[i][1] -- (0, 1) --> dp[i - 1][2]
dp[i][1] -- (1, 1) --> dp[i - 1][1]
边界条件
由于
复杂度
时间复杂度
代码
https://atcoder.jp/contests/arc066/submissions/8186588
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
2016-10-28 English Snippets
2016-10-28 Ubuntu 使用笔记
2016-10-28 在CentOS上安装Sublime Text