poj 2823
地址:http://poj.org/problem?id=2823
题意:n个数里面连续的k个数,找最大和最小的。
mark:优先队列,不过要重载一下cmp函数。
也可以单调队列做。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int queue[1000010]; int a[1000010]; int m,n; void solve(int f) { int i,j,k; int fr,la; fr = la = 0; queue[la++] = 0; for(i = 1; i < m; i++) { while(f*a[i] <= f*a[queue[la-1]]) { la--; if(la == fr) break; } queue[la++] = i; } printf("%d", a[queue[fr]]); for(i = m; i < n; i++) { while(f*a[i] <= f*a[queue[la-1]]) { la--; if(la == fr) break; } queue[la++] = i; if(la-fr > m) fr = la-m; while(queue[la-1]-queue[fr] >= m) fr++; printf(" %d", a[queue[fr]]); } printf("\n"); } int main() { // freopen("in.txt", "r", stdin); // freopen("out1.txt", "w", stdout); int i; while(~scanf("%d%d", &n, &m)) { for(i = 0; i < n; i++) scanf("%d", a+i); solve(1); solve(-1); } return 0; }
#include <stdio.h> #include <string.h> #include <queue> #include <stdlib.h> using namespace std; int s[1000010]; int max1[1000010],min1[1000010]; struct cmp1 { bool operator()(int a, int b) { return s[a] < s[b]; } }; struct cmp2 { bool operator()(int a, int b) { return s[a] > s[b]; } }; int main() { int n,m; int i,j,k; while(~scanf("%d%d", &n, &m)) { priority_queue<int, vector<int>, cmp1> insq; priority_queue<int, vector<int>, cmp2> desq; for(i = 0; i < n; i++) { scanf("%d", &s[i]); if(i < m) { insq.push(i); desq.push(i); } } j = 0; max1[j] = insq.top(); min1[j++] = desq.top(); for(i = m; i < n; i++) { insq.push(i); while(i-insq.top() >= m) insq.pop(); desq.push(i); while(i-desq.top() >= m) desq.pop(); max1[j] = insq.top(); min1[j++] = desq.top(); } for(i = 0; i < j; i++) { if(i) printf(" "); printf("%d", s[min1[i]]); } printf("\n"); for(i = 0; i < j; i++) { if(i) printf(" "); printf("%d", s[max1[i]]); } printf("\n"); } return 0; }