zoukankan      html  css  js  c++  java
  • 2018初赛 H 日志统计

    小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。
    其中每一行的格式是:ts id。表示在ts时刻编号id的帖子收到一个"赞"。  
    现在小明想统计有哪些帖子曾经是"热帖"。
    如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。  
    具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。  
    给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。  

    输入

    第一行包含三个整数N、D和K。  
    以下N行每行一条日志,包含两个整数ts和id。 
    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 <bits/stdc++.h>
    
    using namespace std;
    #define int long long
    const int maxn = 1e5 + 10;
    int n,d,k;
    vector<int> ve[maxn];
    int ans[maxn];
    int m;
    int check(int x){
        int len = ve[x].size();
        if(len < k)
            return 0;
        sort(ve[x].begin(),ve[x].end());
        int l = 0,r = 0,sum = 0;
        while(l <= r && r < len){
            sum++;//收到赞的个数
            if(sum >= k){
                if(ve[x][r] - ve[x][l] < d)
                    return 1;
                else l++,sum--;
            }
            r++;
        }
        return 0;
    }
    
    signed main() {
        //freopen("in","r",stdin);
        ios::sync_with_stdio(0);
        cin >> n >> d >> k;
        for (int i = 0; i < n; i++) {
            int ts,id;
            cin >> ts >> id;
            ve[id].push_back(ts);
        }
        for(int i = 0; i < maxn; i++){
            if(check(i))
                ans[++m] = i;
        }
        for(int i = 1; i <= m; i++)
            cout << ans[i] << endl;
        return 0;
    }

  • 相关阅读:
    第一次博客作业
    编辑器、编译器、文件、IDE等常见概念辨析
    树、二叉树、查找知识点总结
    二叉排序树
    线性表知识点总结
    c语言文件
    第二次博客作业: 函数+进制转换器v1.0beta
    python作业1
    c语言知识
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12717594.html
Copyright © 2011-2022 走看看