题解 P1654 【OSU!】】的更多相关文章

P1654 OSU! 题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有\(n\)次操作,每次操作只有成功与失败之分,成功对应\(1\),失败对应\(0\),\(n\)次操作对应为\(1\)个长度为\(n\)的\(01\)串.在这个串中连续的 \(X\) 个 \(1\) 可以贡献 \(X^3\) 的分数,这\(x\)个\(1\)不能被其他连续的\(1\)所包含(也就是极长的一串\(1\),具体见样例解释) 现在给出\(n\),以及每个操作的成…
题面 一序列\(a\), 对于每一个\(i\)均有\(a_i\)有\(p_i\)的几率为1, 否则为\(0\) 求: \(a\)中极长全\(1\)子序列长度三次方之和的期望 前置知识 基本期望(期望的概念总得会吧... 脑子 解法 可以设\(f(x)\)表示 操作是否成功序列 (以下简称序列\(a\))前\(x\)位以\(x\)结尾极长全\(1\)子序列长度的期望, \(g(x)\)表示\(a\)前\(x\)位以\(x\)结尾极长全\(1\)子序列长度平方的期望, \(r(x)\)表示\(a\)…
\(x\) 为该位置有 \(1\) 的期望. 统计两个值 : \(suma\) 和 \(sumb\). \(suma\) 表示连续 \(X\) 个 \(1\) , \(X\) 的平方的期望, \(sumb\) 表示 \(X\) 的期望. 因为 \((x + 1)^3 = x^3 + 3x^2 + 3x + 1\) 所以每次把答案加上 \(3suma + 3sumb + 1\) 乘以该位置有 \(x\) 的期望即可. 而 \(suma = x * (suma + 2sumb + 1)\), \(s…
写法和CF235B Let's Play Osu!非常相似.但是这个题厉害就厉害在统计的贡献里面有一个平方的期望,而这个平方的期望和期望的平方是完全不一样的,需要另外统计,逻辑上仔细想一想就会明白. 期望\(dp\)没那么可怕,但是确实非常不容易调试.所以一定要在第一次推出式子的时候,保证式子的正确.哪怕先写一个暴力,也比写出锅过不了样例根本没法调的正解要好. #include <bits/stdc++.h> using namespace std; const int N = 100010;…
传送门 题目背景 原 <产品排序> 参见P2577 题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在这个串中连续的 XX 个 11 可以贡献 X^3X3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释) 现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数. 输入输出格式 输入格式:…
https://www.lydsy.com/JudgeOnline/problem.php?id=4318 https://www.luogu.org/problemnew/show/P1654 看来自己还是naive... 注意:和的期望=期望的和:平方的期望!=期望的平方,立方的期望!=期望的立方 那么怎么算一组变量的和的立方的期望呢?当然是不能用和的期望的立方的 a,b互相独立时, $E((a+b)^3)=E(a^3+3*a^2*b+3*a*b^2+b^3)=E(a^3)+3*E(a^2)…
题目链接 很妙的一道题. 题目要求$X^3$的期望值. 直接求不好求. 考虑先求出$X$和$X^2$的期望值,然后再求$X^3$的期望值. 迎.刃.而.解. #include<iostream> #include<cstdio> using namespace std; double p[100005],x1[100005],x2[100005],x3[100005]; int main() { int n=0; scanf("%d",&n); for(…
期望DP 设\(g[i]\)表示前i个的连续1的期望长度,\(h[i]\)表示前i个连续1的长度的平方的期望,\(f[i]\)表示前i个的期望得分 由期望的线性性质,我们可以考虑统计新增一个对答案的贡献 \[ E((x+1)^3)-E(x^3)=E(3x^2+3x+1) \] 然后递推统计即可 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n; dou…
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 1000000 + 4; double f[maxn], g[maxn], h[maxn]; int main() { int n; scanf("%d",&n); for(int i = 1;i <= n; ++i) { double perc; scanf("%lf"…
传送门 解题思路 首先考虑对于一个点来说,如果这个点是1的话,那么对于答案来说 $(ans+1)^3=ans^3+3*ans^2+3*ans+1$,这对于上一个答案来说其实贡献了 $3*ans^2+3*ans+1$,那么只需要维护一个 $ans^2$与 $ans$的期望,然后转移到$ans$就行了. #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; inline in…