poj 2823单调队列模板题

来源:互联网 发布:mac finder打不开 编辑:程序博客网 时间:2024/04/30 14:02
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃
#define N  1100000
int getmin[N],getmax[N],num[N],n,k,a[N];
int main(){
int i,first,last;
while(scanf("%d%d",&n,&k)!=EOF) {
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
first=1;last=1;
getmin[first]=a[1];
num[first]=1;
for(i=2;i<=k;i++) {
while(a[i]<=getmin[last]&&first<=last)
last--;
getmin[++last]=a[i];
num[last]=i;
}
printf("%d",getmin[first]);
for(i=k+1;i<=n;i++) {
while(a[i]<=getmin[last]&&first<=last)//碰到相等也要改变因为他生命长
last--;
getmin[++last]=a[i];
num[last]=i;
while(num[first]<i-k+1&&first<=last)//如果没有在要求的范围内就舍弃
first++;
printf(" %d",getmin[first]);
}
printf("\n");
first=1;last=1;
getmax[first]=a[1];
num[first]=1;
for(i=2;i<=k;i++) {
while(a[i]>=getmax[last]&&first<=last)
last--;
getmax[++last]=a[i];
num[last]=i;
}
printf("%d",getmax[first]);
for(i=k+1;i<=n;i++) {
while(a[i]>=getmax[last]&&first<=last)
last--;
getmax[++last]=a[i];
num[last]=i;
while(num[first]<i-k+1&&first<=last)
first++;
printf(" %d",getmax[first]);
}
printf("\n");
}
return 0;

}

//二分法

#include<stdio.h>
struct node {
int index,f;
}pmax[1100000],pmin[1100000];
int a[1100000];
int qiulinjie(int front ,int last,int d) {
int mid;
while(front<=last) {
mid=(front+last)/2;
if(pmin[mid].f==d)
return mid;
else
if(pmin[mid].f>d)
last=mid-1;
else
front=mid+1;
}
return front;
}
int qiulinjie1(int front ,int last,int d) {
int mid;
while(front<=last) {
mid=(front+last)/2;
if(pmax[mid].f==d)
return mid;
else
if(pmax[mid].f<d)
last=mid-1;
else
front=mid+1;
}
return front;
}
int main() {
int front,last,i,j,k,n,m;
while(scanf("%d%d",&n,&k)!=EOF) {
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
front=last=1;
pmin[front].index=1;
 pmin[last].f=a[1];
 for(i=2;i<=k;i++) {
 last=qiulinjie(front,last,a[i]);
 pmin[last].index=i;
 pmin[last].f=a[i];
 }
 printf("%d",pmin[front].f);
 for(;i<=n;i++) {
 last=qiulinjie(front,last,a[i]);
 pmin[last].index=i;
 pmin[last].f=a[i];
 while(i-pmin[front].index>=k)
 front++;
 printf(" %d",pmin[front].f);
 }
printf("\n");




front=last=1;
pmax[front].index=1;
 pmax[front].f=a[1];
 for(i=2;i<=k;i++) {
 last=qiulinjie1(front,last,a[i]);
 pmax[last].index=i;
 pmax[last].f=a[i];
 }
 printf("%d",pmax[front].f);
 for(;i<=n;i++) {
 last=qiulinjie1(front,last,a[i]);
 pmax[last].index=i;
 pmax[last].f=a[i];
 while(i-pmax[front].index>=k)
 front++;
 printf(" %d",pmax[front].f);
 }
 printf("\n");
}
 return 0;
}

  


0 0
原创粉丝点击