小明維護著乙個程式設計師論壇。現在他收集了乙份"點讚"日誌,日誌共有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...