博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2823单调队列模板题
阅读量:5312 次
发布时间:2019-06-14

本文共 2367 字,大约阅读时间需要 7 分钟。

#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;
}

  

转载于:https://www.cnblogs.com/thefirstfeeling/p/4410873.html

你可能感兴趣的文章
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
【转】OO无双的blocking/non-blocking执行时刻
查看>>
ul li剧中对齐
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
云计算数据与信息安全防护
查看>>
全局设置导航栏
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>