DTOJ4360. 魔法卡片(magic)

题意:

有n张卡片,m个数字,每张卡面正面有其中的一些数字,反面有剩余的数字。有q次询问,每次询问一段区间,可以将这段区间里的任意一些卡片翻转,求翻转后所有正面出现过的数字的平方和的最大值。
n × m ≤ 1000000 , q ≤ 1 e 6 n\times m\le 1000000,q\le 1e6 n×m1000000,q1e6

题解:

对于一段长度较大的区间,难以找到合适的贪心策略,考虑它是否有特殊的性质。直观地感知,一段区间内没有出现过的数应该不会太多,考虑极端情况:只有一张牌就至少出现一半,只有两张就至少四分之三(上取整),这样有 l o g m + 1 logm+1 logm+1张牌就稳了,肯定全部取到(每次取没有出现过的数字较多的那个面),所以对于大于 l o g m logm logm的区间直接输出总和,对于长度不超过 l o g m logm logm的区间,考虑暴力,枚举每个面的方向,暴力统计每个面是否出现过,但这是 O ( N × M × M ) O(N\times M\times M) O(N×M×M)的。考虑对于这些区间,能否将每个数字取满,发现如果一个数不出现,要每次都翻它不在的那个面,只有确定的一种方案,故考虑枚举每个数,使它不在,但这样会有一些数不在的翻转方案是相同的,而可以取满的条件是有剩余的没有被不取满考虑过的翻转方案,而注意到总翻转方案数是 2 l e n 2^{len} 2len,故对于不能满的方案去个重,如果还有剩余就可取满,否则对于相同的方案都减去考虑过的数,最后取最大的方案即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值