题面:
  有 N (1≤N≤105)N\ (1\le N\le 10^5) 个村庄, 第 ii 个村庄有一个权值 AiA_i。定义 Bi=A1+A2+.....+AiB_i=A_1+A_2+.....+A_i。保证 BN=0B_N = 0。
  你需要从任意一个村庄出发,然后遍历任意多个村庄,之后回到出发的村庄。
  我们认为你从村庄 ii 到村庄 jj 的收益是 (Ai−Aj)×Bi×Bj2×Ai×Aj\frac{(A_i-A_j)\times B_i\times B_j}{2\times A_i\times A_j}。
  从起点开始的每个点到下一个点的过程中, 如果 BB 值有变化, BB 值必须先变大再变小。
  你想要最大化你的总收益。
题解:
   (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)\frac{(A_i-A_j)\times B_i\times B_j}{2\times A_i\times A_j} = \frac{A_i\times B_i\times B_j}{2\times A_i\times A_j} - \frac{A_j\times B_i\times B_j}{2\times A_i\times A_j} = \frac{B_i\times B_j}{2\times A_j} - \frac{B_i\times B_j}{2\times A_i} = \frac{1}{2} \times (B_i \times \frac{B_j}{A_j} - B_j \times \frac{B_i}{A_i})
   最后式子是个叉积形式,表示两点与原点的三角形的面积,而且条件保证答案是一个简单环,所以对所有点做一遍凸包计算面积即可。

#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[N], t[N];
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[N], 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 贝加尔湖畔baikal相关推荐

  1. codeforces日常训练 C. Cutting Out - 二分搜索答案

    codeforces日常训练 C. Cutting Out - 二分搜索答案 题干 You are given an array s consisting of n integers. You hav ...

  2. 「日常训练」Common Subexpression Elimination(UVa-12219)

    今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...

  3. 「日常训练」 Mike and Fun (CFR305D2B)

    题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...

  4. 动规日常训练题解 难度普及+

    9.6 动规训练  题解 ----Frosty_Jackal 定义Dpmax[i][j] 表示l~r之间最大的得分,由题意得拆环为链,将1~n的枚举范围扩大到1~2*n ,外层枚举区间长,内层枚举l, ...

  5. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  6. 「日常训练」Skills(Codeforce Round #339 Div.2 D)

    题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...

  7. 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)

    题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...

  8. 2018集训队日常训练1

    5385: 树的遍历  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 22       ...

  9. 「日常训练」 Genghis Khan the Conqueror(HDU-4126)

    题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...

最新文章

  1. linux python matplotlib 使用,关于Linux:如何在Python的matplotlib中设置“后端”?
  2. MySQL - order by和 group by 优化初探
  3. 【研究院】浅析小米与它的AI生态
  4. 问题 B: PK吹泡泡(Kruscal)
  5. php存密码,php 登录验证的代码(基于文件保存的密码)
  6. 从位图数据取得位图句柄
  7. python 去掉tab_如何截掉空格(包括tab)
  8. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序
  9. Javascript特效:字体背景跑马灯
  10. 计算机桌面软件图标没了,手把手教你电脑桌面图标都不见了怎么办
  11. java基础回顾之Map中 TreeMap排序原理-二叉树
  12. 计算机上e盘拒绝访问,e盘拒绝访问怎么办,教你win7系统e盘拒绝访问的应对办法...
  13. 线性代数学习笔记——第五十七讲——特征子空间
  14. 一键查询 | 2020年最新SCI期刊影响因子报告
  15. bootstrap+javascript制作体重标准计算器
  16. 前端vscode必备插件推荐(墙裂推荐)
  17. Python 爬取京东商品评论 + 词云展示
  18. 如影智能唐沐:别把智能家居做成极客玩具
  19. PTA 基础编程题目集 7-1 厘米换算英尺英寸
  20. 解决Git执行pull命令时,报错:Please enter a commit message to explain why this merge is necessary...

热门文章

  1. PyQt5-QWidget、QDialog及QMainWindow的区别
  2. Kubernetes实战(一):k8s v1.11.x v1.12.x 高可用安装
  3. PyTorch学习笔记(21) ——损失函数
  4. python自然语言处理-学习笔记(一)之nltk入门
  5. 推广景城网过程中积累的高全中博客资源,和大家分享一下
  6. 数据的黑暗陷阱是什么?——你想要一匹更快的马,还是一辆汽车?
  7. 一个好用的在线PDF压缩工具
  8. 瑞萨RL78簇bootloader深入探讨(一):User工程建立
  9. Delphi打造日常生活支出记账本『罗斌原创』
  10. 第三方支付系统--支付流程