标签:
| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 46507 | Accepted: 13442 | |
| Case Time Limit: 5000MS | ||
Description
| Window position | Minimum value | Maximum value |
|---|---|---|
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
Source
POJ Monthly--2006.04.28, Ikki
固定区间长度一维的数组就好,二维超内存
ac代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
int maxv[1000010],minv[1000010],a[1000010],n,m,k;
void init()
{
int i,j;
for(i=1;i<=n;i++)
{
minv[i]=a[i];
maxv[i]=a[i];
}
for(i=1;i<=k;i++)
{
for(j=1;j+(1<<i)-1<=n;j++)
{
minv[j]=min(minv[j],minv[j+(1<<(i-1))]);
maxv[j]=max(maxv[j],maxv[j+(1<<(i-1))]);
}
}
}
int q_max(int l,int r)
{
// int k=(int)(log((double)(r-l+1))/log(2.0));
return max(maxv[l],maxv[r-(1<<k)+1]);
}
int q_min(int l,int r)
{
// int k=(int)(log((double)(r-l+1))/log(2.0));
return min(minv[l],minv[r-(1<<k)+1]);
}
int main()
{
// int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
k=(int)(log(double(m))/log(2.0));
init();
if(m<=n)
{
printf("%d",q_min(1,m+1-1));
}
for(i=2;i+m-1<=n;i++)
{
printf(" %d",q_min(i,m+i-1));
}
printf("\n");
if(m<=n)
{
printf("%d",q_max(1,m+1-1));
}
for(i=2;i+m-1<=n;i++)
{
printf(" %d",q_max(i,m+i-1));
}
printf("\n");
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 题目2823 Sliding Window(RMQ,固定区间长度)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47083283