POJ 2823

来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/06/05 15:36
思路:据说是单调队列,我用线段树过的。。。

#include<iostream>#include<cstdio>#define MAX 1000005using namespace std;typedef struct{    int left, right, mid, min, max;}NodeTree;NodeTree node[4*MAX];int maxn, minn, min_num[MAX],max_num[MAX];void BuildTree(int k, int l, int r){    node[k].left = l;    node[k].right = r;    node[k].mid = (l + r) >> 1;    node[k].max = -10000000;    node[k].min = 10000000;    if(l == r)        return;    int mid = (l + r) >> 1;    BuildTree(k << 1, l, mid);    BuildTree(k << 1|1, mid+1, r);}void UpdateTree(int k, int l, int r, int num){    if(node[k].max < num)        node[k].max = num;    if(node[k].min > num)        node[k].min = num;    if(node[k].left == node[k].right)        return;    if(node[k].mid < l)        UpdateTree(k << 1|1, l, r, num);    else if(node[k].mid >= r)        UpdateTree(k << 1, l, r, num);    else    {        UpdateTree(k << 1, l, node[k].mid, num);        UpdateTree(k << 1|1, node[k].mid + 1, r, num);    }}void GetResult(int k, int l, int r){    if(node[k].left ==l && node[k].right==r)    {        minn = min(minn, node[k].min);        maxn = max(maxn, node[k].max);        return;    }    if(node[k].mid < l)        GetResult(k << 1|1, l, r);    else if(node[k].mid >= r)        GetResult(k << 1, l, r);    else    {        GetResult(k << 1, l, node[k].mid);        GetResult(k << 1|1, node[k].mid + 1, r);    }}int main(int argc, char const *argv[]) {    int n, k, i, temp;    freopen("in.c", "r", stdin);    while(~scanf("%d%d", &n, &k))    {        BuildTree(1, 1, n);        for(i = 1;i <= n;i ++)        {            scanf("%d", &temp);            UpdateTree(1, i, i, temp);        }        int j = 0;        for(i = 1;i < n - k  + 2;i ++)        {            minn = 10000000;            maxn = -10000000;            GetResult(1, i, i+k-1);            min_num[j] = minn;            max_num[j ++] = maxn;        }        for(i = 0;i < n - k;i ++)            printf("%d ", min_num[i]);        printf("%d\n", min_num[i]);        for(i = 0;i < n - k;i ++)            printf("%d ", max_num[i]);        printf("%d\n", max_num[i]);    }    return 0;}


0 0
原创粉丝点击