题目链接
题目大意:
给你个n的排列,找出是否存在的子序列满足端点不是区间最大和最小。
思路
因为题目只要有1个满足就好,所以我们从(1,n)开始缩小(因为此时最大值就是n,最小值是1)
然后根据要求移动l和r就行
如果a[l]是最大值,l++,max--;
如果a[l]是最小值,l++,min++;
如果a[r]是最大值,r--,max--;
如果a[r]是最小值,r--,min++;
代码如下
#include <cstdio>
int num[212345];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &num[i]);
}
int l = 1, r = n, vmin = 1, vmax = n;
while (l < r) {
if (num[l] == vmin) {
l++;
vmin++;
} else if (num[l] == vmax) {
l++;
vmax--;
} else if (num[r] == vmin) {
r--;
vmin++;
} else if (num[r] == vmax) {
r--;
vmax--;
} else
break;
}
if (l < r) {
printf("%d %d\n", l, r);
} else
printf("-1\n");
}
}