P7099-[yLOI2020]灼【数学期望,结论】
正題
題目鏈接:https://www.luogu.com.cn/problem/P7099
題目大意
給出nnn個坐標軸上的點,qqq次詢問從某點出發每次等概率向左或者向右一格求到達某個給出點的期望步數。
保證每個詢問點左右都有目標點
1≤n≤105,1≤q≤5×106,1≤xi,yi≤1091\leq n\leq 10^5,1\leq q\leq 5\times 10^6,1\leq x_i,y_i\leq 10^91≤n≤105,1≤q≤5×106,1≤xi?,yi?≤109
解題思路
每個詢問具體分析,離左邊點的距離為lll,右邊點的距離為rrr
設fif_ifi?表示從iii出發到達終點的期望距離,那么有
fi=fi?1+fi+12+1f_i=\frac{f_{i-1}+f_{i+1}}{2}+1fi?=2fi?1?+fi+1??+1
然后f?l=fr=0f_{-l}=f_r=0f?l?=fr?=0然后求f0f_0f0?。
然后拆出來
2fi=fi?1+fi+1+22f_i=f_{i-1}+f_{i+1}+22fi?=fi?1?+fi+1?+2
(fi+1?fi)?(fi?fi?1)=?2(f_{i+1}-f_{i})-(f_{i}-f_{i-1})=-2(fi+1??fi?)?(fi??fi?1?)=?2
也就是fff數組兩次差分是一個常數,所以說fff可以被表示成一個二次函數,設fx=ax2+bx+cf_x=ax^2+bx+cfx?=ax2+bx+c,那么fx′=fx?fx?1=2ax?a+bf'_x=f_{x}-f_{x-1}=2ax-a+bfx′?=fx??fx?1?=2ax?a+b,然后fx′′=fx′?fx?1′=2a=?2f''_x=f'_{x}-f'_{x-1}=2a=-2fx′′?=fx′??fx?1′?=2a=?2,所以fx=?x2+bx+cf_x=-x^2+bx+cfx?=?x2+bx+c。
因為知道零點{?(?l)2+b(?l)+c=0?r2+br+c=0\left\{\begin{matrix}-(-l)^2+b(-l)+c=0\\-r^2+br+c=0\end{matrix}\right.{?(?l)2+b(?l)+c=0?r2+br+c=0?,所以解出來{b=r?lc=l×r\left\{\begin{matrix}b=r-l\\c=l\times r\end{matrix}\right.{b=r?lc=l×r?
所以其實答案就是l×rl\times rl×r
時間復雜度O(nlog?n)O(n\log n)O(nlogn)
code
#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using namespace std; const int N=1e5+10,P=998244353; int T,n,q,a[N]; int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } int main() {T=read();n=read();q=read();for(int i=1;i<=n;i++)a[i]=read();sort(a+1,a+1+n);int k=1,p1=0,p2=0,p3=0,p4=2147483647;for(int i=1;i<=q;i++){int x=read();while(k<n&&a[k]<x)k++;int ans=1ll*(a[k]-x)*(x-a[k-1])%P;p1^=ans;p2+=(ans&1);p3=max(p3,ans);p4=min(p4,ans);}printf("%d\n%d\n%d\n%d",p1,p2,p3,p4);return 0; }總結
以上是生活随笔為你收集整理的P7099-[yLOI2020]灼【数学期望,结论】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果iphone怎么使用备忘录录音
- 下一篇: P4258-[WC2016]挑战NPC【