关闭

[51nod1786]数据流中的算法 - 众数

355人阅读 评论(0) 收藏 举报
分类:

题目描述

数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献。但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数)。如果有多个众数,取用户ID最小的一个。(窗口的意思是一个固定长度的区间!)

(因为数据流是实时的、在线的,所以不允许使用离线算法^_^)

做法

一个map+一个set

#include<cstdio>
#include<algorithm>
#include<set>
#include<map>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
struct dong{
    int x,y;
    friend bool operator <(dong a,dong b){
        return a.x>b.x||a.x==b.x&&a.y<b.y;
    }
} zlt;
map<int,int> f;
multiset<dong> s;
int a[5000000+10],sta[80];
int i,j,k,l,t,n,m,tot,top;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void ins(int x){
    if (f[x]){
        zlt.x=f[x];
        zlt.y=x;
        s.erase(s.find(zlt));
    }
    f[x]++;
    zlt.x=f[x];
    zlt.y=x;
    s.insert(zlt);
}
void del(int x){
    zlt.x=f[x];
    zlt.y=x;
    s.erase(s.find(zlt));
    f[x]--;
    if (f[x]){
        zlt.x=f[x];
        zlt.y=x;
        s.insert(zlt);
    }
}
void write(int x){
    if (!x){
        putchar('0');
        putchar('\n');
        return;
    }
    top=0;
    while (x){
        sta[++top]=x%10;
        x/=10;
    }
    while (top) putchar('0'+sta[top--]);
    putchar('\n');
}
int main(){
    n=read();k=read();
    tot=0;
    fo(i,1,n){
        t=read();
        if (t==1){
            a[++tot]=read();
            if (tot>k) del(a[tot-k]);
            ins(a[tot]);
        }
        else write((*s.begin()).y);
    }
}
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

算法设计--众数和重数问题(分治法)

问题描述: 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的...
  • chencong3139
  • chencong3139
  • 2016-10-19 21:36
  • 3403

众数问题(分治法求解-mtzhang)

一、问题描述 给定含有n个元素的多重集合s,每个元素在s中出现的次数称为该元素的重数,多重集s中重数最大 的元素称为众数,给定多重集合s,求s中的众数集重数。 二、算法思想及描述 我在网上看了,感觉都...
  • MSTZhang
  • MSTZhang
  • 2016-10-30 13:12
  • 3634

分治法求解集合的众数及其重数

1、 分治法 分治法解题过程主要分为分、治、合三个步骤“,应用该方法的基本过程如下: (1) 将原问题分解为若干个规模较小的子问题 (2) 对这些子问题分别求解 (3) 对各个子问题的解进行合...
  • liu_005
  • liu_005
  • 2015-11-23 19:48
  • 3645

51Nod - 1786-数据流中的算法 - 众数

题目描述数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献。但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数)。如果有多个众数,取用户ID最小的一个。(窗...
  • fadedsun
  • fadedsun
  • 2017-08-02 17:30
  • 112

51Nod - 1786 数据流中的算法 - 众数

1786 数据流中的算法 - 众数 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 数据流统计功能上线后,为51nod提升用户体...
  • DlPF_C
  • DlPF_C
  • 2017-08-02 21:26
  • 99

51nod 1786 数据流中的算法 - 众数

set+map
  • SenyeLicone
  • SenyeLicone
  • 2017-06-28 19:48
  • 327

51Nod 1786 数据流中的算法-众数 题解

题目链接 51Nod-1786 数据流中的算法 - 众数 题意 有一个窗口,窗口中只能存k 个数据,新的数据只能从末尾添加,如果数据量超过k,就删除最先添加进去的数据,在线询问窗口中数据的众数...
  • CSDNjiangshan
  • CSDNjiangshan
  • 2017-07-18 10:26
  • 284

51Nod-TalkingData数据科学精英夏令营挑战赛-D-数据流中的算法-众数

ACM模版描述题解map+set 搞搞就行了,用 map 打标签,用 set 返回某时某刻的最大值,另外用一个数组 pass 记录网页,相当于队列,如果全部用 STL 应该也是可以过的,不过这里注意要...
  • f_zyj
  • f_zyj
  • 2017-06-18 01:07
  • 306

51nod-1785:数据流中的算法

1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 51nod近日上线了用户满意度检测工具,使用高级...
  • Jaihk662
  • Jaihk662
  • 2017-02-28 21:36
  • 478

51NOD1785 数据流中的算法 【水】

1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问...
  • LuRiCheng
  • LuRiCheng
  • 2017-02-24 21:48
  • 286
    个人资料
    • 访问:327183次
    • 积分:11634
    • 等级:
    • 排名:第1512名
    • 原创:814篇
    • 转载:4篇
    • 译文:0篇
    • 评论:201条
    最新评论
    文章分类