洛谷 P1878 舞蹈課 解題報告

2022-04-30 05:48:10 字數 972 閱讀 3687

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

任務是模擬以上過程,確定跳舞的配對及順序。

第一行為正整數\(n(1<=n<=2*10^5)\):隊伍中的人數。下一行包含\(n\)個字元\(b\)或者\(g\),\(b\)代表男,\(g\)代表女。下一行為\(n\)個整數\(a_i(a_i<=10^7)\)。所有資訊按照從左到右的順序給出。在50%的資料中,n<=200。

第一行:出列的總對數\(k\)。接下來輸出\(k\)行,每行是兩個整數。按跳舞順序輸出,兩個整數代表這一對舞伴的編號(按輸入順序從左往右1至n編號)。請先輸出較小的整數,再輸出較大的整數。

思路:用二叉堆維護差值,用陣列模擬鍊錶,取出時判斷是否已經用過即可。

code:

#include #include using namespace std;

int abs(int x)

const int n=200010;

struct node

node(int l,int r,int w)

bool friend operator <(node n1,node n2)

};priority_queue q;

int score[n],color[n],vis[n],n,pre[n],suc[n],ans[n][2];

void init()

suc[n]=0;

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

scanf("%d",score+i);

for(int i=1;i2018.7.4

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

給定 n 個人,每個人有乙個舞蹈技術值,相鄰且舞蹈技術值相差最小的一對異性會出隊,求出隊的總次數以及出隊的順序。首先看到最小值,可以想到用小根堆來實現。先將每一種可能的出隊方案儲存到小根堆中。可以定義乙個陣列來表示是否出隊。如果相鄰的舞者有人已經出隊,便跳過。每一次出隊以後,就會產生一對新的相鄰舞者...

洛谷P3372解題報告

題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...

洛谷P1342 請柬解題報告

求去的路徑與回來的路徑和 1 n m 1000000 1 le n,m le 1000000 1 n,m 1000 000最短路 對於第一次碰到這種模型的oiers,這個地方可以講講的。顯然我們可以暴力跑n遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...