【XSY2332】Randomized Binary Search Tree 概率DP FFT
题目描述
\(\forall 0\leq i<n\),求有多少棵\(n\)个点,权值和优先级完全随机的treap的树高为\(i\)。
\(n\leq 30000\)
题解
设\(f_{i,j}\)为\(j\)个点的树,树高不超过为\(i\)的概率
\]
枚举一个点左子树大小\(k-1\),那么右子树大小为\(j-k\)。且这个点的优先级为这\(j\)个点最小的概率是\(\frac{1}{j}\)。
这个东西是个卷积,可以用FFT加速。
其实期望树高是\(O(\log n)\)的。实际上只有前面一部分的答案不为\(0\)。所以我们只用计算树高\(\leq 100\)的答案。
时间复杂度:\(O(n\log^2n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
double pi=acos(-1);
struct cp
{
double x,y;
cp(double a=0,double b=0)
{
x=a;
y=b;
}
};
cp operator +(cp a,cp b)
{
return cp(a.x+b.x,a.y+b.y);
}
cp operator -(cp a,cp b)
{
return cp(a.x-b.x,a.y-b.y);
}
cp operator *(cp a,cp b)
{
return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
cp operator /(cp a,double b)
{
return cp(a.x/b,a.y/b);
}
namespace fft
{
cp w1[100010];
cp w2[100010];
int rev[100010];
int n;
void init(int m)
{
n=1;
while(n<=m)
n<<=1;
int i;
for(i=2;i<=n;i<<=1)
{
w1[i]=cp(cos(2*pi/i),sin(2*pi/i));
w2[i]=cp(cos(2*pi/i),-sin(2*pi/i));
}
rev[0]=0;
for(i=1;i<n;i++)
rev[i]=(rev[i>>1]>>1)|(i&1?n>>1:0);
}
void fft(cp *a,int t)
{
int i,j,k;
cp u,v,w,wn;
for(i=0;i<n;i++)
if(rev[i]<i)
swap(a[i],a[rev[i]]);
for(i=2;i<=n;i<<=1)
{
wn=(~t?w1[i]:w2[i]);
for(j=0;j<n;j+=i)
{
w=1;
for(k=j;k<j+i/2;k++)
{
u=a[k];
v=a[k+i/2]*w;
a[k]=u+v;
a[k+i/2]=u-v;
w=w*wn;
}
}
}
if(t==-1)
for(i=0;i<n;i++)
a[i]=a[i]/n;
}
}
cp a[100010];
double f[110][30010];
double ans[30010];
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
int n;
scanf("%d",&n);
int m=100;
int i,j;
fft::init(2*n);
a[0]=a[1]=1;
double last;
for(i=0;i<n;i++)
ans[i]=0;
last=ans[0]=a[n].x;
for(i=1;i<=m;i++)
{
fft::fft(a,1);
for(j=0;j<fft::n;j++)
a[j]=a[j]*a[j];
fft::fft(a,-1);
for(j=fft::n-1;j>=1;j--)
a[j]=a[j-1];
a[0]=a[1]=1;
for(j=2;j<=n;j++)
a[j]=a[j]/j;
for(j=n+1;j<fft::n;j++)
a[j]=0;
ans[i]=a[n].x-last;
last=a[n].x;
}
// for(i=0;i<=m;i++)
// f[i][1]=f[i][0]=1;
// for(i=1;i<=m;i++)
// for(j=2;j<=n;j++)
// for(k=1;k<=j;k++)
// f[i][j]+=f[i-1][k-1]*f[i-1][j-k]/j;
// for(i=0;i<=m;i++)
// {
// ans[i]=f[i][n];
// if(i>=1)
// ans[i]-=f[i-1][n];
// }
for(i=0;i<=n-1;i++)
printf("%.10lf\n",ans[i]);
return 0;
}
【XSY2332】Randomized Binary Search Tree 概率DP FFT的更多相关文章
- 【xsy2332】Randomized Binary Search Tree DP+FFT
题目大意:给你一个$[0,1]$之间等概率随机序列,你需要把这个序列插入到一棵$treap$中,问这棵$treap$的期望深度,请对于$[1,n]$中的每个深度分别输出它的概率(实数,保留五位小数). ...
- 【未知来源】Randomized Binary Search Tree
题意 求 \(n\) 个点的 Treap 深度为 \(h=0,1,2,\cdots,n\) 的概率. Treap 是一个随机二叉树,每个节点有权值和优先级,权值和优先级都是 \([0,1]\) 中的随 ...
- uva 10304 - Optimal Binary Search Tree 区间dp
题目链接 给n个数, 这n个数的值是从小到大的, 给出个n个数的出现次数. 然后用他们组成一个bst.访问每一个数的代价是这个点的深度*这个点访问的次数. 问你代价最小值是多少. 区间dp的时候, 如 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
随机推荐
- Python中Socket粘包问题的解决
服务器端 import socket import subprocess import struct server = socket.socket() ip_port = ("192.168 ...
- sql面试学到新内容
1.事物的保存点 MYSQL可以让我们对事务进行部分回滚,就是在事务里调用SAVEPOINT语句来设置一些命名标记.如果想要回滚到那个标记点位置,需要使用ROLLBACK语句来指定哪个保存点. mys ...
- 使用git将项目上传到github
使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下 ...
- LCT维护删除时间最晚生成树
用来做动态图问题. 维护一棵删除时间最晚的生成树,这样好处是加入一条非树边时可以直接判断加还是不加,没有现在不加入而之后再加入的情况.要是我比你先被删,那我就完全没必要加.否则你现在就可以被删除掉.
- 百度地图开发者API学习笔记一(转载)
一,实现功能: 在地图上标记点,划线等操作.如下图. 2.代码: <!DOCTYPE html> <html> <head> <meta http-equiv ...
- MySql数据库连接池专题
MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html
- jenkins+maven+tomcat集群发布
jenkins+Gitlab+maven+tomcat实现自动集成.打包.部署 - 李栋94 - 博客园https://www.cnblogs.com/lidong94/p/7427923.html ...
- .net WCF WF4.5 状态机、书签与持久化
想看源码请直接翻到最后,使用方式如下图 如果同时需要多个书签可以直接在需要的位置创建书签,会认为是同一个实例. 若需要实现的效果是同时需要好几个部门审核,那么只要在对应的位置同时创建多个书签即可. 编 ...
- 11 The superlative
1 最高级用来表明三个或更多事物之间的关系.最高级是通过在形容词之前加 "the" 并在之后加 "-est",或在形容词之前加 "the most&q ...
- [转帖] 百度知道: KMS 和OSPP
https://zhidao.baidu.com/question/1819332749671662308.html Key Management Service (KMS).目前Windows Se ...