您的位置:首页 > 其它

poj - 2823 - Sliding Window(单调队列)

2014-10-22 02:45 447 查看
题意:n个数的序列,长为k个数的窗口,窗口从左从右移,问窗口移动过程中每个状态的最小最大值。

题目链接:http://poj.org/problem?id=2823

——>>单调队列练手。。

C++用时5391MS,G++会TLE。。不解。。望路过的朋友指导一下原因。。

#include <cstdio>
#include <vector>
#include <queue>

const int MAXN = 1000000 + 1;

int arrIn[MAXN];
int arrRet[MAXN];
int arrDq[MAXN];
int arrId[MAXN];

void Pop(const int& nVal, const bool& bFlag, const int& nFront, int& nTail)
{
if (!bFlag)
{
while (nFront != nTail && nVal <= arrDq[nTail - 1])
{
nTail--;
}
}
else
{
while (nFront != nTail && nVal >= arrDq[nTail - 1])
{
nTail--;
}
}
}

void GetRet(int n, int k, bool bFlag = false)
{
int nFront = 0;
int nTail = 0;

for (int i = 0; i < n; ++i)
{
Pop(arrIn[i], bFlag, nFront, nTail);
arrDq[nTail++] = arrIn[i];
arrId[nTail - 1] = i;
while (nFront != nTail && arrId[nFront] <= i - k)
{
nFront++;
}
if (i >= k - 1)
{
arrRet[i - k + 1] = arrDq[nFront];
}
}
}

void Read(int n)
{
getchar();
for (int i = 0; i < n; ++i)
{
scanf("%d", arrIn + i);
}
}

void Output(int* arr, int n)
{
for (int i = 0; i < n - 1; ++i)
{
printf("%d ", arr[i]);
}
if (n)
{
printf("%d\n", arr[n - 1]);
}
}

int main()
{
int n, k;

while (scanf("%d%d", &n, &k) == 2)
{
Read(n);
GetRet(n, k);
Output(arrRet, n - k + 1);
GetRet(n, k, true);
Output(arrRet, n - k + 1);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: