题解:P16353 「Diligent-OI R3 A」说好不哭
ZhangChuan1350 · · 题解
题目要求是否存在一个长度为
分几种情况讨论:
- 若
n=1 ,则序列只有一个数字。此时序列存在,当且仅当x=y 。
这很好理解,如果一个序列只有1 个数字,那最大非空子段和一定和最小非空子段和是相等的,否则就不止1 个数字了。 - 若
n\ge1 ,再对x,y 是 同号/ 异号 分情况:- 若
x>0 且y<0 ,则一定存在序列。因为可以构造一个序列至少包含两个一正一负的数字。 - 若
x\ge0 且y\ge0 ,则当且仅当x\ge n\cdot y 时,序列存在,否则序列不存在。因为此时序列必须包含y (否则最小就不是y ),再至少包含一个长度为(n-1) 的序列a ,满足a_i\ge y 且\sum a_i+y\le x (a_i 表示序列a 的第i 个数,\sum a_i 表示序列a 全部数字之和)。 - 若
x<0 且y<0 ,则当且仅当y\leqslant n\cdot x 时,序列存在,否则序列不存在。
此证明与 Case 2 相似,在这里不再详细展开。
- 若
代码如下: :::success[AC Code]
#include <cstdio>
int T;
long long n,x,y;
int main()
{
scanf("%lld",&T);
while (T--){
scanf("%lld%lld%lld",&n,&x,&y);
if (n==1){
if (x==y) puts("YES");
else puts("NO");
continue;
}
if (x>0&&y<0) puts("YES");
else if (x>=0&&y>=0){
if (x>=n*y) puts("YES");
else puts("NO");
} else{
if (y<=n*x) puts("YES");
else puts("NO");
}
}
return 0;
}
:::