思路:
dp:
d
p
i
dp_i
dpi 表示第i波怪物来之前至少要准备的子弹数量。
在第i波怪物来之前,最多有k发子弹,在
l
i
,
r
i
l_i,r_i
li,ri期间最多能换
k
(
r
i
−
l
i
)
k ( r_i-l_i)
k(ri−li)的子弹。
我们倒着枚举每波怪兽,第i波至少需要
a
i
a_i
ai子弹,如果第i波怪物和第i+1波怪物连在一起,那么还需要额外的
d
p
i
+
1
dp_{i+1}
dpi+1子弹来使得第i+1波怪物也能全打完。
中间判一下-1的情况。
如果有解的话:
最后在算的时候正着枚举,初始有k发子弹,如果当前子弹数量不够那么肯定要把当前剩余子弹都扔了,然后装弹。然后打出去
a
i
a_i
ai发子弹把第i波怪兽杀完。
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
#define wzh(x) cerr<<#x<<'='<<x<<endl;
int n,k,l[N],r[N],a[N];
LL dp[N];//表示第i波怪物来之前至少要准备dp_i的子弹
int main() {
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>l[i]>>r[i]>>a[i];
for(int i=n;i>=1;i--){
LL need=a[i];
if(r[i]==l[i+1])need+=dp[i+1];
if(1ll*(r[i]-l[i]+1)*k<need)return cout<<-1,0;
dp[i]=max(0ll,need-1ll*(r[i]-l[i])*k);
}
int res=k;
LL ans=0;
for(int i=1;i<=n;i++){
if(res<dp[i]){
ans+=res;
res=k;
}
ans+=a[i];
res=((res-a[i])%k+k)%k;
}
cout<<ans<<'\n';
return 0;
}