poj 2201 RMQ 笛卡爾樹

2021-07-10 21:49:48 字數 1108 閱讀 3008

給出一些結點

每個節點有兩個關鍵字

要求構造一棵樹

第乙個關鍵字滿足二叉搜尋樹的性質,第二個關鍵字滿足小堆的性質

解題思路:這道題我開始是用第二關鍵字從小到大排序,然後從1-n去新增節點。這樣是符合最小堆的性質,假設新增第i個節點,那麼首先去找[1,i-1]這段區間的第一關鍵字的最小值和最大值,如果i節點的第一關鍵字大於最大值,就直接新增到最大值節點的右兒子,如果小於最小值,就新增到最小值節點的左兒子,否則就直接從根節點往下找。可是超時了,其實超時的原因還蠻明顯的,因為你新增的i節點不一定每次都是大於最大值,小於最小值,更多的情況可能是在中間值,這樣每次都要從根節點出發往下走,這樣就會造成遍歷的時間太多了。但按照這種思路,很難直接找到i節點的父節點是誰,因為[1,i-1]區間內的第一關鍵字是無序的。

參考了網上的思路,絕大部分都是按照第一關鍵字排序,然後再去找區間段內的最小值作為子樹的根節點。

我的tle:

#include#include#include#include#includeusing namespace std;

const int maxn = 50005;

struct node

}tree[maxn];

struct result

res[maxn];

int n,value[maxn],dp_max[maxn][20],dp_min[maxn][20];

int _max(int l,int r)

int _min(int l,int r)

void initrmq()

else if(tree[i].k < tree[minm].k)

else

}else}}

} }}int main()

sort(tree+1,tree+1+n);

initrmq();

build();

printf("yes\n");

for(int i = 1; i <= n; i++)

printf("%d %d %d\n",res[i].parent,res[i].left,res[i].right);

} return 0;

}

POJ 2201 笛卡爾樹 RMQ

題意 題目大意 讓你構造一棵笛卡爾樹。笛卡爾樹的節點含有2個值,1個key,乙個value,其中key是主鍵,value是輔鍵。一棵笛卡爾樹就是 key公升序,value公升序或者降序。類似堆。判斷能否構成。ps 此題保證資料相異,必然能夠成 view code 1 include 2 includ...

poj 2201 笛卡爾樹

題意 給定n個二元組 ai,bi 構造笛卡爾樹。按a元素為二叉排序樹,按b元素為小頂堆。思路 用棧當然可以,此處用了rmq來做。另外需要注意笛卡爾樹和treap的區別 treap與笛卡爾樹在結構上是相同的,只是兩者的應用不同。treap的value是隨機值,是為了使樹更加平衡引進的,而笛卡爾樹的va...

POJ 1785 笛卡爾樹 RMQ

題意 給出一些節點,每個節點有兩個值,lable和priority,要求構成乙個笛卡爾樹,按lable是二叉排序樹,按priority是大根堆 不一定完全二叉樹 輸出括號表示。思路 沒什麼好說的,完全自己獨立寫的 除了讀入參考了rainy days的,其他都是獨立創造的 自我感覺寫的還可以 抑鬱,把...