第九屆藍橋杯真題B組 第8題
阿新 • • 發佈:2019-01-29
標題:日誌統計
小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有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 1
0 10
10 10
10 1
9 1
100 3
100 3
【輸出樣例】
1
3
本程式碼不講解,僅供本人存檔
#include <cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<iostream> using namespace std; typedef long long ll; int n,d,k; const int maxn = 1e5+4; int p[maxn]; int judge[maxn]; vector<int> v[maxn]; vector<int> ans; int main() { cin>>n>>d>>k; memset( judge,0,sizeof judge); memset(p,0,sizeof p); int r = 0; int time,id; for( int i = 1 ; i <= n ; i++ ) { scanf("%d %d",&time,&id); v[time].push_back(id); r = max(r,time); } for( int i = 0 ; i < d ; i++ ) { for( int j = 0 ; j < v[i].size() ; j++ ) { p[ v[i][j] ]++; if( p[ v[i][j] ] >= k && judge[ v[i][j] ] == 0 ) { ans.push_back( v[i][j] ); judge[ v[i][j] ] = 1; } } } for( int i = d ; i <= r ; i++ ) { int l = i-d; for( int j = 0 ; j < v[l].size() ; j++ ) p[ v[l][j] ]--; for( int j = 0 ; j < v[i].size() ; j++ ) { p[ v[i][j] ]++; if( p[ v[i][j] ] >= k && judge[ v[i][j] ] == 0 ) { ans.push_back( v[i][j] ); judge[ v[i][j] ] = 1; } } } sort(ans.begin(),ans.end()); for( int i = 0 ; i < ans.size() ; i++ ) printf("%d\n",ans[i]); return 0; } /* 8 4 3 9 6 2 3 1 5 */