日常训练 20170708 贝加尔湖畔baikal
2017-07-08 16:03
267 查看
题面:
有 N (1≤N≤105) 个村庄, 第 i 个村庄有一个权值 Ai。定义 Bi=A1+A2+.....+Ai。保证 BN=0。
你需要从任意一个村庄出发,然后遍历任意多个村庄,之后回到出发的村庄。
我们认为你从村庄 i 到村庄 j 的收益是 (Ai−Aj)×Bi×Bj2×Ai×Aj。
从起点开始的每个点到下一个点的过程中, 如果 B 值有变化, B 值必须先变大再变小。
你想要最大化你的总收益。
题解:
(Ai−Aj)×Bi×Bj2×Ai×Aj=Ai×Bi×Bj2×Ai×Aj−Aj×Bi×Bj2×Ai×Aj=Bi×Bj2×Aj−Bi×Bj2×Ai=12×(Bi×BjAj−Bj×BiAi)
最后式子是个叉积形式,表示两点与原点的三角形的面积,而且条件保证答案是一个简单环,所以对所有点做一遍凸包计算面积即可。
有 N (1≤N≤105) 个村庄, 第 i 个村庄有一个权值 Ai。定义 Bi=A1+A2+.....+Ai。保证 BN=0。
你需要从任意一个村庄出发,然后遍历任意多个村庄,之后回到出发的村庄。
我们认为你从村庄 i 到村庄 j 的收益是 (Ai−Aj)×Bi×Bj2×Ai×Aj。
从起点开始的每个点到下一个点的过程中, 如果 B 值有变化, B 值必须先变大再变小。
你想要最大化你的总收益。
题解:
(Ai−Aj)×Bi×Bj2×Ai×Aj=Ai×Bi×Bj2×Ai×Aj−Aj×Bi×Bj2×Ai×Aj=Bi×Bj2×Aj−Bi×Bj2×Ai=12×(Bi×BjAj−Bj×BiAi)
最后式子是个叉积形式,表示两点与原点的三角形的面积,而且条件保证答案是一个简单环,所以对所有点做一遍凸包计算面积即可。
#include<bits/stdc++.h> const int N = 1e5 + 10; const double eps = 1e-7; template <typename T> void read(T &x) { x = 0; T f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f *= -1; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } struct rec{double x, y;} a , t ; bool cmp(const rec &a, const rec &b) {return a.x < b.x;}; rec operator - (const rec &a, const rec &b) {return (rec) {a.x - b.x, a.y - b.y};}; double operator * (const rec &a, const rec &b) {return a.x * b.y - a.y * b.x;}; int n, b , cnt; double ans; int main() { freopen("baikal.in", "r", stdin); freopen("baikal.out", "w", stdout); read(n); for (int i = 1; i <= n; i++) read(b[i]); for (int i = 1; i <= n; i++) a[i].x = a[i - 1].x + b[i], a[i].y = a[i].x / b[i]; std::sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; i++) { t[++cnt] = a[i]; while (cnt > 2 && (t[cnt] - t[cnt - 2]) * (t[cnt - 1] - t[cnt - 2]) > -eps) t[cnt - 1] = t[cnt], cnt--; } for (int i = 1; i < cnt; i++) ans += t[i] * t[i + 1]; cnt = 0; for (int i = 1; i <= n; i++) { t[++cnt] = a[i]; while (cnt > 2 && (t[cnt] - t[cnt - 2]) * (t[cnt - 1] - t[cnt - 2]) < eps) t[cnt - 1] = t[cnt], cnt--; } for (int i = cnt; i > 1; i--) ans += t[i] * t[i - 1]; printf("%.5f\n", ans / 2); return 0; }
相关文章推荐
- 日常训练 20170708 假如爱有天意love
- 日常训练 Idiot 的集合
- 日常训练 IQ测试 可持久化数组||链表
- [日常训练] Tree
- 日常训练小结
- 日常训练 平均数
- 日常训练 20170602 Book
- [日常训练] 买汽水
- 周六日常训练,背包dp,树形dp,简单dp以及很多数学?
- [日常训练] tty的方程
- 日常训练 腐女的生日 奥妙重重的最短路
- 日常训练 20170602 Equation
- 日常训练 20170619 被删除量子化粉碎未出生的回文矩阵
- [日常训练] 保存名画
- [日常训练] 单词
- [日常训练] 独立集
- 日常训练 20170603 棋盘
- [日常训练] 距离之和
- [日常训练] 我们爱序列
- [NOIPOI2017]2.6日常训练解题报告