安雅的对称围墙

题目陈述

安雅住在花城。 根据市长的命令,她必须为自己建造一道围墙。

围墙由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;
}


运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值