qbxt 4220: 矿泉水
一行人,共有
个人,排成一排,在等待你发放矿泉水。
你会发放轮矿泉水,第 次,你会给前 个人发放矿泉水,然后你会发放 瓶矿泉水。
具体的,你每次会一瓶一瓶的发矿泉水,每一轮发放次。
每次,你会把矿泉水给最需要的人,即前个人中,当前拥有的矿泉水最少的人,如果有多个人拥有数量相同,你会发给编号靠前的人。
最终,你想知道每个人获得的矿泉水数量。
首先,我们看答案是单调不降的,因此我们可以线段树
从来没做过在线段树某个前缀
LL k;
int search(int x, int p = 1){
int l = tr[ p ].l, r = tr[ p ].r;
if(r <= x && (LL)tr[ p ].maxs * (x - l + 1) - tr[ p ].sum <= k){
k += tr[ p ].sum;
return l;
}
if(l == r) return r + 1;
PushDown(p); int mid = l + r >> 1;
if(x <= mid) return search(x, ls);
int rt = search(x, rs);
if(rt == mid + 1) return search(x, ls);
return rt;
}
大致就是判断右边如果能放就放右边,否则放左边
最终复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?