zoukankan      html  css  js  c++  java
  • P3600 随机数生成器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

    本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!

    题目链接:洛谷3600

    正解:概率DP

    解题报告:

      官方题解:戳这里

      考虑最朴素的计算式就是:$sum_{i=1}^{x} i*P(ans=i) $为所求。

      上式又等于$sum_{i=1}^{x} P(ans>=i)$,这个可以理解成对于$j>=i$的$j$分给了所有的$i$,正好是每个一份,系数就没了。

      因为算ans$>=i$很不方便,那么我们转化成求$1-P(ans<i)$。我们直接枚举这个$i$,接下来要做的就是算$P(ans<i)$,用下面的方法可以做到$O(n)$。

      因为是求得$max$我们转化成求$ans<i$的概率之后显然好处理一些…

      考虑$ans<i$的条件就是每个询问的区间中至少存在一个点$<i$(首先把相互包含的大区间去掉),顺着这个思路做下去,听说可以满分23333

      现在将另一种也好理解的做法:对于每个元素我们考虑它能满足哪些区间的询问,不难发现一定也是一个连续的区间,那么我们把点和区间翻转之后,问题变成了:每个点能覆盖一段区间,且覆盖的概率为$p=frac{i-1}{x}$,问覆盖全段的概率。

      然后就可以转移了,令$f[i]$表示强制选了第$i$个区间之后,覆盖了第$i$个区间右端点之前的所有位置的期望概率。

      那么$f[i]=p*(sum_{l[i]-1>=r[j]} f[j]*(1-p)^{i-j-1}+[l[i]=1]*(1-p)^{i-1})$,

      最终答案就是$sum_{r[i]=m} f[i]*(1-p)^{n-i}$。

      大概理解一下上式,强制选了$i$之后再枚举一个之前的$j$,意思是$[j+1,i-1]$这一段都强制不选,其余的类似。

       然后上面这个式子$j$指针单调扫一下,就变成线性的了,话说,如果用树状数组维护多带个$log$也是资瓷的。 

    //It is made by ljh2000
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <complex>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <bitset>
    #include <queue>
    #include <cmath>
    #include <ctime>
    #include <map>
    #include <set>
    #define lc root<<1
    #define rc root<<1|1
    #define pr pair<int,int>
    #define MP make_pair
    #define fr first
    #define sc second
    #define rep(i,j,k) for(int i=j;i<=k;++i)
    #define per(i,j,k) for(int i=j;i>=k;--i)
    #define reg(i,x) for(int i=first[x];i;i=next[i])
    using namespace std;
    typedef long long LL;
    typedef long double LB;
    typedef complex<double> C;
    const double pi = acos(-1);
    const double eps = 1e-9;
    const int mod = 666623333;
    const int MAXN = 2011;
    int n,X,q,stack[MAXN],top,L[MAXN],R[MAXN];
    LL f[MAXN],ans,invp[MAXN];
    struct seq{ int l,r; }a[MAXN];
    inline bool cmp(seq q,seq qq){ if(q.l==qq.l) return q.r>qq.r; return q.l<qq.l; }
    inline LL fast_pow(LL x,LL y){ LL r=1; while(y>0) { if(y&1) r*=x,r%=mod; x*=x; x%=mod; y>>=1; } return r; }
    inline int getint(){
        int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
        if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
    }
    
    inline void work(){
    	n=getint(); X=getint(); q=getint(); for(int i=1;i<=q;i++) { a[i].l=getint(); a[i].r=getint(); }
    	sort(a+1,a+q+1,cmp); for(int i=1;i<=q;i++) { while(a[i].r<=a[stack[top]].r) top--; stack[++top]=i; }//去掉包含区间的大区间
    	q=top; for(int i=1;i<=q;i++) a[i]=a[stack[i]];
    
    	int head=1,tail=0;
    	for(int i=1;i<=n;i++) {
    		while(tail<q && a[tail+1].l<=i) tail++;
    		while(head<=tail && a[head].r<i) head++;
    		L[i]=head; R[i]=tail;
    	}
    
    	for(int x=1;x<=X;x++) {//枚举x,计算 P(ans>=x) = 1-P(ans<x)
    		LL sum,p,np,fp,leip; int j=0;
    		sum=1;//[l[i]==1]
    		p=(x-1+mod)%mod*fast_pow(X,mod-2); p%=mod;/*!!!!*/
    	   	//p=(x-1)/X
    
    		np=(1-p+mod)%mod;//1-p
    		fp=fast_pow(np,mod-2);//1/(1-p)^1
    		invp[0]=1; f[0]=1; leip=1;
    		for(int i=1;i<=n;i++) invp[i]=1LL*invp[i-1]*fp%mod;
    		for(int i=1;i<=n;i++) {
    			while(j<i/*!!!*/ && R[j]<L[i]-1) sum-=1LL*f[j]*invp[j]%mod,sum+=mod,sum%=mod,j++;
    			f[i]=sum*leip%mod*p%mod; leip=leip*np%mod;
    			sum+=1LL*f[i]*invp[i]; sum%=mod;
    		}
    		LL tot=0; leip=1;
    		for(int i=n;i>=1;i--,leip=1LL*leip*np%mod) if(R[i]==q) tot+=f[i]*leip%mod,tot%=mod; else break;
    		ans+=(1-tot+mod)%mod; ans%=mod;
    	}
    	printf("%lld",ans);
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
    	freopen("3600.in","r",stdin);
    	freopen("3600.out","w",stdout);
    #endif
        work();
        return 0;
    }
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    

      

  • 相关阅读:
    Ubunut16.04 安装 Theano+GPU
    ubuntu源与常用python配置pip源(win)、pip常用命令
    集群(heartbeat)搭建
    Linux下搭建企业共享目录方案之------samba
    LAMP的安装和注意事项
    Linux最小化安装,忘记安装开发工具的解决方法
    去掉Linux尖锐的提示音
    最小化安装CentOS7,没有ifconfig命令---yum search command_name搜索未知包名
    编译安装php-5.4.44
    configure: error: Please reinstall the libcurl distribution
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6665979.html
Copyright © 2011-2022 走看看