博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个有趣的期望问题:1~n随机排列前缀最大值集合元素个数的期望
阅读量:5251 次
发布时间:2019-06-14

本文共 1346 字,大约阅读时间需要 4 分钟。

解法

  • 元素x对答案如果产生了贡献,那么比x大的数字都在x的后面。
  • x成为天选之子,概率为1/(n-x+1)
  • 独立考虑每个元素对答案的贡献,所以答案为sigma 1/i,其中i: 1->n

做法: Meow

做法:

f(L,R)表示max(a[L~R])-min(a[L,R])

  • 逐个枚举左端点
  • 逐个枚举右端点

然后,我们发现逐个枚举右端点很辣鸡的。

我们用单调栈,维护在元素i后面的第一个大于a[i]的元素,与第一个小于a[i]的元素。

确定L,我们就可以把f(L,R)相等的R一起处理了。

复杂度O(NlogN),因为对1/x积分可知:1/1+1/2+...+1/n ~ log N

code

#include 
#include
#include
#include
using namespace std;const int N = 100000+10;pair
stk[N]; int top;int T, n, a[N], nex1[N], nex2[N];long long cnt[N];void brute() { long long sum[N]={0}; for(int i=1;i<=n;i++){ int mx=-1,mn=N; for(int j=i;j<=n;j++){ mx=max(mx,a[j]); mn=min(mn,a[j]); sum[mx-mn]++; if(mx-mn==2) printf("[%d,%d]\n", i,j); } } for(int i=1;i<=n;i++){ sum[i]+=sum[i-1]; } for(int i=0;i
=1;i--) { while(a[i]>stk[top].first) top--; nex1[i]=stk[top].second; stk[++top]=make_pair(a[i],i); } top=0; stk[++top]=make_pair(0, n+1); for(int i=n;i>=1;i--) { while(a[i]
v; for(int i=1;i<=n;i++){ v.clear(); int now=i; while(1) { now=nex1[now]; if(now==n+1) break; v.push_back(now); } now=i; while(1) { now=nex2[now]; if(now==n+1) break; v.push_back(now); } v.push_back(n); sort(v.begin(),v.end()); int mx=a[i],mn=a[i],pre=i; for(int j=0;j

转载于:https://www.cnblogs.com/RUSH-D-CAT/p/9136815.html

你可能感兴趣的文章
css ie6最小高度问题
查看>>
1、Linux内核的配置和编译
查看>>
A Summaryof JDBC
查看>>
LRTHW笔记七
查看>>
Catch That Cow(BFS广搜)
查看>>
pip 安装问题
查看>>
大数据量处理
查看>>
linux之反向代理,反向代理实例,负载均衡实例
查看>>
Java 泛型
查看>>
浅谈Nutch插件机制(含开发实例)
查看>>
网络协议抓包分析——IP互联网协议
查看>>
awk速查手册
查看>>
黑马程序员_<<泛型>>
查看>>
HDU 2527
查看>>
遍历聚合对象中的元素——迭代器模式(三)
查看>>
20155324王鸣宇 《网络对抗技术》Web基础
查看>>
Android Studio 简介
查看>>
Android 5.0 新特性
查看>>
传说中的WCF(3):多个协定
查看>>
Java第三次作业——面向对象基础(封装)
查看>>