A. 纵情
题目链接:下面的题面有一些问题
http://10.1.6.216/contest/18/problem/107
纵情山河万里,肆意九州五月 —— gfhx
题目背景
然而题面跟标题并没有任何关系,只是为了告诉你此题的毒瘤出题人是谁。
题目描述
最近高一同学都在备战期中考试,新出现了一种题型叫做“保值区间”(怀疑是jjb
刷存在感,因为有他自己名字,一类题连出三次,切掉不是有手就行?)。鉴于高二学长数学比我们巨,那就麻烦你们现推一下结论叭。
“保值区间”的定义是这样的:一个函数如果在区间[m,n]
(m<n)上是单调的,并且值域也是[m,n](m<n),则[m,n]为该函数的保值区间。为了将问题简化,本题是这样的:给定一个关于x的函数f,要求求出该函数在单调递增的区间内是否存在“保值区间”。如果存在,那么输出“Y,否则输出“N
(只输出引号内的内容)。
输入格式
第一行一个整数T
,表示有T
组输入输出。
共有T
行,三个整数分别代表a,b,c
,其含义见题目描述。
输出格式
每一行对对应的a,b,c
输出"Y或"N
样例输入输出
样例输入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
的数据,T,−1000000000⩽a,b,c⩽1000000000
作为签到题我并不想给部分分,毕竟暴力也打不出来,一定要有不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 "); else { printf("NO "); } continue; } ans=(b-1)*(b-1)-4*a*c;//求根判别式 if(ans<=0) { printf("NO "); 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 "); continue; } else if(sum1<=p&&sum2<=p&&a<0) { printf("YES "); continue; } //判断是不是在增区间之内 printf("NO "); } return 0; }
----------------end-------------------