loj#6515. 贪玩蓝月(线段树分治+01背包)

博客探讨了一种使用线段树分治和01背包解决双端队列操作问题的算法。题目要求在特定取模范围内找到最大战斗力组合,博主首先尝试01背包方法,随后通过线段树优化,将每个元素视为对多个区间的修改操作。最终,博主发现正确解法可能涉及额外的输入读取细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组 ( w i , v i ) (w_i,v_i) (wi,vi),支持询问从当前队列中选取若干个元素是的他们的和对 M O D MOD MOD 取模后余数在 [ l , r ] [l,r] [l,r]中,使得这些装备的战斗力之和最大。


思路:直接看询问貌似可以用 01 01 01背包。
然后由于这个双端队列只能在队首和队尾弹入弹出,那么考虑按时间线段树分治,这样每个元素都相当于一次占据 l o g log log个区间的修改操作。
于是我们先把所有修改操作下放,然后按照线段树的顺序来进行 01 01 01背包即可。

注:在博主经过尝试无法ac之后通过翻阅其他A题神犇的代码之后发现他们在最开始多输入了一个数,貌似加了这个无关紧要的read才能过(雾
代码:

#include<bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
#define ri register int
using namespace std;
inline int read(){
   
	int ans=0;
	char ch=getchar()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值