[51nod1786]数据流中的算法

来源:互联网 发布:python kgram算法 编辑:程序博客网 时间:2024/06/14 17:33

题目描述

数据流统计功能上线后,为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);    }}
原创粉丝点击