1. 程式人生 > >第九屆藍橋杯真題B組 第8題

第九屆藍橋杯真題B組 第8題



標題:日誌統計


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