题解:P12247 跳舞机
题目分析
考虑 DP。设计状态
现在考虑如何计算
时间复杂度瓶颈在于 multiset 的操作,时间复杂度为
参考代码
#include<iostream>
#include<vector>
#include<set>
#define int long long
using namespace std;
int n,m,k;
int l[(int)5e5+5],r[(int)5e5+5],w[(int)5e5+5];
vector<int> add[(int)5e5+5],del[(int)5e5+5];
multiset<int> s;
int dp[(int)5e5+5];
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>l[i]>>r[i]>>w[i];
for(int i=1;i<=n;i++){
if(l[i]+k-1<=r[i]){
add[l[i]+k-1].push_back(w[i]);
del[r[i]+1].push_back(w[i]);
}
}
for(int i=1;i<=m;i++){
for(int j=0;j<add[i].size();j++) s.insert(add[i][j]);
for(int j=0;j<del[i].size();j++) s.erase(s.find(del[i][j]));
dp[i]=dp[i-1];
if(i>=k&&!s.empty()) dp[i]=max(dp[i],dp[i-k]+*prev(s.end()));
}
cout<<dp[m];
return 0;
}