b_51_最大距离(排序=将两个维度降为一个维度 / 不太懂的单调栈)

对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对
输出所有合法数对中的最大距离

思路:排序=将两个维度降为一个维度

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+5;
int n,ans,minp;
struct node {
    int v,p;
}A[N];
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n; for (int i=0; i<n; i++) cin>>A[i].v, A[i].p=i;
    sort(A,A+n,[&](node& a, node& b) {
        if (a.v!=b.v) return a.v<b.v;
        return a.p<b.p;
    });
    minp=A[0].p;
    for (int i=1; i<n; i++) {
        if (A[i].p<minp) minp=A[i].p;
        else ans=max(ans, A[i].p-minp); //值和下标都大的在minp后面(因为A[minp].v肯定比A[i].v小),则证明A[i].p-minp是合法的一组
    }
    cout<<ans;
    return 0;
}
posted @ 2020-10-26 22:47  童年の波鞋  阅读(74)  评论(0编辑  收藏  举报