【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 n≥m,则有
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,…,an−m,an−m+1+b1,an−m+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 1≤T≤106;
- 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1≤n≤106, 1 ≤ ∑ n ≤ 1 0 6 1 \le \sum n \le 10^6 1≤∑n≤106;
- 0 ≤ x i ≤ 1 0 9 0 \le x_i \le 10^9 0≤xi≤109。
[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,⋯,an−1,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] cnti≥cnti−1,i∈(1,n],那么可以推出:
- 如果 c n t i − 1 > a i cnt_{i-1}>a_i cnti−1>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] cnti≥cnti−1,i∈(1,n],又因为拆分出来的必须是正整数,即最小为 1 1 1,那么如果 c n t i − 1 > a i cnt_{i-1}>a_i cnti−1>ai,则 a i a_i ai 一定不能被合法地拆分。
- c n t i cnt_i cnti 的计算方式为:如果 a i > a i − 1 a_i>a_{i-1} ai>ai−1,则 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 cnti−1>ai,即所有的 c n t i − 1 ≤ a i , i ∈ ( 1 , n ] cnt_{i-1}\le a_i,i\in(1,n] cnti−1≤ai,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。

被折叠的 条评论
为什么被折叠?



