【BYOI R1】意识解离

【BYOI R1】意识解离


算法竞赛:构造,Ad-hoc
题目链接:洛谷 P14524 [BYOI R1] 意识解离

题目描述:
对于两个序列 a 1 , … , a n a_1, \ldots, a_n a1,,an b 1 , … , b m b_1, \ldots, b_m b1,,bm,定义 a + b a + b a+b 表示将 a , b a, b a,b 向右按位对齐 后对位相加,得到的长度为 max ⁡ ( n , m ) \max(n, m) max(n,m) 的新序列。形式化地,若 n ≥ m n \geq m nm,则有
a + b = [ a 1 , a 2 , … , a n − m , a n − m + 1 + b 1 , a n − m + 2 + b 2 , … , a n + b m ] ; a + b = [a_1, a_2, \ldots, a_{n-m}, a_{n-m+1} + b_1, a_{n-m+2} + b_2, \ldots, a_n + b_m]; a+b=[a1,a2,,anm,anm+1+b1,anm+2+b2,,an+bm];
n < m n < m n<m,则由对称性 a + b a + b a+b 等于 b + a b + a b+a,可以给出类似的形式化定义。
BY 认为一个序列是 别样的,当且仅当这个序列可以被表示为至少 1 1 1单调不增的 正整数序列依次进行加法运算的结果。
他有多组询问。每组询问给出非负整数序列 x 1 , … , x n x_1, \ldots, x_n x1,,xn,你需要判断序列 x x x 是否为 别样的

输入格式:
本题有多组测试数据。
输入的第一行包含一个正整数 T T T,表示测试数据组数。接下来依次输入每组测试数据。对于每组测试数据:

  • 第一行包含一个正整数 n n n,表示序列 x x x 的长度。
  • 第二行包含 n n n 个非负整数 x 1 , … , x n x_1, \ldots, x_n x1,,xn,表示序列 x x x

输出格式:
对于每组测试数据,输出一行一个字符串:

  • 若序列 x x x别样的,则输出 Yes
  • 否则,输出 No

数据范围:
对于所有测试数据,保证:

  • 1 ≤ T ≤ 1 0 6 1 \le T \le 10^6 1T106
  • 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106 1 ≤ ∑ n ≤ 1 0 6 1 \le \sum n \le 10^6 1n106
  • 0 ≤ x i ≤ 1 0 9 0 \le x_i \le 10^9 0xi109

[BYOI R1] 意识解离


题目大意

给出一个非负整数序列 A [ a 1 , a 2 , ⋯   , a n − 1 , a n ] A[a_1,a_2,\cdots,a_{n-1},a_n] A[a1,a2,,an1,an],判断其能否被拆分成若干个正整数序列之和的形式,要求每个正整数序列单调不增且相加时靠右对齐


题目分析

我们发现如果序列中存在 a i < a i + 1 a_i<a_{i+1} ai<ai+1,那么从 a i + 1 a_{i+1} ai+1 开始相比于 a i a_i ai 必须要多拆分至少一个正整数序列,因为每个正整数序列是单调不增的,如果存在方案使 a i a_i ai a i + 1 a_{i+1} ai+1 拆分开的正整数序列数量一样( a i + 1 a_{i+1} ai+1 拆分开的数量不可能少于 a i a_i ai 拆分开的),那么 a i + 1 a_{i+1} ai+1 不可能大于 a i a_i ai,所以从 a i + 1 a_{i+1} ai+1 拆分开的正整数序列的数量至少要比 a i a_i ai 的多一个。

我们记 c n t i cnt_i cnti 表示到 a i a_i ai 至少要拆分开的正整数序列的数量,易得有 c n t i ≥ c n t i − 1 , i ∈ ( 1 , n ] cnt_i\ge cnt_{i-1},i\in(1,n] cnticnti1,i(1,n],那么可以推出:

  • 如果 c n t i − 1 > a i cnt_{i-1}>a_i cnti1>ai,则这个非负整数序列一定没有合法的拆分方案,因为 c n t cnt cnt 存在性质: c n t i ≥ c n t i − 1 , i ∈ ( 1 , n ] cnt_i\ge cnt_{i-1},i\in(1,n] cnticnti1,i(1,n],又因为拆分出来的必须是正整数,即最小为 1 1 1,那么如果 c n t i − 1 > a i cnt_{i-1}>a_i cnti1>ai,则 a i a_i ai 一定不能被合法地拆分。
  • c n t i cnt_i cnti 的计算方式为:如果 a i > a i − 1 a_i>a_{i-1} ai>ai1,则 c n t = c n t + 1 cnt=cnt+1 cnt=cnt+1,原因在第一段所叙述。

如果不存在 c n t i − 1 > a i cnt_{i-1}>a_i cnti1>ai,即所有的 c n t i − 1 ≤ a i , i ∈ ( 1 , n ] cnt_{i-1}\le a_i,i\in(1,n] cnti1ai,i(1,n],那么这个非负整数序列一定能被合法地拆分,其中将 c n t = 1 cnt=1 cnt=1 作为初始值,因为原始的非负整数序列至少要被拆分成一个正整数序列,这样处理了边界问题和原序列存在 0 0 0 的情况。


AC Code

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int n;
		scanf("%d",&n);
		int last,flag=1;
		long long cnt=1;
		for (int i=1;i<=n;i++)
		{
			int x;
			scanf("%d",&x);
			if (cnt>x) flag=0;
			if (i==1)
			{
				last=x;
				continue;
			}
			if (x>last) cnt++;
			last=x;
		}
		if (flag) puts("Yes");
		else puts("No");
	}
	return 0;
}

博客说明

  • 本 优快云 博客于 2025/11/16 编写并发布。

本 优快云 博客同步发布于洛谷文章广场,作者:ZZA000HAH。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HAH-HAH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值