本文版权归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$也是资瓷的。

  1. //It is made by ljh2000
  2. //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <complex>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <string>
  11. #include <bitset>
  12. #include <queue>
  13. #include <cmath>
  14. #include <ctime>
  15. #include <map>
  16. #include <set>
  17. #define lc root<<1
  18. #define rc root<<1|1
  19. #define pr pair<int,int>
  20. #define MP make_pair
  21. #define fr first
  22. #define sc second
  23. #define rep(i,j,k) for(int i=j;i<=k;++i)
  24. #define per(i,j,k) for(int i=j;i>=k;--i)
  25. #define reg(i,x) for(int i=first[x];i;i=next[i])
  26. using namespace std;
  27. typedef long long LL;
  28. typedef long double LB;
  29. typedef complex<double> C;
  30. const double pi = acos(-1);
  31. const double eps = 1e-9;
  32. const int mod = 666623333;
  33. const int MAXN = 2011;
  34. int n,X,q,stack[MAXN],top,L[MAXN],R[MAXN];
  35. LL f[MAXN],ans,invp[MAXN];
  36. struct seq{ int l,r; }a[MAXN];
  37. inline bool cmp(seq q,seq qq){ if(q.l==qq.l) return q.r>qq.r; return q.l<qq.l; }
  38. 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; }
  39. inline int getint(){
  40. int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
  41. if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
  42. }
  43.  
  44. inline void work(){
  45. n=getint(); X=getint(); q=getint(); for(int i=1;i<=q;i++) { a[i].l=getint(); a[i].r=getint(); }
  46. 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; }//去掉包含区间的大区间
  47. q=top; for(int i=1;i<=q;i++) a[i]=a[stack[i]];
  48.  
  49. int head=1,tail=0;
  50. for(int i=1;i<=n;i++) {
  51. while(tail<q && a[tail+1].l<=i) tail++;
  52. while(head<=tail && a[head].r<i) head++;
  53. L[i]=head; R[i]=tail;
  54. }
  55.  
  56. for(int x=1;x<=X;x++) {//枚举x,计算 P(ans>=x) = 1-P(ans<x)
  57. LL sum,p,np,fp,leip; int j=0;
  58. sum=1;//[l[i]==1]
  59. p=(x-1+mod)%mod*fast_pow(X,mod-2); p%=mod;/*!!!!*/
  60. //p=(x-1)/X
  61.  
  62. np=(1-p+mod)%mod;//1-p
  63. fp=fast_pow(np,mod-2);//1/(1-p)^1
  64. invp[0]=1; f[0]=1; leip=1;
  65. for(int i=1;i<=n;i++) invp[i]=1LL*invp[i-1]*fp%mod;
  66. for(int i=1;i<=n;i++) {
  67. while(j<i/*!!!*/ && R[j]<L[i]-1) sum-=1LL*f[j]*invp[j]%mod,sum+=mod,sum%=mod,j++;
  68. f[i]=sum*leip%mod*p%mod; leip=leip*np%mod;
  69. sum+=1LL*f[i]*invp[i]; sum%=mod;
  70. }
  71. LL tot=0; leip=1;
  72. 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;
  73. ans+=(1-tot+mod)%mod; ans%=mod;
  74. }
  75. printf("%lld",ans);
  76. }
  77.  
  78. int main()
  79. {
  80. #ifndef ONLINE_JUDGE
  81. freopen("3600.in","r",stdin);
  82. freopen("3600.out","w",stdout);
  83. #endif
  84. work();
  85. return 0;
  86. }
  87. //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

P3600 随机数生成器的更多相关文章

  1. Luogu P3600 随机数生成器

    Luogu P3600 随机数生成器 题目描述 sol研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数. 现在sol打算生成\(n\)个\([1,x]\)的整数\(a_1...a_n\) ...

  2. Luogu P3600 随机数生成器(期望+dp)

    题意 有一个长度为 \(n\) 的整数列 \(a_1, a_2, \cdots, a_n\) ,每个元素在 \([1, x]\) 中的整数中均匀随机生成. 有 \(q\) 个询问,第 \(i\) 个询 ...

  3. 洛谷P3600 随机数生成器(期望dp 组合数)

    题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...

  4. luogu P3600 随机数生成器【dp】

    把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]*i 首先包含其他区间的区间是没有意义的,用单调栈去掉 然后恰好不好求,就改成h[i]表示最大值最大是i的方案数 ...

  5. 洛谷P3600随机数生成器——期望+DP

    原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...

  6. 洛谷 P3600 - 随机数生成器(期望 dp)

    题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...

  7. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  8. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  9. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

随机推荐

  1. Jenkins部分常用插件

  2. Flask蓝图,Session,闪现,中间件等

    Session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设 ...

  3. 七个可以提升python程序性能的好习惯,你知道吗?

    掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费.今天就为大家带来七个可以提升python程序性能的好习惯,赶快来学习吧:. 1.使用局部变量 尽量使用局部变量代替全局变量:便 ...

  4. docker安装入门

    docker安装入门 https://blog.csdn.net/earbao/article/details/49683175

  5. thinkphp curd的事务回滚 一看就会

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/32314403     /**       ...

  6. Elasticsearch.js 发布 —— 在Node.js和浏览器中调用Elasticsearch

    继PHP.Ruby.Python和Perl之后,Elasticsearch最近发布了Elasticsearch.js,Elasticsearch的JavaScript客户端库.可以在Node.js和浏 ...

  7. React:快速上手(6)——掌握React Router

    React:快速上手(6)——掌握React Router 引入Router 安装 npm install react-router-dom 基础组件 React Router中有三种类型的组件:路由 ...

  8. idea的junit测试出现Class not found: "com.chinaums.szm.test.RouteTransProxyClientTest" Empty test suite.

  9. HDU 3081 Marriage Match II (二分+并查集+最大流)

    题意:N个boy和N个girl,每个女孩可以和与自己交友集合中的男生配对子;如果两个女孩是朋友,则她们可以和对方交友集合中的男生配对子;如果女生a和女生b是朋友,b和c是朋友,则a和c也是朋友.每一轮 ...

  10. Submine Text 快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...