比赛在这里呢

填算符

下发题解说的神马东西,赛时根本想不到

讲一个赛时想得到的 \(O(n\log 值域)\) 的思路,很好理解

我们处理出二进制下每一位上的 1 的最后一次出现的位置,将第 \(i\ (i\in[0,60])\) 位上的 1 最后一次出现的位置记作 \(pos_i\)

同时我们设 \(H=n-k-1\) 为总共有的 bitor 的操作数

有以下结论:由于 \(pos_i\) 是 \(i\) 位上最后一个 1,所以一旦它后面放了一个 与,这一位上就是 0 了;若我们想要这一位为 1,必须至少满足从 \(pos_i\) 到最后的运算符全是 bitor。

发现有以下情况:

  • 若 \(n-pos_i>H\),即 \(pos_i\) 之后需要放的运算符的数量比 bitor 的总操作数多,也就是说在 \(pos_i\) 之后我一定需要放 bitand 操作,所以这种情况下这一位一定不对答案有贡献

  • 若 \(n-pos_i<H\),也就是说我可以从 \(pos_i\) 的前一个位置开始到最后全放 bitor 操作,那么这样第 \(i\) 位上可以是 1,为了使值最大,所以第 \(i\) 位上一定要是 1,所以从第 \(pos_i\) 位到最后必须全是 bitor 操作,对于这种情况的 \(i\) 我们记为合法位

  • 若 \(n-pos_i=H\),也就是说从第 \(pos_i\) 到最后的运算符可以全是 bitor 操作,但 \(pos_i\) 的前一位只能是 bitand

    所以我们特判从第 1 个位置到 \(pos_i\) 的前一位全放 bitand 能不能让到第 \(pos_i\) 个数时得到的值第 $\forall $ \(j 满足 [pos_j=pos_i]\) 位为 1,若能则该位也为合法位,否则不合法

对于所有合法位的 \(pos\) 取最小值设为 \(end\),因为已经保证 \(end\) 到最后的预算符全是 bitor,此时有一下两种可能,而我们想尽量构成第二种可能:

  1. \(end\) 的前一位预算符也为 bitor,这样我们一定能达到答案最大了,想使答案最优直接让从 \(end-2\) 开始的 \(k\) 个运算符为 bitor 就好了

  2. \(end\) 的前一位在某些情况为 bitand 也是可以使答案最大的,所以我们判断能不能让 \(end\) 的前一位为 bitand 同样使答案最大;

    发现可以的条件相当于从第 \(end-1\) 个数到最前面用仅剩的 bitor 操作得到一个答案,使得这个答案第 $\forall $ \(i 满足 [pos_i=end]\) 位为 1,若能满足条件则第 \(end-1\) 个操作符为 bitand。

满足条件的判断又和上述的第三个情况判断一致了,相当于以 \(end-1\) 为下界,再做一次求 \(min(合法的\ pos)\),实质上是不断的递归。

所以一个递归 \(dfs(end, H)\) 表示下界为 \(end\),还剩 \(H\) 个 bitor 操作,判断能不能得到我想要的答案:

若不能则直接从第 \(end-2\) 开始的 \(k-res\) 个运算符全为 bitand 就是答案(\(res\) 为在之前的递归中已经确定的 bitand 的个数)

