您的位置:首页 > 其它

poj2823:单调队列入门题

2014-10-12 21:03 447 查看
今天学习了一下单调队列这种数据结构,思想不是很难

参考资料:/article/5051962.html

然后自己写成了类的模板形式,并做了例题poj2823

代码如下:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define maxn 10000010
typedef struct Node
{
int val;
int num;
}node;
typedef struct iqueue
{
node q[maxn];
int l,r;
void ini()
{
l=0;
r=0;
}
node front()
{
return q[l];
}
node pop()
{
l++;
return q[l-1];
}
void push(node x)
{
if(r==l)
{
q[r++]=x;
return;
}
if(x.val>=q[l].val)
{
r=l;
q[r++]=x;
return;
}
while(r>=1&&x.val>=q[r-1].val)
{
r--;
}
q[r++]=x;
}
}Iqueue;
typedef struct dqueue
{
node q[maxn];
int l,r;
void ini()
{
l=0;
r=0;
}
node front()
{
return q[l];
}
node pop()
{
l++;
return q[l-1];
}
void push(node x)
{
if(r==l)
{
q[r++]=x;
return;
}
if(x.val<=q[l].val)
{
r=l;
q[r++]=x;
return;
}
while(r>=1&&(x.val<=q[r-1].val))
{
r--;
}
q[r++]=x;
}
}Dqueue;
int big[1000010];
int small[1000010];
Iqueue qi;
Dqueue qd;
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
node x;
node s,b;
int t=0;
qi.ini();
qd.ini();
for(int i=1;i<=n;i++)
{
scanf("%d",&x.val);
x.num=i;
qi.push(x);
qd.push(x);
if(i>=k)
{
b=qi.front();
while(b.num<=i-k)
{
qi.pop();
b=qi.front();
}
s=qd.front();
while(s.num<=i-k)
{
qd.pop();
s=qd.front();
}
big[t]=b.val;
small[t++]=s.val;
}
}
for(int i=0;i<t;i++)
{
printf("%d",small[i]);
if(i==t-1)
puts("");
else
printf(" ");
}
for(int i=0;i<t;i++)
{
printf("%d",big[i]);
if(i==t-1)
puts("");
else
printf(" ");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: