Jzoj3805 小X的二叉堆計數

2022-05-09 17:37:28 字數 610 閱讀 7530

題意:給你n個不同的數問你能構成多少個不同的二叉堆

顯然不能列舉,我們考慮用遞推

我們令f[i]表示以i為根的二叉堆有多少種

令l,r為i的左右兒子,令size[i]為以i為根的堆的大小

那麼顯然,f[i]=f[l]*f[r]*c(size[i]-1,size[l]),因為n個數互不相同,所以沒有重複

相當於是1~size[i]這幾個數填進這個堆中,那麼顯然根只能填最大那個,讓後在剩下的數選擇size[l]個即可

因為堆有兩種,大根堆和小根堆,所以答案要乘2

#include#define m 1000000007

#define l long long

#define n 5000010

l inv[n],js[n],f[n];

int n,sz[n];

inline l c(int n,int m)

inline l pow(l x,int k)

int main()

for(int i=n;i;--i)

if(n==1)

else printf("%d",(f[1]<<1)%m);

}

二叉堆相關整理(大根堆小根堆)

二叉堆是一種支援插入 刪除 查詢最值的陣列結構。它其實是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點都帶有乙個權值。層次序列儲存方式,直接用乙個陣列來儲存二叉堆。逐層從左到右為樹中的節點依次編號,把此編號作為節點在陣列中儲存的位置 下標 在這種儲存方式中,父節點編號等於子節點等於子節點編號除以2,左...

0x17二叉堆之超市

容易想到乙個貪心策略 在最優解中,對於每個時間 天數 t,應該在保證不賣出過期商品的前提下,盡量賣出利潤前t大的商品。因此,我們可以依次考慮每個商品,動態維護乙個滿足上述性質的方案。詳細地說,我們把商品按照過期時間排序,建立乙個初始為空的小根堆 節點權值為商品利潤 然後掃瞄每個商品 1.若當前商品的...

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...