羅区P3522 TEM温度

タイトル

キューモノトーン+を読みます

質問の意味を簡素化します。

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
*/ 

おすすめ

転載: www.cnblogs.com/liuwenyao/p/11564217.html