首页 > 代码库 > POJ 2823 双端队列
POJ 2823 双端队列
链接:
http://poj.org/problem?id=2823
题意:
给定一个长度为n的数列,a0,a1,···,an-1和一个整数k。
求数列bi=min{ai,ai+1,···,ai+k-1}(i=0,1,···,n-k)
和数列ci=max{ai,ai+1,···,ai+k-1}(i=0,1,···,n-k)
代码:
31 int a[MAXN], b[MAXN], c[MAXN]; 32 deque<int> deq; 33 34 int main() { 35 int n, k; 36 cin >> n >> k; 37 rep(i, 0, n) scanf("%d", a + i); 38 39 rep(i, 0, n) { 40 while (!deq.empty() && a[*deq.rbegin()] >= a[i]) deq.pop_back(); 41 deq.push_back(i); 42 if (i - k + 1 >= 0) { 43 b[i - k + 1] = a[*deq.begin()]; 44 if (*deq.begin() == i - k + 1) deq.pop_front(); 45 } 46 } 47 deq.clear(); 48 rep(i, 0, n) { 49 while (!deq.empty() && a[*deq.rbegin()] <= a[i]) deq.pop_back(); 50 deq.push_back(i); 51 if (i - k + 1 >= 0) { 52 c[i - k + 1] = a[*deq.begin()]; 53 if (*deq.begin() == i - k + 1) deq.pop_front(); 54 } 55 } 56 57 rep(i, 0, n - k + 1) printf("%d%c", b[i], i == n - k ? ‘\n‘ : ‘ ‘); 58 rep(i, 0, n - k + 1) printf("%d%c", c[i], i == n - k ? ‘\n‘ : ‘ ‘); 59 return 0; 60 }
POJ 2823 双端队列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。