标签:
8 4 3 2 2 3 2 3 3 3 5 1 1 7
17
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 20100; 7 struct Worker{ 8 int L,S,P; 9 bool operator<(const Worker &rhs) const{ 10 return S < rhs.S; 11 } 12 }a[maxn]; 13 int n,m,L[maxn],R[maxn],dp[110][maxn],q[maxn]; 14 15 int main(){ 16 while(~scanf("%d%d",&n,&m)){ 17 for(int i = 1; i <= m; ++i) 18 scanf("%d%d%d",&a[i].L,&a[i].P,&a[i].S); 19 sort(a + 1, a + m + 1); 20 for(int i = 1; i <= m; ++i){ 21 L[i] = max(0,a[i].S - a[i].L); 22 R[i] = min(n,a[i].S + a[i].L - 1); 23 } 24 for(int i = 1; i <= m; ++i){ 25 for(int j = 0; j <= R[i]; ++j) 26 dp[i][j] = dp[i-1][j]; 27 int hd = 0,tl = 0; 28 for(int j = L[i]; j < a[i].S; ++j){ 29 while(hd < tl && dp[i-1][j] - j*a[i].P >= dp[i-1][q[tl-1]] - q[tl-1]*a[i].P) --tl; 30 q[tl++] = j; 31 } 32 for(int j = a[i].S; j <= R[i]; ++j){ 33 while(hd < tl && j - q[hd] > a[i].L) ++hd; 34 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 35 dp[i][j] = max(dp[i][j],dp[i-1][q[hd]] + (j - q[hd])*a[i].P); 36 } 37 for(int j = R[i] + 1; j <= n; ++j) 38 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 39 } 40 int ret = 0; 41 for(int i = 1; i <= n; ++i) 42 ret = max(ret,dp[m][i]); 43 printf("%d\n",ret); 44 } 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4812744.html