zoukankan      html  css  js  c++  java
  • POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题

    题意:给出一个序列,求出每连续k个数字中最大的数和最小的数。

    这是道单调队列裸题,直接写就行了。

    本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说在uestc上也有这题,我过去提交终于过了。。。

    但是poj还是没有过,于是我用数组模拟队列来写,提交还是超时,折腾了一会,把g++改成c++终于5s多过了。。。

    注意如果是直接输出答案的话,如果k=1可能会出错。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <deque>
    using namespace std;
    
    const int MAXN = 1000005;
    int n, k, t, arr[MAXN], que[MAXN];
    
    void solve(bool flag) {
    	int head(0), rear(0);
    	memset(que, 0, sizeof(que));
    	if (k == 1) printf("%d ", arr[0]);
    	for (int i = 1; i < n; i++) {
    		if (flag) while (head <= rear && arr[i] > arr[que[rear]])
    			rear--;
    		else while (head <= rear && arr[i] < arr[que[rear]])
    			rear--;
    		que[++rear] = i;
    		if (que[head] < i - k + 1) head++;
    		if (i >= k - 1)
    			if (i == n - 1) printf("%d
    ", arr[que[head]]);
    			else printf("%d ", arr[que[head]]);
    	}
    }
    
    int main() {
    	while (scanf("%d%d", &n, &k) != EOF) {
    		for (int i = 0; i < n; i++)
    			scanf("%d", &arr[i]);
    		solve(0);
    		solve(1);
    	}
    	return 0;
    }
    


  • 相关阅读:
    VC++技术内幕(三)
    DataTable的Select方法
    <转载>电话号码正则表达式
    <转载>运行命令(CMD)大全
    各种CSS bug与技巧
    网页设计标准尺寸
    CSS实用技巧及常见问题
    超级实用且不花哨的js代码
    广告JS代码效果大全
    js小技巧收集
  • 原文地址:https://www.cnblogs.com/james1207/p/3367922.html
Copyright © 2011-2022 走看看