链接:
https://vjudge.net/problem/271346/origin
题意:
问一个序列能否通过删除一个元素使其成为非递减序列或者非递增序列。
思路:
真是没想到是最长上升子序列啊,跑两边即可。
注意:multiset如果用erase 删除指定值 ,会把所有的都删除,所以要删除相应迭代器。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int a[maxn];
multiset<int> s;
int main()
{
ios::sync_with_stdio(false);
int num1,num2;
int t,n;
cin>>t;
while(t--)
{
s.clear();
cin>>n;
for(int i = 0; i < n; i++)
cin>>a[i];
s.insert(0);
for(int i = 0; i < n; i++)
{
if(a[i] < *s.rbegin())
{
s.erase(s.upper_bound(a[i]));
}
s.insert(a[i]);
}
num1 = s.size() - 1;
s.clear();
s.insert(0);
for(int i = n-1; i >= 0; i--)
{
if(a[i] < *s.rbegin())
{
s.erase(s.upper_bound(a[i]));
}
s.insert(a[i]);
}
num2 = s.size()-1;
if(num1 >= (n - 1) || num2 >= (n-1) )
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
再发一下自己莽出来的代码;
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int a[maxn];
int b[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
int num1 = 0, num2= 0;
int flag1 = 1,flag2 =1;
for(int i = 1; i<n; i++)//-
{
if(a[i] > a[i-1])
{
if(i != n - 1 && i != 1)
{
if(a[i+1] <= a[i-1]||(a[i] <= a[i-2]&&a[i+1]<=a[i]))
num1++;
else
{
flag1 = 0;
}
}
else
{
num1++;
}
}
if(a[i] < a[i-1])
{
if(i != n - 1 &&i != 1)
{
if(a[i+1] >= a[i-1]||(a[i] >= a[i-2]&&a[i+1]>=a[i]))
num2++;
else
{
flag2 = 0;
}
}
else
{
num2++;
}
}
}
if( ((num1==1||num1==0)&&flag1)||((num2==1||num2==0)&&flag2))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}