優先佇列 Fedor and coupons

2021-09-25 06:26:59 字數 1245 閱讀 4306

、這道題可以得到乙個結論就是,重疊區間的左端點一定是某一條線段的左端點;否則可以往左移到左端點處來使得答案更優。因此我們可以列舉左端點,查詢向右的 k

kk 條線段中座標最小的最大。

我們可以進行的操作是,另當前的左端點是重複區間的左端點;因此在左端點小於這個點的線段中尋找右端點最小值最大的 k

kk 條線段,此時可以用優先佇列來進行維護。

具體的操作就是,左端點從小到大進行排序,並將左端點小於等於這個點的線段的右端點加入到小根堆裡頭;將最小的右端點剔除,直到剩下k個為止;這樣就能夠知道了這個右端點。如果長度大於ans

ansan

s,就記錄這個左右端點。

最有把包含這個記錄區間的線段輸出 k

kk 個即可。

code:

#include

using

namespace std;

const

int n =

4e5;

int n, k, ans, l, r;

struct node

} a[n]

;priority_queue<

int, vector<

int>

, greater<

int>

>q;

intread

(void

)bool

cmp(node p1,node p2)

intmain

(void);

sort

(a+1

,a+n+1)

; ans =0;

for(

int i=

1;i<=n;

++i)

} cout<

if(ans ==0)

sort

(a+1

,a+n+

1,cmp)

;for

(int i =

1, j =

1;i <= n && j <= k;i ++)if

(a[i]

.l <= l && a[i]

.r >= r)

printf

("%d "

, a[i]

.id)

, j ++

;return0;

}

優先佇列(3道優先佇列問題)

優先佇列是一種十分強大的資料結構,它保持了一種動態的有序性,對於不斷改變有入隊的操作,而又需要某種最大或最小的操作的問題是再合適不過了,通常優先佇列的實現是由最小堆或者最大堆完成的,並通過堆排序保持佇列的有序性,模擬佇列的結構,在實際比賽中要寫乙個堆排序還是要一定的時間的,但是stl中queue容器...

佇列以及優先佇列

1.佇列 佇列的定義 標頭檔案 include 佇列是一種先進先出的資料結構 佇列的宣告 queueq 宣告字元型別 queueq 宣告結構體型別 以及可以宣告一些自定義的型別 佇列的操作 入佇列 s.push x 出佇列 s.pop 返回佇列的資料數量 s.size 判斷佇列是否為空 s.empt...

堆疊,佇列,優先佇列

包含標頭檔案 include定義 stacks 特點 先進後出。即 像瓶子一樣。先進來的資料在底部。例 輸入 1 2 3 4 5 輸出 5 4 3 2 1 棧的基本操作 s.push a 把元素a入棧。s.pop 刪除棧頂元素。s.top 返回棧頂元素,但不會刪除。s.size 返回棧中元素個數。s...