HDU 6305 笛卡尔树+求期望

   日期:2020-07-11     浏览:92    评论:0    
核心提示:首先这个题要分析不少东西:B数组是取0~1内的实数 任意两个元素相等的概率为0 所以我们可以认为 B数组的每个元素都不相等 可以看作全排列 对于合法序列B 其元素的期望值为1/2 (0~1上的均匀分布) 所以序列的期望值为 n/2 A和B满足题目条件 当且仅当 A和B的笛卡尔树同构 而全排列总共有种 其中满足同构的有 所以同构的概率为 综上所述 最终的答案为#includeusing namespace std...

首先这个题要分析不少东西:

  1. B数组是取0~1内的实数 任意两个元素相等的概率为0   所以我们可以认为 B数组的每个元素都不相等 可以看作全排列
  2. 对于合法序列B  其元素的期望值为1/2 (0~1上的均匀分布) 所以序列的期望值为 n/2
  3. A和B满足题目条件 当且仅当 A和B的笛卡尔树同构  而全排列总共有  种   其中满足同构的有   所以同构的概率为    
  4. 综上所述  最终的答案为  
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
ll mod = 1e9+7;
ll inv[N],ans;
int a[N],ls[N],rs[N];
stack<int>s;
int dfs(int rt){
	int tot=1;
	if(!ls[rt]&&!rs[rt]) return 1;
	if(ls[rt]) tot+=dfs(ls[rt]);
	if(rs[rt]) tot+=dfs(rs[rt]);
	ans=(ans*inv[tot])%mod; 
	return tot;
}
int main(){
	inv[1]=1;
	for(int i = 2; i <= 1e6; i++)
	inv[i]=inv[mod%i]*(mod-mod/i)%mod;
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		for(int i = 1; i <= n; i++) scanf("%d",&a[i]),ls[i]=rs[i]=0;
		for(int i = 1; i <= n; i++){
			while(!s.empty()&&a[i]>a[s.top()]) ls[i]=s.top(),s.pop();
			if(!s.empty()) rs[s.top()]=i;
			s.push(i); 
		}
		ans=1ll*n*inv[2]%mod;
		int rt;
		while(!s.empty()) rt=s.top(),s.pop();
		dfs(rt);
		printf("%lld\n",ans);
	} 
	return 0;
}

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服