两个单调队列代码

来源:互联网 发布:大数据技术应用 编辑:程序博客网 时间:2024/06/06 08:24

好久没写题解了,可耻啊可耻

POJ 2823 点击打开链接

FZOJ 1894 点击打开链接


POJ 2823

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cstdlib>#include<map>#include<queue>#include<vector>using namespace std;const int MAXN = 1000020;struct node{    int sq,val;}p[MAXN];int n,a[MAXN],k;int q[MAXN];void get_min(){    int front=0,rear=0;    for(int i=1;i<k;i++)    {        while(rear>front&&p[i].val<p[q[rear-1]].val)rear--;        q[rear++]=i;    }    for(int i=k;i<=n;i++)    {        while(rear>front&&p[i].val<p[q[rear-1]].val)rear--;        q[rear++]=i;        while(p[q[rear-1]].sq-p[q[front]].sq>=k)front++;        printf("%d ",p[q[front]].val);    }    printf("\n");//    while(rear>front&&p[n].val<p[q[rear-1]].val)rear--;//    q[rear++]=n;//    while(p[q[rear-1]].sq-p[q[front]].sq>=k)front++;//    printf("%d\n",p[q[front]].val);}void get_max(){    int front=0,rear=0;    for(int i=1;i<k;i++)    {        while(rear>front&&p[i].val>p[q[rear-1]].val)rear--;        q[rear++]=i;    }    for(int i=k;i<=n;i++)    {        while(rear>front&&p[i].val>p[q[rear-1]].val)rear--;        q[rear++]=i;        while(p[q[rear-1]].sq-p[q[front]].sq>=k)front++;        printf("%d ",p[q[front]].val);    }    printf("\n");//    while(rear>front&&p[n].val>p[q[rear-1]].val)rear--;//    q[rear++]=n;//    while(p[q[rear-1]].sq-p[q[front]].sq>=k)front++;//    printf("%d\n",p[q[front]].val);}int main(){    // freopen("2823.txt","r",stdin);    while(scanf("%d%d",&n,&k)!=EOF)    {        for(int i=1;i<=n;i++){scanf("%d",&p[i].val);p[i].sq=i;}        get_min();        get_max();    }    return 0;}

FZOJ 1894

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cstdlib>#include<map>#include<queue>#include<vector>using namespace std;const int MAXN = 1000020;struct node{    int sq,val;}p[MAXN];int ic,RM_tar;int front,rear;int q[MAXN];void Add_person(){    char name[10];    scanf("%s%d",name,&p[ic].val);    p[ic].sq=ic;    while(rear>front&&p[ic].val>p[q[rear-1]].val)rear--;    q[rear++]=ic++;}void Query(){    int ans;    if(rear<=front)ans=-1;    else ans=p[q[front]].val;    printf("%d\n",ans);}void Remove_person(){    if(RM_tar>=q[front])front++;    RM_tar++;}void solve(){    RM_tar = ic = front = rear = 0;    bool end=false;    char cmd[10];    scanf("%s",cmd);    while(1)    {        scanf("%s",cmd);        switch (cmd[0])        {            case 'C':Add_person();break;            case 'Q':Query();break;            case 'G':Remove_person();break;            case 'E':end=true;break;            default :cout<<"Fuck you!!!!!!!"<<endl;        }        if(end)break;    }}int main(){    freopen("fuzhou1893.txt","r",stdin);    int T;    scanf("%d",&T);    while(T--)    {        solve();    }    return 0;}




原创粉丝点击