Content

给定 \(T\) 个二次函数 \(y=ax^2+bx+c\),有若干次操作,有一个操作编号 \(p\),保证仅为以下这五种:

  • 操作 \(1\):给定 \(k\),将函数图像向上移动 \(k\) 格(\(k<0\) 就是向下移动 \(-k\) 格)。
  • 操作 \(2\):给定 \(k\),将函数图像向右移动 \(k\) 格(\(k<0\) 就是向左移动 \(-k\) 格)。
  • 操作 \(3\):给定 \(k_1,k_2\),将函数图像关于点 \((k_1,k_2)\) 对称。
  • 操作 \(4\):给定 \(k_1,k_2\),求函数图像在闭区间 \([k_1,k_2]\) 内的最大值和最小值并输出(保留 \(2\) 位小数)。
  • 操作 \(5\):给定 \(u,v,w\),求 \(y=ax^2+bx+c\) 的函数图像是否和 \(y=ux^2+vx+w\) 的函数图像有焦点,有的话输出 2,否则输出 0

在所有操作弄完以后,你还需要给出操作完以后函数的最值(显然,根据 \(a\) 的正负来判定,保留 \(2\) 位小数)。

Range

  1. 关于 \(T,m\),有 \(T\leqslant 10,m\leqslant 10000\)。
  2. 关于其他的变量,保证 \(a\neq0,u\neq0,a\neq u,1\leqslant p\leqslant5,-100\leqslant a,b,c,k_1,k_2,k,u,v,w\leqslant 100\)。

Solution

我使用的是一般式进行操作。这么做的优点是,你不需要花多余的时间来求顶点式 \(a(x-h)^2+k\) 中的 \(h\) 和 \(k\),前期处理比较方便,但问题是后面的计算量非常大,没心理准备根本就是做到一半就崩溃了。所以,这篇题解旨在帮助大家多见识一些复杂的计算,让你从容应对这么多复杂的式子和分类讨论。

话不多说,开始处理每个操作:

Part 1 操作 \(1\)

很显然,我们将其上下移动以后改变的只是常数项的值。

什么什么,你还要我讲原因?

那就请看图吧:

上图中蓝色的曲线是函数 \(y=x^2+6x+5\) 的图像,而绿色的曲线是函数 \(y=x^2+6x+4\) 的图像。我们可以看到,蓝色的曲线和 \(y\) 轴的交点是 \((5,0)\),而绿色的曲线和 \(y\) 轴的交点为 \((4,0)\),所以正好和常数项相对应。

或者我们也可以这样:

设 \(y_1=a_1x^2+b_1x+c_1,y_2=a_2x^2+b_2x+c_2\)。

令两个函数的 \(x\) 都等于 \(0\),分别代入两个函数中可得 \(y_1=c_1,y_2=c_2\)。

本来这个很显然的,但我想为了照顾那些还没有学二次函数的学弟,所以还是写写吧。

故,操作后的函数为 \(y=ax^2+bx+c+k\)。

Part 2 操作 \(2\)

这个用顶点式的话很方便,但是我们这里只提一般式的做法,不过会借用一下顶点式。

首先,我们可以由顶点式 \(y=a(x-h)^2+s\)(由于为避免与题面中的 \(k\) 重复,故改为 \(s\))向右平移 \(k\) 格后的式子为 \(y=a(x-h-k)^2+s\),然后再把它拆开,得到:\(y=ax^2-(2ak+2ah)x+ah^2+ak^2+2ahk+s\)。又由于我们知道 \(h=-\dfrac{b}{2a},s=\dfrac{4ac-b^2}{4a}\),所以,直接将它强算过来,可以得到 \(y=ax^2+(b-2ak)x+ak^2-bk+c\)。

故,操作后的函数为 \(y=ax^2+(b-2ak)x+ak^2-bk+c\)。

Part 3 操作 \(3\)

