| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
O(nlogn) 的单调队列+二分查找为什么WA?#include <cstdio>
const int MAXN = 1000000;
int q[MAXN + 1], min[MAXN + 1], max[MAXN + 1];
int n,k;
void input()
{
int i;
scanf("%d %d",n, &k);
for (i = 1; i <= n; i++)
scanf("%d",q[i]);
}
int BSearchMin(int l, int r, int value)
/* 在一个维护最小值的单调队列min[]中二分查找位置k,使得q[min[k]]>= value */
{
if (value <= q[min[l]]) return l;
for ( ; l < r; )
{
int mid = (l + r) >> 1;
if (q[min[mid]] < value) l = mid + 1;
else r = mid;
}
return r;
}
void MaintainMin()
{
int i, rank;
int Minhead, Mintail;
Minhead = Mintail = 1;
min[Minhead] = 1;
for (i = 2; i <= n; i++)
{
if (q[i] > q[min[Mintail]]) Mintail++;
else
{
rank = BSearchMin(Minhead, Mintail, q[i]);
/* 因为在q[min[Minhead..Mintail]]里面的元素是单调递增的 */
Mintail = rank;
/* 实现满足q[min[]]>= value 的元素的删除 */
}
min[Mintail] = i;
if (i < k) continue;
while (i - min[Minhead] >= k) Minhead++;
/* 如果当前单调队队列min中的队首元素q[min[Minhead]]不在考虑区间范围,出列 */
if (i == n) continue;
printf("%d ",q[min[Minhead]]);
}
printf("%d\n",q[min[Minhead]]);
}
int BSearchMax(int l, int r, int value)
/* 在一个维护最小值的单调队列max[]中二分查找位置k,使得q[max[k]]<= value */
{
if (value >= q[max[l]]) return l;
for ( ; l < r; )
{
int mid = (l + r) >> 1;
if (q[max[mid]] > value) l = mid + 1;
else r = mid;
}
return r;
}
void MaintainMax()
{
int i, rank;
int Maxhead, Maxtail;
Maxhead = Maxtail = 1;
max[Maxhead] = 1;
for (i = 2; i <= n; i++)
{
if (q[i] < q[max[Maxtail]]) Maxtail++;
else
{
rank = BSearchMax(Maxhead, Maxtail, q[i]);
/* 因为在q[max[Minhead..Mintail]]里面的元素是单调递减的 */
Maxtail = rank;
/* 实现满足q[max[]]<= value 的元素的删除 */
}
max[Maxtail] = i;
if (i < k) continue;
while (i - max[Maxhead] >= k) Maxhead++;
/* 如果当前单调队队列max中的队首元素q[max[Maxhead]]不在考虑区间范围,出列 */
if (i == n) continue;
printf("%d ",q[max[Maxhead]]);
}
printf("%d\n",q[max[Maxhead]]);
}
int main()
{
input();
MaintainMin();
MaintainMax();
return 0;
}
不知道为什么提交上去WA。。
还有要不是给了头文件为#include <cstdio>
要是改为#include <iostream>
using namespace std;
就会出现编译错误。。。不知道为什么
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator