zoukankan      html  css  js  c++  java
  • P7099-[yLOI2020]灼【数学期望,结论】

    正题

    题目链接:https://www.luogu.com.cn/problem/P7099


    题目大意

    给出(n)个坐标轴上的点,(q)次询问从某点出发每次等概率向左或者向右一格求到达某个给出点的期望步数。
    保证每个询问点左右都有目标点

    (1leq nleq 10^5,1leq qleq 5 imes 10^6,1leq x_i,y_ileq 10^9)


    解题思路

    每个询问具体分析,离左边点的距离为(l),右边点的距离为(r)
    (f_i)表示从(i)出发到达终点的期望距离,那么有

    [f_i=frac{f_{i-1}+f_{i+1}}{2}+1 ]

    然后(f_{-l}=f_r=0)然后求(f_0)

    然后拆出来

    [2f_i=f_{i-1}+f_{i+1}+2 ]

    [(f_{i+1}-f_{i})-(f_{i}-f_{i-1})=-2 ]

    也就是(f)数组两次差分是一个常数,所以说(f)可以被表示成一个二次函数,设(f_x=ax^2+bx+c),那么(f'_x=f_{x}-f_{x-1}=2ax-a+b),然后(f''_x=f'_{x}-f'_{x-1}=2a=-2),所以(f_x=-x^2+bx+c)

    因为知道零点(left{egin{matrix}-(-l)^2+b(-l)+c=0\-r^2+br+c=0end{matrix} ight.),所以解出来(left{egin{matrix}b=r-l\c=l imes rend{matrix} ight.)

    所以其实答案就是(l imes r)

    时间复杂度(O(nlog n))


    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
    %d
    %d
    %d",p1,p2,p3,p4);
    	return 0;
    }
    
  • 相关阅读:
    LDAP入门
    Java程序员书籍推荐
    docker registry镜像容器时区时间同步
    微服务架构与实践及云原生等相关概念
    ts基础
    内网穿透连接内网下的"我的世界"服务端
    [量子互联] 内网穿透远程连接Linux的SSH
    树莓派开启SSH的N种方法
    [量子互联] 群晖NAS的远程映射配置
    [量子互联] 群晖NAS的qBittorrent端口映射
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/14922565.html
Copyright © 2011-2022 走看看