3416、四元组问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
if(n<4){
cout<<"No"<<"\n";return 0;
}
int k=INT_MIN,m=INT_MAX;
vector<int> v(n+1),rmin(n+1,m);
for(int i=1;i<=n;i++)cin>>v[i];
// a<b<c<d -> nums[d]<nums[c]<nums[a]<nums[b]
//先找 c<d -> nums[d]<nums[c]
for(int i=n-1;i>=1;i--){
// i 位置右边最小的值是 rmin[i] 即为nums[d]
rmin[i]=min(rmin[i+1],v[i+1]);
}
stack<int> s;
for(int i=1;i<=n;i++){
//k nums[b],v[i] nums[a],rmin[i] nums[d]
//因为有rmin[i]的存在,所以就肯定有nums[c]<nums[d]
if(v[i]<k&&v[i]>rmin[i]){//当前的值
cout<<"YES";return 0;
}
//单调栈
//寻找 nums[a]<nums[b]
while(!s.empty()&&s.top()<v[i]){
k=max(k,s.top());
s.pop();
}
s.push(v[i]);
}
cout<<"NO";
return 0;
}