HDU-5532Almost Sorted Array LIS问题

xiaoxiao2021-02-28  55

题意

就是检查这个序列是否删除一个元素就能变成非严格的有序序列 表面上就是一个卡条件检查数组的问题

分析:

在向量中upperbound插入上界 这样能够使数组里的数列长度尽可能大 因为 我们是在不断用小数替换数列中的数 大的数直接拼接到最后

code

#include<bits/stdc++.h> #define rep(i,a,b) for(int (i) = (a);(i)<=(b);(i)++) #define rrep(i,a,b) for(int (i) = (a);(i)>=(b);(i)--) using namespace std; typedef long long ll; int a[100005],b[100005]; int main() { int t; scanf("%d",&t); while(t--){ int n,S=1,NS=1; scanf("%d",&n); rep(i,1,n)scanf("%d",a+i); vector<int>s; s.clear(); s.push_back(a[1]); rep(i,2,n){ if(a[i]>=s[s.size()-1])s.push_back(a[i]); else{ int pos = upper_bound(s.begin(),s.end(),a[i])-s.begin(); s[pos]=a[i]; } } S = (int)s.size(); s.clear(); s.push_back(a[n]); rrep(i,n-1,1){ if(a[i]>=s[s.size()-1])s.push_back(a[i]); else{ int pos = upper_bound(s.begin(),s.end(),a[i])-s.begin(); s[pos]=a[i]; } } NS =(int)s.size(); if(NS>=n-1||S>=n-1)puts("YES"); else puts("NO"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-83311.html

最新回复(0)