CF641D. Little Artem and Random Variable
CF641D. Little Artem and Random Variable
Solution
設給定的兩個序列為mx1..n,mn1..nmx_{1..n},mn_{1..n}mx1..n?,mn1..n?。
令第一個骰子投到1..n1..n1..n的概率為p1..np_{1..n}p1..n?
令第二個骰子投到1..n1..n1..n的概率為q1..nq_{1..n}q1..n?
顯然有
mxi=(∑j≤ipj)(∑j≤ipj)?(∑j<ipj)(∑j<ipj)mx_i=(\sum_{j\leq i}p_j)(\sum_{j\leq i}p_j)-(\sum_{j<i}p_j)(\sum_{j<i}p_j)mxi?=(j≤i∑?pj?)(j≤i∑?pj?)?(j<i∑?pj?)(j<i∑?pj?)
mni=(∑j≥ipj)(∑j≥ipj)?(∑j>ipj)(∑j>ipj)mn_i=(\sum_{j\geq i}p_j)(\sum_{j\geq i}p_j)-(\sum_{j>i}p_j)(\sum_{j>i}p_j)mni?=(j≥i∑?pj?)(j≥i∑?pj?)?(j>i∑?pj?)(j>i∑?pj?)
可以把∑j≤xpj\sum_{j\leq x}p_j∑j≤x?pj?當成橫坐標,把∑j≤yqj\sum_{j\leq y}q_j∑j≤y?qj?當成縱坐標,這樣就形成一個1?11*11?1的矩形,mxi.mnimx_i.mn_imxi?.mni?分別為其中一個LLL形矩陣面積,可以求得:
1?∑j≤imxi+mni+1=(∑j>ipj)+(∑j>iqj)1-\sum_{j\leq i}mx_i+mn_{i+1}=(\sum_{j>i}p_j)+(\sum_{j>i}q_j)1?j≤i∑?mxi?+mni+1?=(j>i∑?pj?)+(j>i∑?qj?)
∑mni+1=(∑j>ipj)(∑j>iqj)\sum mn_{i+1}=(\sum_{j>i}p_j)(\sum_{j>i}q_j)∑mni+1?=(j>i∑?pj?)(j>i∑?qj?)
這樣就可以通過求解一元二次方程求出(∑j>ipj)(\sum_{j>i}p_j)(∑j>i?pj?)和(∑j>iqj)(\sum_{j>i}q_j)(∑j>i?qj?),差分即可。
Code
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se second #define int llusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; } template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int,int> PR; typedef vector<int> VI;const lod eps=1e-15; const lod pi=acos(-1); const int oo=1<<30; const ll loo=1ll<<62; const int mods=1e9+7; const int MAXN=100005; const int INF=0x7fffffff;//1061109567 /*--------------------------------------------------------------------*/ inline int read() {int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } double mx[MAXN],mn[MAXN],smx[MAXN],smn[MAXN],sp[MAXN],sq[MAXN]; signed main() {int n=read();for (int i=1;i<=n;i++) scanf("%lf",&mx[i]);for (int i=1;i<=n;i++) scanf("%lf",&mn[i]);for (int i=1;i<=n;i++) smx[i]=smx[i-1]+mx[i];for (int i=n;i>=1;i--) smn[i]=smn[i+1]+mn[i];for (int i=1;i<=n;i++){double pl=1+smx[i]-smn[i+1],mul=smx[i],mi=sqrt(pl*pl-mul*4+eps);sp[i]=(pl+mi)*0.5,sq[i]=(pl-mi)*0.5;}for (int i=1;i<=n;i++) printf("%.10lf ",sp[i]-sp[i-1]); puts("");for (int i=1;i<=n;i++) printf("%.10lf ",sq[i]-sq[i-1]); puts("");return 0; }總結
以上是生活随笔為你收集整理的CF641D. Little Artem and Random Variable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OsharpNS轻量级.net core
- 下一篇: FC(nes)游戏开发资源