【学习笔记】[AGC061E] Increment or XOR
看着感觉很吓人 毕竟是
A
G
C
AGC
AGC的
E
E
E题 ,但是其实只要给一点提示这题还是很好着手的。
也仅仅是看着很好着手罢了。
看了一下官方题解,感觉比翻译的清晰多了。
直接讲做法了。数据删除 这道题的状态设计非常巧妙,设
(
k
,
s
,
f
,
m
a
s
k
)
(k,s,f,mask)
(k,s,f,mask)表示一个子问题,包含这样的信息:
1.1
1.1
1.1
k
k
k表示只考虑末尾
k
k
k位,也就是后
k
k
k位的一个截断
1.2
1.2
1.2
s
s
s表示初始状态,其中
s
=
0
s=0
s=0表示初始状态为
S
S
S,
s
=
1
s=1
s=1表示初始状态全为
0
0
0;
t
t
t表示目标状态,其中
t
=
0
t=0
t=0表示目标状态为
T
T
T,并且过程中不产生
k
−
1
→
k
k-1\to k
k−1→k的进位,也就是说进位操作只影响后
k
k
k位;
t
=
1
t=1
t=1表示有且仅发生一次恰好从
k
−
1
→
k
k-1\to k
k−1→k的进位,这句话也隐含了一些信息,我们后面再来说。
1.3
1.3
1.3
m
a
s
k
mask
mask表示每个操作的次数的奇偶性。
定义 c o s t ( k , s , f , m a s k ) cost(k,s,f,mask) cost(k,s,f,mask)表示这个子问题的最小代价。
然后看转移。我们只考虑相邻层的转移,换句话说,我们只需要在让 [ 0 , k − 1 ] [0,k-1] [0,k−1]位匹配的基础上让 k k k位匹配就好了。并且我们还有限制,进位有影响只能发生在 k − 1 → k k-1\to k k−1→k。这个转移刚开始令我非常费解,因为它的思路有一点奇怪:用小规模的问题去强行拼凑出大规模问题的解。
1.1 1.1 1.1 如果没有产生 k − 1 → k k-1\to k k−1→k的进位,那么我们根据 m a s k mask mask就能知道第 k k k位是否匹配,如果匹配那么 c o s t ( k , s , 0 , m a s k ) → c o s t ( k + 1 , s , 0 , m a s k ) cost(k,s,0,mask)\to cost(k+1,s,0,mask) cost(k,s,0,mask)→cost(k+1,s,0,mask)。这里我要多解释一句,比如说 s = 1 s=1 s=1,那么就让 S k ← 0 S_k\gets 0 Sk←0,再比较经过 m a s k mask mask掩码后是否与 T k T_k Tk匹配。
1.2 1.2 1.2 如果产生了 k − 1 → k k-1\to k k−1→k的进位,那么 一定 是经过了形如 ( k , s , 1 , m 0 ) (k,s,1,m_0) (k,s,1,m0), ( k , 1 , 1 , m 1 ) , . . . , ( k , 1 , f , m i ) (k,1,1,m_1),...,(k,1,f,m_i) (k,1,1,m1),...,(k,1,f,mi)的操作序列,最后转移到 ( k + 1 , s , f , ⨁ m i ) (k+1,s,f,\bigoplus m_i) (k+1,s,f,⨁mi)。换句话说,先把 S k ← S k / 0 S_k\gets S_k/0 Sk←Sk/0,然后进行若干次 k − 1 → k k-1\to k k−1→k的进位,但是都只影响了 [ 0 , k ] [0,k] [0,k]位;因为 [ 0 , k − 1 ] [0,k-1] [0,k−1]位已经被还原了,就只要考虑 k k k位最后恰好匹配上即可。注意过程中要检验 k k k位的取值。这里还是要多解释一下,如果 f = 0 f=0 f=0那么限制要宽松一些,就是说最后那一段操作没有进位,就检查最后 k k k位是否匹配就好了;如果 f = 1 f=1 f=1那么最后一个操作是作了 k − 1 → k k-1\to k k−1→k的进位的,这个时候应该保证 k k k位是 1 1 1,才能继续进位,这样和状态才合得上。最后要说的就是除了最后一次操作,过程中每一次 k − 1 → k k-1\to k k−1→k进位的时候都要保证 k k k位是 0 0 0才行。
怎么转移不用我多说吧。直接在图上做就好了,因为边权都是非负的。
但是我们还是没有解释为什么只转移到这
4
4
4个特殊状态是对的。这似乎可以用一句万能的套话来说明:最优解一定包含在内。想了想发现确实如此。算了就当我没证吧。乐
总结一下,这道题还是花费了我相当长的时间,感觉过程中一些处理的细节想了很久才想清楚,总体而言这道题比看起来要棘手一些。
时间复杂度 O ( B 4 n ) O(B4^n) O(B4n)。
代码写起来比较不适。细节贼多,建议写之前把细节想清楚。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17529953.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」