zoukankan      html  css  js  c++  java
  • 洛谷P3522 TEM-temperature

    题目

    单调队列+阅读理解

    简化题意。

    找到一个最长的区间使得区间每个点的r要大于该点之前的点的l。

    然后可以用单调队列维护单调递减的l。最后尺取法O(n)枚举所有区间并取最大值。

    单调队列可以快速找某个位置左右两侧比他大(或小)的数的位置

    #include <bits/stdc++.h>//题目意思就是找到一段最长的区间使得 
    #define N 1010111		
    using namespace std;	
    int n, l[N], r[N], maxn;
    deque <int> q;			
    int main()				
    {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++)
    		scanf("%d%d", &l[i], &r[i]);
    	q.push_back(1);			 //q存下标 
    	int now = 0;//now要设为零 
    	for	(int i = 2; i <= n; i++)
    	{						
    		while (!q.empty() && r[i] < l[q.front()])//如果l[队头]大于r[i]的话则不行,等于则不需更新 
    		{					
    			now = q.front();
    			q.pop_front();	
    		}
    		if (q.size())	    
    		maxn = max(i - now, maxn);//now是满足当前情况下的,最左边的数 
    		while (q.size() && l[i] >= l[q.back()])//队列里满足l单减 
    			q.pop_back();
    		q.push_back(i); 
    	}			 		
    	printf("%d", maxn); 
    	return 0;
    }
    /*
    6   
    6 10
    1 5
    4 8 
    2 5
    6 8
    3 5
    */ 
    
  • 相关阅读:
    Catalan数
    完全背包
    日期问题
    01背包
    NOJ2076
    858. Prim算法求最小生成树
    839. 模拟堆
    850. Dijkstra求最短路 II
    849. Dijkstra求最短路 I
    859. Kruskal算法求最小生成树
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11564217.html
Copyright © 2011-2022 走看看