「Diligent-OI R3 A」说好不哭

· · 题解

题目分析

首先容易发现 x\ge y 必须满足。同时都是负数或者 x=0 的话可以变成,对相反数序列的限制,不需要考虑都是负数,也就是 x\ge 0

如果此时 y\le 0,可以把序列分成两半,前一半全放非负数和凑齐 x,后一半全放非正数凑 y。如果此时 y>0,那说明 y 是最小的数,序列全部就是最大子段和,至少 y\times n,限制是 x\ge y\times n

一个特殊的 corner case 是 n=1,这时候一开始分两半的构造会失效。

时间复杂度 O(T)

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,x,y;
void task(){
    cin>>n>>x>>y;
    if(n==1){
        if(x==y)
            println("YES");
        else
            println("NO");
        return;
    }
    if(x<y)
        return println("NO");
    if(x<0||(x==0&&y<0)){
        swap(x,y);
        x=-x,y=-y;
    }
    if(x>=0&&y<=0)
        return println("YES");
    if(x<n*y)
        println("NO");
    else
        println("YES");
    return;
}
string program(){
    cin.tie(nullptr)->ios::sync_with_stdio(0);
    for(cin>>T;T;T--)
        task();
    return"H17";
}
string H17=program();
signed main(){
    return 0;
}