P3522 [POI2011]TEM-Temperature

P3522 [POI2011]TEM-Temperature

直接set维护就好了,不知道我为啥写单调队列。

移动头指针的条件当然是在set里元素 (l) 的最大值大于当前元素的 (r) 了,边移边取 (max) 就行

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>

using namespace std;

typedef long long ll;
const ll MAXN = 1e6+10;

ll N;

struct line {
    ll l, r;
    friend bool operator < (line a, line b) {return a.l > b.l;}
} E[MAXN];

multiset <line> st;
ll q[MAXN], head = 1, tail = 0, ans = 0;

int main() {
    scanf("%lld", &N);
    for (ll i = 1; i <= N; i++)
        scanf("%lld%lld", &E[i].l, &E[i].r);
    for (ll i = 1; i <= N; i++) {
        while (head <= tail && st.begin()->l > E[i].r) st.erase(st.find(E[q[head]])), head++;
        q[++tail] = i;
        st.insert(E[i]);
        ans = max(ans, q[tail] - q[head] + 1);
    }
    printf("%lld
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Gensokyo-Alice/p/13904572.html