poj2823
来源:互联网 发布:geekbar 知乎 编辑:程序博客网 时间:2024/06/13 03:16
单调队列 的 实现 (自己瞎编的)
10000多k 5000多ms
#include <iostream>#include <cstdio>#include <queue>#include <vector>#include <cstring>using namespace std;int a[1000001],b[1000001],index[1000001],n,k;vector<int> s;vector<int> l;void solve_s(){ int head_index,start=1,medge=0; for(int i=1;i<=k;++i) { while(medge>=start && a[i]<b[medge]) --medge; b[++medge] = a[i]; index[medge] = i; if(medge==start) head_index = i; } s.push_back(a[head_index]); for(int i=k+1;i<=n;++i) { if(head_index <= i-k) head_index = index[++start]; while(medge>=start && a[i]<b[medge]) --medge; b[++medge] = a[i]; index[medge] = i; if(medge==start) head_index = i; s.push_back(a[head_index]); }}void solve_l(){ int head_index,start=1,medge=0; for(int i=1;i<=k;++i) { while(medge>=start && a[i]>b[medge]) --medge; b[++medge] = a[i]; index[medge] = i; if(medge==start) head_index = i; } l.push_back(a[head_index]); for(int i=k+1;i<=n;++i) { if(head_index <= i-k) head_index = index[++start]; while(medge>=start && a[i]>b[medge]) --medge; b[++medge] = a[i]; index[medge] = i; if(medge==start) head_index = i; l.push_back(a[head_index]); }}int main(){ scanf("%d %d",&n,&k); for(int i=1;i<=n;++i) scanf("%d",&a[i]); s.clear(); l.clear(); solve_s(); solve_l(); for(int i=0;i<s.size();++i) printf("%d ",s[i]); printf("\n"); for(int i=0;i<l.size();++i) printf("%d ",l[i]); printf("\n"); return 0;}
0 0
- poj2823
- POJ2823
- poj2823
- poj2823
- POJ2823
- poj2823
- poj2823
- POJ2823
- poj2823
- POJ2823
- POJ2823
- poj2823(ST)
- poj2823(堆)
- poj2823 单调队列
- 单调队列 POJ2823
- 單調隊列::poj2823 Sliding Window
- poj2823 Sliding Window
- 单调队列 (POJ2823)
- Tomcat体系架构
- Android(4)---Android 控件布局常用属性
- spring--profile和条件化bean
- Android 中的view 的渲染
- {转载}同样的面试题,Android的答案和JAVA的不一样
- poj2823
- Android初步(二)
- 为什么你有10年经验,但成不了专家?(转载)
- 【kmp算法】求一个串的重复子串
- spring @Autowired与@Resource注解
- WebView退出时关闭音频或视频
- 设计模式使用频率简要大纲
- HTML标签对应英文全称及简单描述
- Springmvc提交数据的方式