洛谷 P1878 舞蹈課(鍊錶 二叉堆)

2022-09-09 12:39:11 字數 906 閱讀 7189

給定\(n\)個人,每個人有乙個舞蹈技術值,相鄰且舞蹈技術值相差最小的一對異性會出隊,求出隊的總次數以及出隊的順序。

首先看到最小值,可以想到用小根堆來實現。

先將每一種可能的出隊方案儲存到小根堆中。

可以定義乙個陣列來表示是否出隊。如果相鄰的舞者有人已經出隊,便跳過。

每一次出隊以後,就會產生一對新的相鄰舞者,可以用陣列模擬鍊錶來儲存每一位舞者邊上的人。出隊後便將這一對舞者從鍊錶中刪去,同時在答案陣列中記錄。再判斷新產生的一對相鄰舞者是否滿足出隊要求(注意特判邊界情況)。

最終得到的便是本題的答案。

#include#includeusing namespace std;

const int n=2e5+10;

int n,a[n],nex[n],***[n],pre[n],ans[n][2],cnt;

bool st[n];

char s[n];

int abs(int a)

struct node

};priority_queueq;

int main()

for(int i=1;in||pre[now.l]<1) continue; //特判邊界

if((***[pre[now.l]]^***[nex[now.r]])==1) q.push(node);

//判斷新產生的相鄰舞者是否滿足出隊要求

} }printf("%d\n",cnt);

for(int i=1;i<=cnt;i++) printf("%d %d\n",ans[i][0],ans[i][1]);

return 0;

}

洛谷 P1878 舞蹈課 解題報告

有 n 個人參加乙個舞蹈課。每個人的舞蹈技術由整數來決定。在舞蹈課的開始,他們從左到右站成一排。當這一排中至少有一對相鄰的異性時,舞蹈技術相差最小的那一對會出列並開始跳舞。如果不止一對,那麼最左邊的那一對出列。一對異性出列之後,隊伍中的空白按原順序補上 即 若隊伍為 abcd 那麼 bc 出列之後隊...

堆 洛谷P3378 二叉堆模板

如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 支援兩種操作 1.往乙個集合加乙個數。2.從集合中刪去乙個優先值最大的元素。規則每個結點比兒子優先順序大。插入規則 先插入到最後乙個結點,然後不...

二叉堆 洛谷P1090 合併果子

lp1090 本題需要畫一下圖 可以觀察到 每個果子的代價 重量 在樹中深度 考慮如果構造乙個深度越深的結點權值越小,就能達到最小權值。那麼本題的做法就變成了每次選最小的兩堆果子合併。這個可以用二叉堆來做。include include include include include define ...