P4570 [BJWC2011]元素 题解

这道题的解法:贪心+线性基。

没有学过线性基?我的学习笔记传送门

由于线性基有一个优秀的性质:无论一个序列的线性基怎么变,其线性基内数的个数都是相同的,关键是看你怎么排列数的顺序,那么我们可以贪心。

考虑将所有石头按照魔力值从大到小排序,然后直接做线性基,能插入的数就加上其魔力值。

对于正确性证明:如果你对于线性基上面这个性质学过证明的话,这个是真的非常好证明的(甚至不用证)。


这里简要证明一下:

假设我们现在有一组线性基 d 1 , d 2 , . . . , d k d_1,d_2,...,d_k d1,d2,...,dk,现在要插入 x x x,而 x x x 插入失败。

这说明 d a 1 ⊕ d a 2 ⊕ . . . ⊕ d a j = x d_{a_1} \oplus d_{a_2} \oplus ... \oplus d_{a_j}=x da1da2...daj=x

根据异或的性质: x ⊕ d a 1 ⊕ . . . ⊕ d a j − 1 = d a j x \oplus d_{a_1} \oplus ... \oplus d_{a_{j-1}}=d_{a_j} xda1...daj1=daj

那么实际上你调整这些数的插入顺序是没有问题的。

证毕。


Code:GitHub CodeBase-of-Plozia P4570 [BJWC2011]元素.cpp

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值