andre_joy

导航

poj 2823

地址:http://poj.org/problem?id=2823

题意:n个数里面连续的k个数,找最大和最小的。

mark:优先队列,不过要重载一下cmp函数。

   也可以单调队列做。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int queue[1000010];
int a[1000010];
int m,n;

void solve(int f)
{
    int i,j,k;
    int fr,la;
    fr = la = 0;
    queue[la++] = 0;
    for(i = 1; i < m; i++)
    {
        while(f*a[i] <= f*a[queue[la-1]])
        {
            la--;
            if(la == fr) break;
        }
        queue[la++] = i;
    }
    printf("%d", a[queue[fr]]);
    for(i = m; i < n; i++)
    {
        while(f*a[i] <= f*a[queue[la-1]])
        {
            la--;
            if(la == fr) break;
        }
        queue[la++] = i;
        if(la-fr > m) fr = la-m;
        while(queue[la-1]-queue[fr] >= m) fr++;
        printf(" %d", a[queue[fr]]);
    }
    printf("\n");
}

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out1.txt", "w", stdout);
    int i;
    while(~scanf("%d%d", &n, &m))
    {
        for(i = 0; i < n; i++)
            scanf("%d", a+i);
        solve(1);
        solve(-1);
    }
    return 0;
}

 

#include <stdio.h>
#include <string.h>
#include <queue>
#include <stdlib.h>

using namespace std;

int s[1000010];
int max1[1000010],min1[1000010];

struct cmp1
{
    bool operator()(int a, int b)
    {
        return s[a] < s[b];
    }
};

struct cmp2
{
    bool operator()(int a, int b)
    {
        return s[a] > s[b];
    }
};

int main()
{
    int n,m;
    int i,j,k;
    while(~scanf("%d%d", &n, &m))
    {
        priority_queue<int, vector<int>, cmp1> insq;
        priority_queue<int, vector<int>, cmp2> desq;
        for(i = 0; i < n; i++)
        {
            scanf("%d", &s[i]);
            if(i < m)
            {
                insq.push(i);
                desq.push(i);
            }
        }
        j = 0;
        max1[j] = insq.top();
        min1[j++] = desq.top();
        for(i = m; i < n; i++)
        {
            insq.push(i);
            while(i-insq.top() >= m) insq.pop();
            desq.push(i);
            while(i-desq.top() >= m) desq.pop();
            max1[j] = insq.top();
            min1[j++] = desq.top();
        }
        for(i = 0; i < j; i++)
        {
            if(i) printf(" ");
            printf("%d", s[min1[i]]);
        }
        printf("\n");
        for(i = 0; i < j; i++)
        {
            if(i) printf(" ");
            printf("%d", s[max1[i]]);
        }
        printf("\n");
    }
    return 0;
}

posted on 2012-08-03 15:33  andre_joy  阅读(174)  评论(0编辑  收藏  举报