#HT1001. 数组变升序

数组变升序

题目描述

给你一个包含 nn 个整数的数组 aa,数组中的元素 各不相同

问:能否通过 恰好翻转一次 数组,使其变成一个单调递增的数组。

注:这里的翻转指的是选择数组中一段连续的元素并翻转他们的位置。这次翻转我们需要选择两个坐标 l,r(1lrn)l,r(1 \le l \le r \le n),则以 a[l]a[l] 为起点,以 a[r]a[r] 为终点的连续一段区间的元素为 a[l],a[l+1],,a[r]a[l],a[l+1],\cdots,a[r],对其进行翻转后整个数组将变成:

a[1],a[2],,a[l2],a[l1],a[r],a[r1],,a[l+1],a[l],a[r+1],a[r+1],,a[n1],a[n]a[1], a[2], \cdots, a[l-2], a[l-1], a[r], a[r-1], \cdots, a[l+1], a[l], a[r+1], a[r+1], \cdots, a[n-1], a[n]

比如,对于一个包含 n=6n=6 个元素的数组 a[1],a[2],a[3],a[4],a[5],a[6]a[1],a[2], a[3], a[4], a[5], a[6],如果我选择以 a[2]a[2] 作为起点,以 a[4]a[4] 作为终点进行翻转,则翻转后的数组为 a[1],a[4],a[3],a[2],a[5],a[6]a[1], a[4], a[3], a[2], a[5], a[6]

输入格式

输入的第一行包含一个整数 t(1t10)t(1 \le t \le 10),用于表示测试数据的组数。
接下来包含 tt 组测试数据,每组测试数据包含两行,其中:第一行包含一个整数 n(1n1000)n(1 \le n \le 1000),表示数组的大小;第二行包含 nn 个整数,两两之间以一个空格分隔,表示数组中的元素 a[1],a[2],,a[n](1a[i]109)a[1], a[2], \cdots, a[n](1 \le a[i] \le 10^9)

输出格式

对于每一组测试数据,如果能够通过恰好一次翻转使数组单调递增,输出一行“yes”;否则,输出一行“no”。

样例

4
3
3 2 1
4
2 1 3 4
4
3 1 2 4
3
1 2 3
yes
yes
no
yes

样例解释

  • 对于第11组测试数据,可以以 a[1]a[1] 为起点,以 a[3]a[3] 为终点进行一次翻转;
  • 对于第22组测试数据,可以以 a[1]a[1] 为起点,以 a[2]a[2] 为终点进行一次翻转;
  • 对于第33组测试数据,没有办法通过一次翻转使其单调递增;
  • 对于第44组测试数据,可以以任何一个点同时为起点和终点进行一次翻转(比如以 a[1]a[1] 为起点,同时也以 a[1]a[1] 为终点)。

数据范围

对于 100%100\% 的数据:1t10,1n1000,1a[i]1091 \le t \le 10, 1 \le n \le 1000, 1 \le |a[i]| \le 10^9