| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 
 |  #include<cstdio>
 #include<cstring>
 #include<algorithm>
 #include<iostream>
 #include<queue>
 #include<map>
 #include<stack>
 #include<cmath>
 #include<set>
 #include<bitset>
 #include<assert.h>
 #define inc(i,l,r) for(int i=l;i<=r;i++)
 #define dec(i,l,r) for(int i=l;i>=r;i--)
 #define link(x) for(edge *j=h[x];j;j=j->next)
 #define mem(a) memset(a,0,sizeof(a))
 #define ll long long
 #define eps 1e-8
 #define succ(x) (1<<x)
 #define lowbit(x) (x&(-x))
 #define sqr(x) ((x)*(x))
 #define NM 100005
 #define nm 100005
 #define pi 3.1415926535897931
 using namespace std;
 const ll inf=1e9+9;
 ll read(){
 ll x=0,f=1;char ch=getchar();
 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
 while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
 return f*x;
 }
 
 
 
 
 struct P{
 int id;
 double a,b,k,x,y,slope;
 bool operator<(const P&o)const{return slope>o.slope;}
 }a[NM],tmp[NM],s[NM];
 double d[NM];
 int n,top;
 double slope(P a,P b){if(fabs(a.x-b.x)<eps)return -inf;else return (a.y-b.y)/(a.x-b.x);}
 
 
 void cdq(int l,int r){
 if(l==r){
 d[l]=max(d[l-1],d[l]);
 a[l].y=d[l]/(a[l].a*a[l].k+a[l].b);a[l].x=a[l].y*a[l].k;
 return;
 }
 int mid=l+r>>1,cnt=1;
 for(int i=l,x=l,y=mid+1;i<=r;i++)if(a[i].id<=mid)tmp[x++]=a[i];else tmp[y++]=a[i];
 inc(i,l,r)a[i]=tmp[i];
 cdq(l,mid);
 top=0;
 inc(i,l,mid){
 while(top>1&&slope(s[top-1],s[top])<slope(s[top],a[i]))top--;
 s[++top]=a[i];
 }
 inc(i,mid+1,r){
 while(cnt<top&&slope(s[cnt],s[cnt+1])>a[i].slope)cnt++;
 d[a[i].id]=max(d[a[i].id],s[cnt].x*a[i].a+s[cnt].y*a[i].b);
 }
 cdq(mid+1,r);cnt=l;
 for(int x=l,y=mid+1;x<=mid||y<=r;)if(x<=mid&&(y>r||a[x].x<a[y].x))tmp[cnt++]=a[x++];else tmp[cnt++]=a[y++];
 inc(i,l,r)a[i]=tmp[i];
 }
 
 int main(){
 n=read();d[0]=read();
 inc(i,1,n){scanf("%lf%lf%lf",&a[i].a,&a[i].b,&a[i].k);a[i].id=i;a[i].slope=-a[i].a/a[i].b;}
 sort(a+1,a+1+n);
 cdq(1,n);
 printf("%.3lf\n",d[n]);
 return 0;
 }
 
 |