[CTSC2018] 混合果汁
先考虑如何处理单个询问,看到了最大值最小,不难想到二分
普通二分怎么做呢?设当前二分值为
那么怎么将普通二分转换成整体二分呢?对于整体二分,肯定是先设solve(int lval,int rval,int st,int ed)
表示对于属于
整体二分的话,这里就不能像之前那样子将果汁分成两部分了,因为每次check都需要用到整个果汁序列的,只能将小朋友分成两个部分;然而为了减少时间复杂度,我们假设在刚进入函数solve(int lval,int rval,int st,int ed)
(表示对于属于solve(mid+1,rval,st+lt,ed)
之前要还原树状数组(注意进入solve(lval,mid,st,st+lt-1)
不用还原)
具体可以见代码
这道题目就告诉我们不一定非要将序列分成两部分,有可能是会用到整个序列的,这个时候在必要时还原就好了
update 2024.9.23
重新做一遍,做出来了
其实关键就是在二分的时候不能将果汁分成两部分,但我们也没有办法在搜索树的每一个节点都存储整个序列(这样复杂度会爆炸),所以我们只能假设在进入某一个节点的时候有一个性质,在回溯的时候又有一个性质。这里的话我们就假设在进入一个节点solve(int lval,int rval,int st,int ed)
的时候,我们已经存储了大于solve(lval,mid,st,st+lt-1)
之前就不要还原了,但是进入节点solve(mid+1,rval,st+lt,ed)
之前就需要还原。回溯的时候我们再假设我们原封不动地将树状数组还给父亲就好了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构