# Codeforces Round #351 (VK Cup 2016 Round 3, Div. 1 Edition) C E （斜率优化. 概率）

Levels and Regions

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
using namespace std;

#define LL long long
#define ULL unsigned long long
#define eps 1e-9
#define N (200000 + 10)
#define M (400000 + 10)
#define pii pair<int,int>
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define mod 1000000007

int a[N];
double s[N];
double t[N], g[N];
double dp[N][60];

struct node {
double x, y;
int id;
node() {}
node(double x, double y, int id) : x(x), y (y) ,id(id){};
}que[N];

bool check(node a, node b, node c) {
return (b.y - a.y) * (c.x - a.x) >= (c.y - a.y) * (b.x - a.x);
}

void insert(double x, double y, int id) {
node tmp = node(x, y, id);
while(cnt > 1 && check(que[cnt-2], que[cnt-1], tmp)) --cnt;
que[cnt++] = tmp;
}

bool judge(node a, node b, double x) {
return b.y - a.y < x * (b.x - a.x);
}

int query(double x) {
}

void debug(int l, int r) {
double ans = g[r] - g[l-1];
for(int i = l; i <= r; ++i)
ans += t[r] * a[i];
printf("l %d r %d ans %.10lf\n", l, r,ans);
}
int main() {
//freopen("in.in", "r", stdin);
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]), s[i] = s[i-1] + a[i];
t[i] = 1.0/a[i] + t[i-1];
g[i] = a[i] * t[i-1] + g[i-1];
}
for(int i = 1; i <= n; ++i)
dp[i][0] = 1e30;
for(int j = 1; j <= k; ++j) {
insert(0, 0, 0);
for(int i = j-1; i < j; ++i)
insert(s[i], dp[i][j-1]+g[i], i);
for(int i = j; i <= n; ++i) {
int k = query(t[i]);
dp[i][j] = dp[k][j-1] + s[i] * t[i] - g[i] - s[k] * t[i] + g[k];
insert(s[i], dp[i][j-1]+g[i], i);
}
}
printf("%.10lf\n", dp[n][k]);
}

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
using namespace std;

#define LL long long
#define ULL unsigned long long
#define eps 1e-9
#define N (500000 + 10)
#define M (400000 + 10)
#define pii pair<int,int>
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define mod 1000000007

double ans[N][66];
int fa[N];
int tot;
const int Max = 50;
int main() {
int n;
scanf("%d", &n);
tot = 1;
ans[0][0] = 0;
for(int i = 1; i<= Max; ++i)
ans[0][i] = 1;
while(n--) {
int op, u;
scanf("%d%d", &op, &u);
--u;
if(op == 2) {
double ret = 0;
for(int i = 1; i <= Max; ++i)
ret += (1 - ans[u][i]);
printf("%.10lf\n", ret);
}
else {
fa[tot] = u;
ans[tot][0] = 0;
for(int i = 1; i <= Max; ++i) ans[tot][i] = 1;
double tmp = 0.5;
double pre = 0, last = 1;;
int v = tot;
for(int i = 1; i <= Max; ++i) {
pre = ans[u][i];
ans[u][i] /= (0.5 * last + 0.5);
ans[u][i] *= (0.5 * ans[v][i-1] + 0.5);
last = pre;
tmp *= 0.5;
if(!u) break;
v = u;
u = fa[u];
}
++tot;
}
}
}

• 本文已收录于以下专栏：

## Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)A+B

A. Gotta Catch Em’ All!time limit per test:1 secondmemory limit per test:256 megabytesinput:standard...
• qq_33183401
• 2017年01月16日 17:12
• 239

## Codeforces Round #254 (Div. 1)C. DZY Loves Colors(线段树经典操作/分块)

• fouzhe
• 2017年02月11日 15:17
• 277

## Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜，还是停留在AB题的水平，有时候CD其实很简单，但就是想不到，别人一眼看出而我就是想不到，有时候想到了点子上但就是突破不了 题目链接：  Codeforc...
• qq_34731703
• 2017年02月03日 12:50
• 486

## Codeforces Round #185 (Div. 1) / 311A The Closest Pair (“陷阱”题)

http://codeforces.com/problemset/problem/311/A If we ignore "break", tot will be up to . ...
• synapse7
• 2014年03月15日 13:15
• 1127

## Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作，都会拿走一个横行，一个竖行。 所以一共会操作min（横行，竖行）次。 #include #include #include #include ...
• rowanhaoa
• 2014年07月25日 14:39
• 1470

## Codeforces Round #185 (Div. 1) E.Biologist 最小割最大流

• Veda_
• 2013年10月23日 15:51
• 638

## 【解题报告】Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)

• TRiddle
• 2017年03月31日 20:03
• 272

## Codeforces Round #292 (Div. 1)

A. Drazil and Factorial 题意： F(x)定义为x各个位阶乘的乘积，给定一个数x要求求出F(x)=F(y)的最大的数y， 其中y的各个位不能包含0和1. 思路： 对于x的各个位，...
• u013654696
• 2015年02月22日 13:35
• 566

## Codeforces Round #445 (Div. 1, based on Technocup 2018 Elimination Round 3) E. Mod Mod Mod

E. Mod Mod Mod time limit per test2 seconds memory limit per test256 megabytes inputstandard inpu...
• zstu_zy
• 2017年12月01日 17:11
• 62

## 【解题报告】Codeforces Round #401 (Div. 2)

• TRiddle
• 2017年02月25日 17:55
• 408

举报原因： 您举报文章：Codeforces Round #351 (VK Cup 2016 Round 3, Div. 1 Edition) C E （斜率优化. 概率） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)