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

原创 2016年05月30日 20:33:50

Levels and Regions


题意:有n个等级,要分成k组,求游戏结束的最小期望。游戏中对于一组等级ai,通过这个等级的概率为ai/sumi,blablabla。。。。


#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
#pragma comment(linker, "/STACK:102400000,102400000")
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];
int  cnt, head;

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) {
	while(head < cnt-1 && judge(que[head], que[head+1], x)) ++head;
	return que[head].id;
}

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) {
		head = 0,cnt = 0;
		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]);
}


Bear and Destroying Subtrees


题意:有一颗树,每条边被删的概率为0.5, 求一个子树最大深度的期望,一边建树一边询问


#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
#pragma comment(linker, "/STACK:102400000,102400000")
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
  • qq_33183401
  • 2017年01月16日 17:12
  • 239

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

题目链接 C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 mega...
  • fouzhe
  • fouzhe
  • 2017年02月11日 15:17
  • 277

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

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforc...
  • qq_34731703
  • 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
  • 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
  • rowanhaoa
  • 2014年07月25日 14:39
  • 1470

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

题目地址:http://codeforces.com/problemset/problem/311/E 思想上有些近似于最大闭权合图,详细参考《最小割模型在信息学竞赛中的应用》。 建图: 对于...
  • Veda_
  • Veda_
  • 2013年10月23日 15:51
  • 638

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

简略的解题报告。
  • TRiddle
  • 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
  • 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
  • zstu_zy
  • 2017年12月01日 17:11
  • 62

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

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017年02月25日 17:55
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #351 (VK Cup 2016 Round 3, Div. 1 Edition) C E (斜率优化. 概率)
举报原因:
原因补充:

(最多只允许输入30个字)