题目陈述
安雅住在花城。 根据市长的命令,她必须为自己建造一道围墙。
围墙由n块木板组成,每块木板的高度为ai米。 根据命令,木板的高度必须不增加。 换句话说,对于所有i<j都成立ai≥aj。
安雅好奇她的围墙是否关于对角线对称。 换句话说,如果所有木板按相同顺序水平放置,她是否会得到相同的围墙。
例如,对于n=5,a=[5,4,3,2,1],围墙是对称的。 因为如果所有木板水平放置,围墙将是[5,4,3,2,1][5,4,3,2,1],如图所示。
左边是围墙[5,4,3,2,1][5,4,3,2,1],右边是水平放置的相同围墙
但对于n=3,a=[4,2,1],围墙不是对称的。 因为如果所有木板水平放置,围墙将是[3,2,1,1][3,2,1,1],如图所示。
左边是围墙[4,2,1][4,2,1],右边是水平放置的相同围墙
帮助安雅判断她的围墙是否对称。
输入
输入的第一行包含一个整数t(1≤t≤10^4)— 测试用例的数量。
以下是测试用例的描述。
测试用例的第一行包含一个整数n(1≤n≤2⋅10^5)— 围墙的长度。
测试用例的第二行包含n个整数a1≥a2≥a3≥⋯≥an(1≤ai≤10^9)— 木板的高度。
所有测试用例的n值之和不超过2⋅10^5。
输出
对于每个测试用例,如果围墙是对称的,则输出“YES”,否则输出“NO”。
你可以以任何大小写形式输出每个字母(小写或大写)。 例如,字符串“yEs”、“yes”、“Yes”和“YES”都将被接受为肯定答案。
示例
输入
7
5
5 4 3 2 1
3
3 1 1
3
4 2 1
1
2
5
5 3 3 1 1
5
5 5 5 3 3
2
6 1
输出
YES
YES
NO
NO
YES
YES
NO
注意
在示例的第一个和第二个测试用例中,围墙是对称的。
在示例的第三个测试用例中,围墙不是对称的。 如果木板水平放置,围墙将是[3,2,1,1][3,2,1,1]。
在示例的第四个测试用例中,围墙不是对称的。 如果木板水平放置,围墙将是[1,1][1,1]。
在示例的第五个和第六个测试用例中,围墙是对称的。
在示例的第七个测试用例中,围墙不是对称的。 如果木板水平放置,围墙将是[2,1,1,1,1,1][2,1,1,1,1,1]。
C程序源代码
#include <stdio.h>
#include <string.h>
#define N 200010
#define MOD 998244353
#define INF 0x3f3f3f3f
int a[N], b[N];
int solve() {
int n;
scanf("%d", &n);
memset(b, 0, sizeof(int) * (n + 2));
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for (int i = 1; i <= n; ++i) {
if (a[i] > n) {
return 1;
}
b[a[i]] = i;
}
for (int i = n; i >= 1; --i) {
b[i] = b[i] > b[i + 1] ? b[i] : b[i + 1];
if (a[i] != b[i]) {
return 1;
}
}
return 2;
}
int main() {
int T = 1;
int k=0;
scanf("%d", &T);
int a[T];
while (T--) {
a[T]=solve();
k++;
}
for(int i=k-1;i>=0;i--){
if(a[i]==1){
printf("NO\n");
}else{
printf("YES\n");
}
}
return 0;
}