若能则第 \(end-1\) 个位置可以为 bitand,并设 \(end'=min(这一层中合法的\ pos)\),继续递归 \(dfs(end',H-(end-end'))\) 判断第 \(end'-1\) 个位置能不能为 bitand。

形式化如下:

【填算符】(log 值域的做法)的更多相关文章

  1. 1473. [Ioi2000]Post加强版 n log^2 n做法

    1473. [Ioi2000]Post加强版 n log^2 n做法 题面 有n个城市从负方向向正方向按照1至n标号,\(d[i]\)表示城市i离原点的距离并且\(d[1] = 0\),对于\(i \ ...

  2. POJ 2533 Longest Ordered Subsequence LCS O(n*log(n))

    题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #define SIZE 1001 using namespace ...

  3. 解读Android LOG机制的实现【转】

    转自:http://www.cnblogs.com/hoys/archive/2011/09/30/2196199.html http://armboard.taobao.com/ Android提供 ...

  4. POJ 2533 Longest Ordered Subsequence LIS O(n*log(n))

    题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #include <algorithm> using ...

  5. OI数学汇总

    最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...

  6. [BZOJ]3110 K大数查询(ZJOI2013)

    这大概是唯一一道小C重写了4次的题目. 姿势不对的树套树(Fail) → 分块(Fail) → 整体二分(Succeed) → 树套树(Succeed). 让小C写点心得静静. Description ...

  7. ZJOI2019Day2 游记

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day2 游记 4-23 乘车. 报到. 自闭. 晚上没睡好. 4-24 上午张哲宇讲课. 幕后点人上去讲题. 然 ...

  8. AtCoder Grand Contest 1~10 做题小记

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...

  9. BZOJ2724 [Violet]蒲公英 分块

    题目描述 经典区间众数题目 然而是权限题,所以题目链接放Luogu的 题解 因为太菜所以只会$O(n*\sqrt{n}+n*\sqrt{n}*log(n))$的做法 就是那种要用二分的,并不会clj那 ...

  10. 租酥雨的NOIP2018赛前日记

    租酥雨的NOIP2018赛前日记 离\(\mbox{NOIP2018}\)只剩下不到一个月的时间辣! 想想自己再过一个月就要退役了,觉得有必要把这段时间的一些计划与安排记录下来. 就从国庆收假开始吧. ...

随机推荐

  1. 再升级!MoneyPrinterPlus集成GPT_SoVITS

    最近有很多优秀的语音合成TTS工具,目前MoneyPrinterPlus已经集成了ChatTTS和fasterWhisper.应朋友们的要求,最近MoneyPrinterPlus也集成了GPT_SoV ...

  2. springcloud集成grpc(二)

    码云地址:https://gitee.com/lpxs/lp-springcloud.git 有问题可以多沟通:136358344@qq.com. 上一章内容介绍了springboot2集成net.d ...

  3. SpringBoot 用的 spring-jcl 打印日志,与 LoggingSystem 有鸡毛关系?

    开心一刻 现实中,我有一个异性游戏好友,昨天我心情不好,找她聊天 我:我们两个都好久没有坐下来好好聊天了 她:你不是有女朋友吗 我:人家不需要我这种穷人啊 她:难道我需要吗 前情回顾 从源码分析 Sp ...

  4. 实用接地气的 .NET 微服务框架

    前言 微服务架构已经成为搭建高效.可扩展系统的关键技术之一,然而,现有许多微服务框架往往过于复杂,使得我们普通开发者难以快速上手并体验到微服务带了的便利.为了解决这一问题,于是作者精心打造了一款最接地 ...

  5. 对GEE下载时分块影像进行镶嵌(GDAL)

    前言 GDAL自带的镶嵌功能比较单一,只能将图像简单拼接到一起,不能实现直方图匀色以及羽化等功能,但是对GEE导出的分块影像进行镶嵌较为适合. 优点: 使用代码,镶嵌多个影像较为简便 GDAL较为稳定 ...

  6. Heart Rate Variability - HRV

    一次心跳波形 心率变异性 通常希望HRV 越高越好 HRV 公式: 需要指出的是,心率变异性会有多种计算公式. HRV数值相对越小=当天压力越大/身体越疲劳:HRV数值相对越大=当天压力越小/身体状态 ...

  7. Java 集合工具包

    Java 集合工具包 Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分 ...

  8. 今日算法随笔:填充每个节点的下一个右侧节点指针 II

    题目链接:117. 填充每个节点的下一个右侧节点指针 II 题目描述 给定一个二叉树,填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找不到下一个右侧节点,则将 next 指针设置为 ...

  9. codeforces 1931E

    题目链接 简介:对一些数字,余念安可以反转一个数字,齐夏将两个数字首尾相连变为一个数字.每个人都采取最优策略. 名单上只剩下一个号码.如果该整数不小于  10的m次方 ,则齐夏获胜.否则余念安就赢了. ...

  10. 10款好用的开源 HarmonyOS 工具库

    大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来.废话不多说,马上开整. 1. efTool efT ...