首先,我们令一个在抛物线上的点为 \((x_0,y_0)\),所以我们就有在与 \((k_1,k_2)\) 对称后的坐标为 \((2k_1-x_0,2k_2-y_0)\)。

什么什么,要我讲原因?

可以,那请听我说:由于它们的横坐标和纵坐标之差分别为 \((x_0-k_1,y_0-k_2)\),所以它的对称点的坐标为 \((k_1-(x_0-k_1),k_2-(y_0-k_2))\Rightarrow(2k_1-x_0,2k_2-y_0)\)。

那么我们再代入到 \(y=ax^2+bx+c\) 中可得:\(2k_2-y_0=a(2k_1-x_0)^2+b(2k_1-x_0)+c\),因此可得到 \(y_0=2k_2-a(2k_1-x_0)^2-b(2k_1-x_0)-c\)。

那么再对右边的式子进行化简,然后再合并 \(x\) 同类项,可得到 \(y_0=-ax_0^2+(4ak_1+b)x_0+2k_2-4ak_1^2-2bk_1-c\)。

故,操作后的函数为 \(y=-ax^2+(4ak_1+b)x+2k_2-4ak_1^2-2bk_1-c\)。

Part 4 操作 \(4\)

这一段是我们的重头戏。

首先根据 \(a<0\) 和 \(a>0\) 两大类,再通过 \(k_1,k_2\) 以及 \(x'=-\dfrac{b}{2a}\) 之间的关系进行分类讨论。

笔者温馨提示:自己画一个函数图像具体分析,下面的两个图中作为例子的函数解析式左边有。

好的,那么现在就开始吧。

4.1 \(a<0\)

那么这时候还需要 \(4\) 种情况来分类讨论:

  1. \(k_2<x'\),此时可以从图像上看到,\(y_{\min}=ak_2^2+bk_2+c,y_{\max}=ak_1^2+bk_1+c\)。

  2. \(k_2\geqslant x,k_1<x'\) 且 \(k_2-x'<x'-k_1\),此时可以从图像上看到,\(y_{\min}=ax'^2+bx'+c,y_{\max}=ak_1^2+bk_1+c\)。

  3. \(k_2\geqslant x,k_1<x'\) 且 \(k_2-x'\geqslant x'-k_1\),此时可以从图像上看到 \(y_{\min}=ax'^2+bx'+c,y_{\max}=ak_2^2+bk_2+c\)。

  4. \(k_1\geqslant x\),此时可以从图像上看到 \(y_{\min }=ak_1^2+bk_1+c,y_{\max}=ak_2^2+bk_2+c\)。

4.2 \(a>0\)

同样,这时候还需要 \(4\) 种情况来分类讨论:

  1. \(k_2<x'\),此时可以从图像上看出 \(y_{\min}=ak_1^2+bk_1+c,y_{\max}=ak^2+bk_2+c\)。

  2. \(k_2\geqslant x,k_1<x'\) 且 \(k_2-x'<x'-k_1\),此时可以从图像上看到 \(y_{\min}=ak_1^2+bk_1+c,y_{\max}=ax'^2+bx'+c\)。

  3. \(k_2\geqslant x,k_1<x\) 且 \(k_2-x'\geqslant x'-k_1\),此时可以从图像上看到 \(y_{\min}=ak_2^2+bk_2+c,y_{\max}=ax'^2+bx'+c\)。

  4. \(k_1\geqslant x\),此时可以从图像上看到 \(y_{\min}=ak_2^2+bk_2+c,y_{\max}=ak_1^2+bk_1+c\)。

至此,所有的分类讨论就完了,直接判断条件对应输出结果就好。

Part 5 操作 \(5\)

这个倒比操作 \(4\) 简单,直接联立一下就得到 \(ax^2+bx+c=ux^2+vx+w\)。所以,我们就只需要判断这个方程是否有实数根就好了。

我们将上面这个方程移项,可以得到 \((a-u)x^2+(b-v)x+c-w=0\),所以,我们可以得到 \(\triangle=(b-v)^2-4(a-u)(c-w)\)。根据 \(\triangle\) 可以判别出这个方程实数根的情况,也就可以判断这两个函数图像是否有交点了。具体如下——

当 \(\triangle\geqslant 0\) 时,这个方程有实数根,这两个函数图像也就有交点了;否则,当 \(\triangle<0\) 时,这个方程没有实数根,这两个函数图像也就没有交点了。

至此,用一般式解决本题的算法也就讲完了。顶点式的话题解区里的大佬们已经讲得很清楚了。

如有不懂的话,下面的代码也许能帮助你。

Code

#include <cstdio>
#include <algorithm>
using namespace std; int t; double f(double a, double b, double c, double x) {
return a * x * x + b * x + c;
} int main() {
scanf("%d", &t);
while(t--) {
double a, b, c;
int m;
scanf("%lf%lf%lf%d", &a, &b, &c, &m);
while(m--) {
int opt;
scanf("%d", &opt);
if(opt == 1) {
double k;
scanf("%lf", &k);
double a0 = a, b0 = b, c0 = c + k;
a = a0, b = b0, c = c0;
}
else if(opt == 2) {
double k;
scanf("%lf", &k);
double a0 = a, b0 = b - 2 * a * k, c0 = a * k * k - b * k + c;
a = a0, b = b0, c = c0;
}
else if(opt == 3) {
double k1, k2;
scanf("%lf%lf", &k1, &k2);
double a0 = -a, b0 = 4 * a * k1 + b, c0 = 2 * k2 - 4 * a * k1 * k1- 2 * b * k1 - c;
a = a0, b = b0, c = c0;
}
else if(opt == 4) {
double k1, k2, xp = -(b / (2 * a)), yp = (4 * a * c - b * b) / (4 * a);
scanf("%lf%lf", &k1, &k2);
if(a > 0) {
if(k2 < xp) {
printf("%.2lf %.2lf\n", f(a, b, c, k2), f(a, b, c, k1));
}
else if(k1 < xp) {
if(k2 - xp < xp - k1) {
printf("%.2lf %.2lf\n", f(a, b, c, xp), f(a, b, c, k1));
}
else if(k2 - xp >= xp - k1) {
printf("%.2lf %.2lf\n", f(a, b, c, xp), f(a, b, c, k2));
}
} else {
printf("%.2lf %.2lf\n", f(a, b, c, k1), f(a, b, c, k2));
}
} else if(a < 0) {
if(k2 < xp) {
printf("%.2lf %.2lf\n", f(a, b, c, k1), f(a, b, c, k2));
}
else if(k1 < xp) {
if(k2 - xp < xp - k1) {
printf("%.2lf %.2lf\n", f(a, b, c, k1), f(a, b, c, xp));
}
else if(k2 - xp >= xp - k1) {
printf("%.2lf %.2lf\n", f(a, b, c, k2), f(a, b, c, xp));
}
} else {
printf("%.2lf %.2lf\n", f(a, b, c, k2), f(a, b, c, k1));
}
}
}
else if(opt == 5) {
double u, v, w;
scanf("%lf%lf%lf", &u, &v, &w);
double delta = (b - v) * (b - v) - 4 * (a - u) * (c - w);
puts(delta < 0 ? "0" : "2");
}
}
printf("%.2lf\n", (4 * a * c - b * b) / (4 * a));
}
return 0;
}

LuoguP5139 z小f的函数 题解的更多相关文章

  1. 算法与数据结构实验题 4.2 小 F 打怪

    ★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...

  2. 数据结构_sfdg(小F打怪)

    问题描述 小 F 很爱打怪, 今天因为系统 bug, 他提前得知了 n 只怪的出现顺序以及击倒每只怪得到的成就值 ai. 设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒钟出现一只新怪且没被击倒 ...

  3. 小B的询问(题解)(莫队)

    小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...

  4. P2188 小Z的 k 紧凑数 题解(数位DP)

    题目链接 小Z的 k 紧凑数 解题思路 数位DP,把每一个数位的每一个数对应的可能性表示出来,然后求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)区 ...

  5. 【转载】shell编程——if语句 if -z -n -f -eq -ne -lt

    shell编程中条件表达式的使用 if  条件then Commandelse Commandfi                              别忘了这个结尾 If语句忘了结尾fites ...

  6. shell编程——if语句 if -z -n -f -eq -ne -lt

    if  条件then Commandelse Commandfi                              别忘了这个结尾 If语句忘了结尾fitest.sh: line 14: sy ...

  7. Shell学习:if语句 if -z -n -f -eq -ne -lt

    if  条件then Commandelse Commandfi                              别忘了这个结尾 If语句忘了结尾fitest.sh: line 14: sy ...

  8. bzoj4548: 小奇的糖果 题解

    题目链接 题解 不包含所有颜色 就强制不选一个颜色 图中圆点颜色相同 矩形越大,包括的点一定不比其一小部分少 如图所示,最大矩形只有3种 离散化\(x\)坐标 然后按\(y\)排序 每次取出颜色的前驱 ...

  9. [HG]小G坐电梯 题解

    C 小G坐电梯 题目描述 小G来到了著名的某大厦.大厦一共有n层,初始的时候小G在第 A 层. 小G特别想去B层小 M 的办公室看一看,然而因为安保原因,B层已经被封锁无法进入. 但是小G既然来了,就 ...

随机推荐

  1. 混合(Pooling)样本测序研究

    目录 1.混合测序基础 2. 点突变检测 3. BSA 4. BSR 5. 混合样本GWAS分析 6. 混合样本驯化研究 7. 小结 1.混合测序基础 测序成本虽然下降了,但对于植物育种应用研究来说还 ...

  2. 数据库命令补全工具mycli

    一.安装 我的数据库安装的是win版本,安装python后,直接命令行: 1 pip install mycli 即可. 二.使用 进入命令行后输入: 1 mycli -u root -p 88888 ...

  3. 55. Binary Tree Preorder Traversal

    Binary Tree Preorder Traversal My Submissions QuestionEditorial Solution Total Accepted: 119655 Tota ...

  4. Python添加模块路径

    1.用函数临时添加 1 import sys #导入sys模块 2 3 4 sys.path.append(r'/tmp/test') #要用绝对路径 5 print(sys.path) #查看模块路 ...

  5. pyspider爬虫框架的安装和使用

    pyspider是国人binux编写的强大的网络爬虫框架,它带有强大的WebUI.脚本编辑器.任务监控器.项目管理器以及结果处理器,同时支持多种数据库后端.多种消息队列,另外还支持JavaScript ...

  6. TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况

    TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况 请访问原文链接:https://sysin.org/blog/tlsv1-3-support/,查看最新版. ...

  7. [php反序列化] CVE-2020-15148(Yii2 反序列化漏洞) 漏洞复现

    漏洞影响范围 Yii2 < 2.0.38 环境搭建 Yii2.0.37 漏洞分析 首先定位到漏洞起始点 为什么是这儿?我们该怎么发现是某个类的某个函数?为什么不是其他函数? 一般是__destr ...

  8. AI常用环境安装

    torch环境 conda create --name py37 python=3.7 conda activate py37 pip install jieba==0.42.1pip install ...

  9. 如何在Swagger2或Swagger3中增加Json Web Token

    1. 前言 Swagger 3.0已经发布有一段时间了,作为一个非常有用的文档工具已经越来越多的项目在使用它.而JWT也是目前前后端分离最常用的安全技术.那么如何在Swagger 3.0 中添加JWT ...

  10. RecyclerView实现侧滑删除、置顶、滑动

    1.首先在build.gradle里添加 compile 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.2.1' 2.设置recyclerView的item布 ...