題意:給你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...