[省选联考 2024] 魔法手杖
一年之后再看好歹是会双log做法的84分的,虽然可能被卡常
首先显然有
对于一个最优的方案
所以我们只会将会影响
考虑二分答案
则因为
而那么在满足
则可以得到存在合法方案的充要条件是:
考虑将
转化对象,以
感觉如果有
这样就得到了
优化?
其实还是对应了
感觉还是容易的,得到了
然后我们需要一个后缀 min
,可以实现
考虑Trie的实现细节
其实是看
所以我们需要维护一个子树内
-
,则取
相当于继续递归左子树,而左子树可以直接加上右子树的 了取
相当于继续递归右子树,而右子树可以直接加上左子树的 了。 -
,则取
相当于继续递归右子树,左子树已经解决取
相当于继续递归左子树,右子树已经解决
所以可以子树内维护当前位置
我们不妨设一个
也就是当前划分到的集合
枚举当前
ll sol(int p,int dep,ll mid,ll now,ll mna,int sumb){
if(sumb>m)return 0;
if(dep<0)return mid;
ll res=0;
//mid=1,now=1,递归左子树,算上右子树b
//mid+=pw[d],now+=pw[d]
int lc=ch[p][0],rc=ch[p][1];
ll lmna=min(ma[rc],mna),rmna=min(ma[lc],mna);
if(pw[dep]+now+pw[dep]-1+lmna>=mid+pw[dep]){
res=max(res,sol(lc,dep-1,mid+pw[dep],now+pw[dep],lmna,sumb+sb[rc]));
}
//mid=1,now=0,递归右子树,算上左子树b
if(now+pw[dep]-1+rmna>=mid+pw[dep]){
res=max(res,sol(rc,dep-1,mid+pw[dep],now,rmna,sumb+sb[lc]));
}
if(res>0)return res;
//mid=0,now=1,递归右子树,左子树无贡献,mna无需更新
if(pw[dep]-1+pw[dep]+now+mna>=mid){
res=max(res,sol(rc,dep-1,mid,now+pw[dep],mna,sumb));
}
if(pw[dep]-1+now+mna>=mid){
res=max(res,sol(lc,dep-1,mid,now,mna,sumb));
}
return res;
}
然后优先
这贪心是真NB
这个题涉及到了很多技巧:
- 贪心将不会影响答案的东西移走,使最优方案更容易满足边界条件
- 整体与单体的视角转化,
从枚举 单体——整体计算变成对于每个 的单体整体统计贡献,有时候正难则反。 - 限制条件的解决形式,如
不用再计算单 贡献时考虑边界,而是在贡献完之后整体照边界 - 位运算题目,二分答案往往可以被按位贪心讨论简化掉。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!