每週一題 5

2021-10-02 14:00:17 字數 1893 閱讀 4919

小明維護著乙個程式設計師論壇。現在他收集了乙份"點讚"日誌,日誌共有n行。其中每一行的格式是:

ts id

表示在ts時刻編號id的帖子收到乙個"贊"。

現在小明想統計有哪些帖子曾經是"熱帖"。如果乙個帖子曾在任意乙個長度為d的時間段內收到不少於k個讚,小明就認為這個帖子曾是"熱帖"。

具體來說,如果存在某個時刻t滿足該帖在[t, t+d)這段時間內(注意是左閉右開區間)收到不少於k個讚,該帖就曾是"熱帖"。

給定日誌,請你幫助小明統計出所有曾是"熱帖"的帖子編號。

【輸入格式】

第一行包含三個整數n、d和k。

以下n行每行一條日誌,包含兩個整數ts和id。

對於50%的資料,1 <= k <= n <= 1000

對於100%的資料,1 <= k <= n <= 100000 0 <= ts <= 100000 0 <= id <= 100000

【輸出格式】

按從小到大的順序輸出熱帖id。每個id一行。

【輸入樣例】

7 10 2

0 10 10

10 10

10 1

9 1100 3

100 3

【輸出樣例】13

資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

第九屆藍橋杯省賽b組

題目要求:對於100%的資料,1 <= k <= n <= 100000 0 <= ts <= 100000 0 <= id <= 100000。因此定義乙個代表最大長度的常量:const int maxn=100005

int

main()

int k=0;

for(

int i=

0;i(judge

(i))

//對每個id進行判斷

ans[k++

]=i;

for(

int i=

0;i) cout<

}

接下來就是編寫函式judge()。因為要求被點讚k次以上的才算,也就是說每個容器只有元素個數大等於k是才有可能滿足,因此可以直接先將所有元素個數小於k的篩掉。隨後由於輸入時不一定是要按照從小到大的順序輸入,所以要先將容器排好序。最後採用尺取法,右邊界向右延申,當被點讚個數不小於k次時,如果時間是在d以內的,就說明滿足條件返回乙個真值,如果時間超過了d,那麼就要捨棄掉最左邊的時間,左邊界右移,右邊界繼續向右移。如果從始至終都不滿足條件,就說明該日誌不是「熱帖」,返回false。

bool

judge

(int x)

r++;}

return

false

;}

完整示例如下:

#include

#include

#include

using

namespace std;

const

int maxn=

1e5+5;

vector<

int> v[maxn]

;int ans[maxn]

;int n,d,k;

bool

judge

(int x)

r++;}

return0;

}int

main()

int k=0;

for(

int i=

0;i(judge

(i))

ans[k++

]=i;

for(

int i=

0;i) cout<

}

hihoCoder每週一題

時間限制 10000ms 單點時限 1000ms include include include include includeusing namespace std int n,m define max 26 struct trie trie void createtrie char str el...

每週一題(1)

把2019分解成3個各不相同的正整數之和,並且要求每個正整數都不包含數字2和4.一共有多少種不同的分割方法。注意交換3個整數的順序被視為同一種方法1,例如1000 1001 18和1001 1000 18被視為同一種。這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為乙個整數,在提交答案...

每週一題 4

如圖p1.png所示的螺旋折線經過平面上所有整點恰好一次。對於整點 x,y 我們定義它到原點的距離dis x,y 是從原點到 x,y 的螺旋折線段的長度。例如dis 0,1 3,dis 2,1 9 給出整點座標 x,y 你能計算出dis x,y 嗎?輸入格式 x和y對於40 的資料,1000 x,y...