【Codeforces Global Round 9 C】Element Extermination
题目链接
翻译
给你一个排列,你每次可以将 \(a[i]<a[i+1]\) 中的 \(a[i]\) 或者 \(a[i+1]\) 删掉。
问你,最后能不能删得只剩下 \(1\) 个元素。
题解
考虑最大的元素 \(n\), 想想它是不是能一直往左删元素?
但是删到第一个元素的时候,就不能再删了,因为 \(n\) 可能不是最后一个元素,如果再删的话,就没有
其他元素能删掉 \(n\) 了, 没办法这个时候只能保留第一个元素然后把 \(n\) 给删掉了。
然后接着找 \(n\) 右边的次大的元素 \(x\) (\(n\) 左边只剩第一个数字了),也重复进行删除元素操作。
如果 \(x\) 不是最右边那个元素的话,仍然不能删掉第一个元素... 依次类推
不难发现,只要排列的最后一个元素是大于第一个元素的,那么最后一定能轮到这个 \(a[n]\) 进行这样的
步骤,就能删掉第一个元素,只剩一个元素 \(a[n]\) 啦。
如果最后一个元素小于第一个元素,根据上面的过程可以发现,第一个元素没办法被删除。
神奇的一道题。
代码
#include <cstdio>
using namespace std;
const int N = 3e5;
int T, n;
int a[N + 10];
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
for (int i = 1;i <= n; i++){
int x;
scanf("%d",&a[i]);
}
if (a[n] > a[1]){
puts("YES");
}else{
puts("NO");
}
}
return 0;
}