有\(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遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...