关闭

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

284人阅读 评论(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网站的观点或立场
    个人资料
    • 访问:251521次
    • 积分:10098
    • 等级:
    • 排名:第1813名
    • 原创:743篇
    • 转载:4篇
    • 译文:0篇
    • 评论:188条
    最新评论
    文章分类