正题
题目链接: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(nlogn)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;
}