[单调队列] poj 2823 Sliding Window
2015-07-25 10:40
295 查看
题意:
给你n个数和一个k
把n分成连续的n-k+1个区间
第一行按顺序输出每个区间的最小值,第二行是最大值。
思路:
单调队列的模板题,这里注意的是插入队尾的时候需要二分加速
代码:
给你n个数和一个k
把n分成连续的n-k+1个区间
第一行按顺序输出每个区间的最小值,第二行是最大值。
思路:
单调队列的模板题,这里注意的是插入队尾的时候需要二分加速
代码:
#include"stdio.h" #include"algorithm" #include"string.h" #include"iostream" #include"queue" #include"map" #include"vector" #include"string" #include"cmath" using namespace std; #define N 2222222 struct node { int x,s; }; int cmp(node a,node b) { return a.s<b.s; } int cmp1(node a,node b) { return a.s>b.s; } node q ,v ; int finde_max(int l,int r,int k) { int ans=-1; while(l<=r) { int mid=(l+r)/2; if(q[mid].s>k) { ans=mid; l=mid+1; } else r=mid-1; } return ans; } int finde_min(int l,int r,int k) { int ans=-1; while(l<=r) { int mid=(l+r)/2; if(q[mid].s<k) { ans=mid; l=mid+1; } else r=mid-1; } return ans; } int main() { int n,k; while(scanf("%d%d",&n,&k)!=-1) { for(int i=1; i<=n; i++) { scanf("%d",&v[i].s); v[i].x=i; } int head=0,ed=0; for(int i=1;i<=k;i++) q[ed++]=v[i]; sort(q,q+k,cmp); for(int i=k; i<=n; i++) { if(head>ed) q[++ed]=v[i]; //入队 else { int tep=finde_min(head,ed,v[i].s); if(tep==-1) q[ed=head]=v[i]; else q[ed=tep+1]=v[i]; } while(q[head].x+k<=i) head++; //出队 printf(i==n?"%d\n":"%d ",q[head].s); } head=0,ed=0; for(int i=1;i<=k;i++) q[ed++]=v[i]; sort(q,q+k,cmp1); for(int i=k; i<=n; i++) { if(head>ed) q[++ed]=v[i]; //入队 else { int tep=finde_max(head,ed,v[i].s); if(tep==-1) q[ed=head]=v[i]; else q[ed=tep+1]=v[i]; } while(q[head].x+k<=i) head++; //出队 printf(i==n?"%d\n":"%d ",q[head].s); } } return 0; }
相关文章推荐
- 保留所有权限迁移文件服务器
- 关于不能往yahoo,sina等地址发邮件的问题
- JAVA学习笔记三
- P值之死
- 文章标题
- CMD应用 qtp/winshell/cmd的交互
- P值之死
- java新手笔记14 类继承示例
- Android开发学习笔记十七 PullToRefreshListView
- 排查bug的步骤
- hdu1234 开门人和关门人 (等价转换)
- generate_system_font.hdev训练系统字体 相关例程学习
- Android Api Demos登顶之路(五)
- 顺利做好IP反向解析(PTR记录)
- 亲身经历:软件线程数量超过硬件线程数量造成的性能问题
- Python实现的RSS阅读器实例
- SweetAlert,清新文艺,快意灵动的甜心弹框
- Sublime Text使用简介
- 类和对象(一)
- Activity的四种启动模式和onNewIntent()