A. 纵情

A. 纵情

 

题目链接:下面的题面有一些问题

http://10.1.6.216/contest/18/problem/107

 

纵情山河万里,肆意九州五月 —— gfhx

题目背景

然而题面跟标题并没有任何关系,只是为了告诉你此题的毒瘤出题人是谁。

题目描述

最近高一同学都在备战期中考试,新出现了一种题型叫做“保值区间”(怀疑是jjb

刷存在感,因为有他自己名字,一类题连出三次,切掉不是有手就行?)。鉴于高二学长数学比我们巨,那就麻烦你们现推一下结论叭。

“保值区间”的定义是这样的:一个函数如果在区间[m,n]

(m<n)上是单调的,并且值域也是[m,n](m<n),则[m,n]为该函数的保值区间。为了将问题简化,本题是这样的:给定一个关于x的函数f(x)=ax2+bx+c,要求求出该函数在单调递增的区间内是否存在“保值区间”。如果存在,那么输出YES,否则输出NO

(只输出引号内的内容)。

输入格式

第一行一个整数T

,表示有T

组输入输出。

共有T

行,三个整数分别代表a,b,c

,其含义见题目描述。

输出格式

每一行对对应的a,b,c

输出"YES""NO"

样例输入输出

样例输入1

1
1 2 3

样例输出1

NO

样例输入2

10
9 2 3
2 7 3
4 0 4
3 3 1
4 0 8
1 7 0
5 4 0
1 4 2
6 9 0
1 0 0

样例输出2

NO
NO
NO
NO
NO
NO
NO
YES
NO
YES

(作为毒瘤出题人的我奉上一组不水的样例,看我多有良心,一定要签到哟~~)

样例解释

自己手玩去。。。手玩不出来别学数学了(bushi

数据范围

对于100

的数据,T10000001000000000a,b,c1000000000

作为签到题我并不想给部分分,毕竟暴力也打不出来,一定要有不ACAC即爆0的破釜沉舟的勇气!!!

 

题目分析:
其实这道题还算是挺水的(就是一些毒瘤特判真的是特别多,崩溃qwq)。根据题目我们可以发现,既要在增区间内,又要使定义域与值域相等,这不就是求二次函数和y=x的交点嘛,求出交点,然后判断这个点与对称轴的关系(其实就是判断这个两个点是不是满足在增区间之内),就可以完美(并不)AC这道题。

但是由于神仙毒瘤出题人的神奇脑洞,我们发现这个题里面是存在一些坑点的:
1.特判a=0的情况,如果这个时候b=1,c=0,也就是说这个函数是y=x,那么这个函数就存在保值区间,不然的话,其他的一次函数都不存在保值区间

2.由于输入数据非常大,所以我们一定不可以使用cin cout!特别是不能像我这个憨憨一样用cout<<endl!qwq endl 对于时间复杂度的增加是非常多的!

 

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}//快读优化

/*unsigned */long long ans;
ll t,a,b,c,sum1,sum2;
ll p;
//这个题long long就可以解决所有事情,而且有负值,所以如果用unsigned long long 并不合适

int main()
{
//    scanf("%lld",&t);
        t=read();
    while(t--)
    {
        a=read();b=read();c=read();
        if(a==0)
        {
            if(c==0&&b==1) printf("YES\n");
            else
            {
            printf("NO\n");
            }
            
            continue;
        }
        ans=(b-1)*(b-1)-4*a*c;//求根判别式
        if(ans<=0) 
        {
            printf("NO\n");
            continue;
        }
        else
        {
            sum1=(1-b+sqrt(ans));
            sum2=(1-b-sqrt(ans));
                        //如果除以2a,那么最后有可能出现小数,而long long是下取整,所以有可能导致结果出锅,因此我们不除以2a
        }
        
        p=-b;//同样不除以2a
        if(sum1>=p&&sum2>=p&&a>0) 
        {
            printf("YES\n");
            continue;
        }
        else if(sum1<=p&&sum2<=p&&a<0)
        {
            printf("YES\n");
            continue;
        }
                //判断是不是在增区间之内
    
        printf("NO\n");    
    }
    
    return 0;
}                        

 

----------------end-------------------

 

posted @ 2020-11-29 15:21  yxr~  阅读(121)  评论(0编辑  收藏  举报