poj 2823【单调队列】
来源:互联网 发布:js图片上传预览删除 编辑:程序博客网 时间:2024/05/21 10:05
http://poj.org/problem?id=2823
基础单调队列。用STL的deque竟然TLE!!!无论c++还是g++。。。
而用数组做提交c++ac了,提交g++TLE不明白为啥这样子
堆操作:先对尾部进行操作,以小根堆为例:当从尾部加入一个元素后,检查前面时候有比他大的,有就删除前面,而此元素就向前推进,直至没有比它大的,没有就直接塞入;
然后对队列的头进行操作:检查下标是否满足特定范围之内,不满足就删除,最后取第一个就是当前结果。
以这题为例,操作一下这个流程,加深理解
1 3 -1 -3 5 3 6 7
队列 输出
1
1 3
-1(1,3均比-1大,所以删除) -1
-3 -3
-3 5 -3
-3 3 -3
3 6(因为-3的下标已经超出范围,所以要delete) 3
3 6 7 3
***********************************************************************我是分割线***********************************************************************
AC代码:
#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N 1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int Minq[N],Maxq[N];int index[N],que[N];int a[N];int n,m;void Min(){ int i,j,k; int head=1,tail=0; for(i=1;i<=n;i++){ while(head<=tail && que[tail]>a[i]) tail--; tail++; que[tail]=a[i]; index[tail]=i; if(i>=m){ while(index[head]<i-m+1) head++; Minq[i-m]=que[head]; } }}void Max(){ int i,j,k; int head=1,tail=0; for(i=1;i<=n;i++){ while(head<=tail && que[tail]<a[i]) tail--; tail++; que[tail]=a[i]; index[tail]=i; if(i>=m){ while(index[head]<i-m+1) head++; Maxq[i-m]=que[head]; } }}int main(){ while(scanf("%d%d",&n,&m)!=EOF){ int i,j,k; for(i=1;i<=n;i++) scanf("%d",&a[i]); Min(); printf("%d",Minq[0]); for(i=1;i<n-m+1;i++)printf(" %d",Minq[i]); printf("\n"); Max(); printf("%d",Maxq[0]); for(i=1;i<n-m+1;i++)printf(" %d",Maxq[i]); printf("\n"); } return 0;}
TLE代码:
#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a>b?b:a;}#define LL __int64#define pi acos(-1)#define N 1000010#define INF INT_MAX#define eps 1e-8#define FRE freopen("a.txt","r",stdin)struct node{ int num; int id;};deque<node> dmin,dmax;int ans[N];int main(){ //FRE; int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j; int cnt=1; dmin.clear(); dmax.clear(); node p; int tot=0; while(n--) { scanf("%d",&p.num); while(!dmin.empty() && dmin.front().id<cnt-m+1)dmin.pop_front(); while(!dmin.empty() && dmin.back().num>p.num)dmin.pop_back(); while(!dmax.empty() && dmax.front().id<cnt-m+1)dmax.pop_front(); while(!dmax.empty() && dmax.back().num<p.num)dmax.pop_back(); p.id=cnt++; dmin.push_back(p); dmax.push_back(p); if(cnt>m) { a[tot++]=dmax.front().num; printf("%d ",dmin.front().num); } } printf("\n"); for(i=0;i<tot;i++)printf("%d ",a[i]); printf("\n"); } return 0;}
- Poj 2823 (单调队列)
- poj 2823【单调队列】
- POJ 2823 单调队列
- POJ-2823单调队列
- POJ 2823 单调队列
- poj 2823 单调队列
- 单调队列 POJ 2823
- poj 2823 单调队列
- POJ 2823 单调队列
- poj 2823 单调队列
- poj 2823 单调队列
- POJ 2823 单调队列
- poj 2823 单调队列
- POJ 2823 单调队列
- POJ 2823 //单调队列
- POJ 2823 单调队列
- poj 2823 单调队列
- poj 2823 (单调队列)
- java nio Selector的使用-服务器端
- 国家85高程基准
- 模拟键盘鼠标的API,写压力测试程序常用于模拟点击
- 解决Excel 2007的"有 XML 错误的 /xl/sharedStrings.xml"问题 (“发现不可读取的内容,是否回复此工作薄的内容...")
- 字符串指针和其他指针的不同……
- poj 2823【单调队列】
- 青岛验潮站
- Delphi下查看变量内存信息的方法
- 关于计算机图形学的学习
- vs2010中的ipch文件夹和sdf文件
- 插入排序--直接插入排序
- 完美的hr-兼容各个浏览器firefox,ie6,ie7
- 无线串口调试手记(一) —— 从了解芯片nRF905入手
- 有钱人与没钱人区别之我见