Acwing 298. 围栏:单调队列优化
作者:
b507jiang
,
2021-06-14 15:17:38
,
所有人可见
,
阅读 302
#include <bits/stdc++.h>
using namespace std;
const int N=16100,M=110;
struct Worker{
int l,p,s;
bool operator<(const Worker &a){
return s<a.s;
}
} wkr[M];
int n,m,dp[M][N],q[N];
int get(int i,int k){
return dp[i-1][k]-k*wkr[i].p;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>wkr[i].l>>wkr[i].p>>wkr[i].s;
sort(wkr+1,wkr+1+m);
for(int i=1;i<=m;i++){
int hh=0,tt=0;
Worker &w=wkr[i];
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];
if(j)dp[i][j]=max(dp[i][j],dp[i][j-1]);
if(hh<tt && q[hh]<j-w.l)hh++;
if(j>=w.s && hh<tt)
dp[i][j]=max(dp[i][j],dp[i-1][q[hh]]+(j-q[hh])*w.p);
if(j<w.s){ //q[]中的值不能包含w.s,否则就刷不到w.s
while(hh<tt && get(i,q[tt-1])<=get(i,j))tt--;
q[tt++]=j;
}
}
}
cout<<dp[m][n];
return 0;
}