problem1 link

二分答案。然后判断。将所有的机器按照$a_{i}$排序,$a_{i}$相同的按照$b_{i}$排序。用一个优先队列维护这些机器。这样对于第$i$个部分,拿出队列开始的机器来生产该部分;如果队列开头的机器生产的部分没用完,则将其左区间$a_{t}$设置为$a_{t}+1$然后重新塞到队列里。

problem2 link

首先由$A_{i}$得到$A_{i-1}$的方式为$A_{i-1}=((A_{i}+2^{50}-b)$^$a)$&$(2^{50}-1)$。然后就是一个数字一个数字暴力计算$B$值。总的累积复杂度是$O(n)$的。

problem3 link

令$f[i][j]$ 表示$vals[i]*vals[j]$对答案有贡献的概率。

令$dp[i][j][n]$表示$(i,j)$对答案有贡献且序列中总的元素个数为$n$的概率(那么$f[i][j]=dp[i][j][n]$)。考虑整个序列的长度从长度为 $n-1$转移到$n$。那么对于$dp[i][j][n]$来说,可以从下面三种情况转移而来:

(1)$dp[i-1][j-1][n-1]$: 在前面新增一个元素

(2)$dp[i][j-1][n-1]$: 在中间新增一个元素

(3)$dp[i][j][n-1]$: 在后面新增一个元素

code for problem1

#include <algorithm>
#include <queue>
#include <vector> class FleetFunding {
public:
int maxShips(int m, const std::vector<int> &k, const std::vector<int> &a,
const std::vector<int> &b) {
int n = static_cast<int>(k.size());
struct node {
int L, R, cnt; node() = default;
node(int L, int R, int cnt) : L(L), R(R), cnt(cnt) {}
bool operator<(const node &A) const {
if (L != A.L) return L > A.L;
return R > A.R;
}
};
auto Check = [&](int M) {
if (M == 0) {
return true;
}
std::priority_queue<node> Q;
for (int i = 0; i < n; ++i) {
Q.push(node(a[i], b[i], k[i]));
}
for (int i = 1; i <= m; ++i) {
if (Q.empty()) {
return false;
}
int sum = 0;
while (sum < M) {
if (Q.empty() || Q.top().L != i) {
return false;
}
if (sum + Q.top().cnt < M) {
sum += Q.top().cnt;
Q.pop();
} else {
node p = Q.top();
Q.pop();
p.cnt -= M - sum;
++p.L;
if (p.L <= p.R && p.cnt > 0) {
Q.push(p);
}
break;
}
}
while (!Q.empty() && Q.top().L == i) {
node p = Q.top();
Q.pop();
++p.L;
if (p.L <= p.R) {
Q.push(p);
}
}
}
return true;
}; int sum = 0;
for (int i = 0; i < n; ++i) {
sum += k[i];
}
int low = 0, high = sum / m;
int result = 0;
while (low <= high) {
int M = (low + high) >> 1;
if (Check(M)) {
result = std::max(result, M);
low = M + 1;
} else {
high = M - 1;
}
}
return result;
}
};

code for problem2

class LimitedMemorySeries2 {
public:
int getSum(int n, long long x0, long long a, long long b) {
constexpr int kMod = 1000000007;
constexpr long long M = (1ll << 50) - 1; auto NextX = [&](long long x) { return ((x ^ a) + b) & M; }; auto PreX = [&](long long x) { return ((x + M + 1 - b) ^ a) & M; }; auto Cal = [&](int id, long long x, int n) {
int ll = id, rr = id;
int result = 0;
long long lx = x, rx = x;
while (ll - 1 >= 0 && rr + 1 < n) {
lx = PreX(lx);
rx = NextX(rx);
if (lx < x && x > rx) {
++result;
--ll;
++rr;
} else {
break;
}
}
return result;
}; int result = 0;
long long t = x0;
for (int i = 0; i < n; ++i) {
result = (result + Cal(i, t, n)) % kMod;
t = NextX(t);
}
return result;
}
};

code for problem3

#include <vector>

class CoinFlips {
public:
double getExpectation(const std::vector<int> &vals, int prob) {
const double p = prob / 1000000000.0;
int n = static_cast<int>(vals.size());
std::vector<double> p2(n + 1);
p2[0] = 1.0;
for (int i = 1; i <= n; ++i) {
p2[i] = p2[i - 1] * (1 - p);
}
std::vector<std::vector<double>> prefix(n + 1, std::vector<double>(n + 1));
std::vector<std::vector<double>> prefix_sum(n + 1,
std::vector<double>(n + 1));
for (int len = 3; len <= n; ++len) {
for (int i = 1; i <= len; ++i) {
prefix[len][i] = p2[i - 1] * p;
if (i == 1) {
prefix[len][i] += p2[len];
}
prefix_sum[len][i] = prefix_sum[len][i - 1] + prefix[len][i];
}
}
std::vector<std::vector<std::vector<double>>> f(
2, std::vector<std::vector<double>>(n + 1, std::vector<double>(n + 1)));
int pre = 0, cur = 1;
for (int len = 3; len <= n; ++len) {
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= n; ++j) {
f[cur][i][j] = 0;
}
}
for (int L = 1; L <= len; ++L) {
for (int R = L + 2; R <= len; ++R) {
f[cur][L][R] =
prefix_sum[len][L - 1] * f[pre][L - 1][R - 1] +
(prefix_sum[len][R - 1] - prefix_sum[len][L]) * f[pre][L][R - 1] +
(1 - prefix_sum[len][R]) * f[pre][L][R];
if (L + 2 == R) {
f[cur][L][R] += p2[L] * p;
}
}
}
pre ^= 1;
cur ^= 1;
}
double result = 0.0;
for (int i = 0; i < n; ++i) {
for (int j = i + 2; j < n; ++j) {
result += vals[i] * vals[j] * f[pre][i + 1][j + 1];
}
}
return result;
}
};

topcoder srm 681 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. [转-SSRF]什么是SSRF

    这些天专注了解了SSRF攻击(Server-side Request Forgery,服务器端请求伪造),对这类攻击有了自己的一些总结与看法,老外取这个名字是挺不错的,我很喜欢,这让我想到了CSRF( ...

  2. UVA 11178 Morley's Theorem(几何)

    Morley's Theorem [题目链接]Morley's Theorem [题目类型]几何 &题解: 蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传 ...

  3. Lua class

    local _class = {} function class(super) local class_type = {} class_type.ctor = false class_type.sup ...

  4. mysql小脚本

    常用脚本 1)备份数据库 #!/bin/bash#每周一全量备份数据库 #DB1mysqldump -hip eduyun -u用户 -p密码 >eduyun`date +%Y-%m-%d-%H ...

  5. jquery $.ajax $.get $.post的区别?

    $.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...

  6. centos安装java的jdk

    1.下载 jdk-8u101-linux-x64.rpm http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- ...

  7. linux正则

    正则表达式 分两类:  基本正则表达式:BRE  扩展正则表达式:ERE :grep -E, egrep 正则表达式引擎:  采用不同算法,检查处理正则表达式的软件模块       PCRE(Perl ...

  8. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  9. [转] LoadRunner 获取接口请求响应信息

    Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_para ...

  10. Fantasia (点强连通分量建图 + 树形DP)

    简化一下题意,我们先看成一副强连通的图,这时候应该是最简单了,去点任意点都是其他的乘积.那再加强一点难度,改为两个强连通图连接的非强连通图呢?那应该就是找出关键的那个点,并求出两边的乘积.但是一个一个 ...