DTOJ4349. 「十二省联考 2019」异或粽子

8 篇文章 0 订阅
3 篇文章 0 订阅

题意:
有一个长度为n的数列,每次可以取一段区间的异或和,求前k大的取值之和。
n<=5e5,k<=2e5
题解:
考场:显然一段区间的异或和应转化为两个前缀异或和的异或值,于是问题转为给n+1个数,两两之间异或和前k大的和。对于异或和的问题考虑trie树,每次贪心取不同的两边,然后一直没有注意到k和n不是一个数量级别,一直把k当做n*n的级别考虑,就凉了。(甚至暴力的k开的都是long long……)
正解:发现k和n不是一个数量级别,当然要先考虑k了!考虑一个个取当前的最大异或值,为了不重不漏,显然是枚举每个右端点,找前面最大的和它的异或值,但这样找完一个值后要怎么找下一个呢?考虑用优先队列维护动态维护最大值,因为所有右端点和前面的值的异或值就构成了所有可能的值,故对于一个最大值的右端点,取完值后,就找前面和它异或值的次大值,扔进堆里,即堆里的每个元素记下它的右端点。找与前面的数异或的k大值,用可持久化trie树即可。
反思:最近总是死于看题,前两天是题意自己yy错了,然后今天又没有注意到题目的切入口,以后看题要多注意了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值