[BZOJ 1492]货币兑换Cash
2016-02-22 19:06
253 查看
维护凸壳
CDQ
CDQ
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define maxn 100010 using namespace std; const double eps = 1e-8; const int inf = 0x7fffffff; struct opt{ double q, a, b, rate, k; int pos; }q[maxn], nq[maxn]; int Filter(double x){ return x > eps ? 1 : (x < -eps ? -1 : 0); } struct Point{ double x, y; bool operator<(const Point& k)const{ return (Filter(x - k.x) < 0) || (Filter(x - k.x) == 0 && Filter(y - k.y) < 0); } }p[maxn], np[maxn]; double f[maxn]; int st[maxn], n, m; #define K getk double K(int i, int j){ if (i == 0) return -inf; if (j == 0) return inf; if (Filter(p[i].x-p[j].x) == 0) return -inf; return (p[i].y - p[j].y) / (p[i].x - p[j].x); } void solve(int l, int r){ if(l == r){ f[l] = max(f[l - 1], f[l]); p[l].x = f[l] / (q[l].a * q[l].rate + q[l].b) * q[l].rate; p[l].y = f[l] / (q[l].a * q[l].rate + q[l].b); return; } int mid = l + r >> 1, l1 = l, l2 = mid + 1; for(int i = l; i <= r; i ++) if(q[i].pos <= mid)nq[l1 ++] = q[i]; else nq[l2 ++] = q[i]; memcpy(q + l, nq + l, sizeof (q[0]) * (r - l + 1)); solve(l, mid); int top = 0; for(int i = l; i <= mid; i ++){ while(top >= 2 && Filter(K(i, st[top]) - K(st[top], st[top - 1])) >= 0) top --; st[++ top] = i; } int j = 1; for(int i = r; i >= mid + 1; i --){ while(j < top && Filter(q[i].k - K(st[j], st[j + 1])) <= 0) j ++; f[q[i].pos] = max(f[q[i].pos], p[st[j]].x * q[i].a + p[st[j]].y * q[i].b); } solve(mid + 1, r); l1 = l, l2 = mid + 1; for(int i = l; i <= r; i ++){ if((p[l1] < p[l2] || l2 > r) && l1 <= mid) np[i] = p[l1 ++]; else np[i] = p[l2 ++]; } memcpy(p + l, np + l, sizeof (p[0]) * (r - l + 1)); } bool cmp(const opt& a, const opt& b){ return a.k < b.k; } int main(){ scanf("%d", &n); scanf("%lf", &f[0]); for(int i = 1; i <= n; i ++){ scanf("%lf%lf%lf", &q[i].a, &q[i].b, &q[i].rate); q[i].k = -q[i].a / q[i].b; q[i].pos = i; } sort(q + 1, q + 1 + n, cmp); solve(1, n); printf("%.3lf\n", f ); return 0; }
相关文章推荐
- c++ 排序算法总结
- Android 启动时间优化 <22>
- HDOJ-1081 To The Max
- iOS蓝牙开发(一)蓝牙相关基础知识
- c++ 排序算法总结
- ps切图(5)——图层原理及其操作
- database export import
- uva 10720 Graph Construction
- dstat系统分析工具的使用
- LeetCode 94. Binary Tree Inorder Traversal
- jQuery和ExtJS的timeOut超时问题和event事件处理问题
- install wine on ubuntu
- 谁有(爱普生R290维修程序)
- 给大一学生:让积累说话
- mySQL相关函数的使用
- UVAOJ 821 Page Hopping(最短路)
- 性能测试(二):性能测试的分析步骤
- jquery的delegate实现原理
- a kind of programming font on linux -- Inconsolata
- 函数名和数组名最大的区别