Guest User

Untitled

a guest
Sep 28th, 2015
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <string>
  6. #include <vector>
  7. #include <stack>
  8. #include <queue>
  9. #include <set>
  10. #include <cstring>
  11. #include <cstdlib>
  12. #include <map>
  13. #define f first
  14. #define s second
  15. #define ll long long
  16. #define ull unsigned long long
  17. #define mp make_pair
  18. #define pb push_back
  19. #define vi vector <int>
  20. #define pii pair<int , int>
  21. using namespace std;
  22. const int N =4005;
  23. const ll inf = (ll)(1e14);
  24. pair <ll,ll> line[N][N];
  25. int n,T;
  26. int f[N],t[N],p[N];
  27. pair <int, pii> a[N];
  28. int sz[N];
  29. ll dp[N];
  30. int k;
  31. double x1,x2;
  32. int lnk[N];
  33.  
  34. void add(int i,pair <ll,ll> p){
  35. k = sz[i];
  36. while(k > 1){
  37. x1 = (line[i][k-1].s - line[i][k].s + 0.0) / (line[i][k].f - line[i][k-1].f);
  38. x2 = (line[i][k].s - p.s + 0.0) / (p.f - line[i][k].f);
  39. if(x1 < x2) break;
  40. if(k == lnk[i]) lnk[i]--;
  41. k--;
  42. }
  43. line[i][++k] = p;
  44. sz[i] = k;
  45. }
  46.  
  47. ll find_max(int i,int x){
  48. if(sz[i] == 0) return -inf;
  49. k = min(lnk[i],sz[i]);
  50. while(k < sz[i]){
  51. if(line[i][k].s - line[i][k+1].s >= x * (line[i][k+1].f - line[i][k].f)) break;
  52. k++;
  53. }
  54. lnk[i] = k;
  55. return line[i][k].f * x + line[i][k].s;
  56.  
  57. }
  58.  
  59. int main () {
  60. scanf("%d%d",&n,&T);
  61. for(int i=1;i<=n;i++){
  62. scanf("%d%d%d",&t[i],&p[i],&f[i]);
  63. a[i] = mp(f[i],mp(t[i],p[i]));
  64. }
  65. sort(a+1,a+n+1);
  66. for(int i=1;i<=n;i++){
  67. f[i] = a[i].f;
  68. t[i] = a[i].s.f;
  69. p[i] = a[i].s.s;
  70. }
  71. for(int i=1;i<=T;i++) lnk[i] = 1;
  72.  
  73. ll res;
  74. ll ans =0;
  75. for(int i=1;i<=n;i++){
  76. if(t[i] > T) continue;
  77. dp[t[i]] = p[i];
  78. for(int j=t[i]+1;j<=T;j++){
  79. res = find_max(j - t[i],f[i]);
  80. if(res == -inf){
  81. dp[j] = -inf;
  82. continue;
  83. }
  84. dp[j] = res + p[i] - f[i] * f[i];
  85. }
  86. for(int j=t[i];j<=T;j++){
  87. ans = max(ans,dp[j]);
  88. if(dp[j] != -inf) add(j, mp(2*f[i],dp[j] - f[i] * f[i]));
  89. }
  90. }
  91. cout << ans;
  92.  
  93.  
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment