[hdu4498]离散化,simpson求积分
题意:
,求这个函数在[0,100]上的图像的长度。
思路:采用离散化的思想,求出所有交点 ,把交点排序,把[0,100]分成若干个小区间,这样原函数在每个小区间上的图像属于某一个二次函数或者是一条直线。如何确定属于哪个呢?比如对于某个区间,令m为这个小区间的中点,求出所有的函数在m点的函数值的最小值,对应的那个函数就是答案。如果最小值>=100则说明是直线。那么问题就变成了求二次函数曲线在区间[L,R]上的长度。这个可以转化为积分来算,令f(x)为原函数的倒数,则答案就是sqrt(1+f(x)*f(x))在[L,R]上的积分了。求积分可以用自适应辛普森法。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <cmath>#include <algorithm>using namespace std;const int maxn = 123;#define _x2(a) (a) * (a)namespace Integral { double (*func)(double); double simpson(double a, double b) { double c = a + (b - a) / 2; return (func(a) + func(c) * 4 + func(b)) * (b - a) / 6; } double asr(double a, double b, double eps, double A) { double c = a + (b - a) / 2; double L = simpson(a, c), R = simpson(c, b); if (fabs(L + R - A) < 15 * eps) return L + R + (L + R - A) / 15; return asr(a, c, eps / 2, L) + asr(c, b, eps / 2, R); } double getans(double a, double b, double eps, double (*f)(double)) { func = f; return asr(a, b, eps, simpson(a, b)); }};int k[maxn], a[maxn], b[maxn];int A[maxn], B[maxn], C[maxn];int ga, gb, gc, cnt;double pos[12345];double F(double x) { return ga * x * x + gb * x + gc;}double f(double x) { return sqrt(1.0 + _x2(2.0 * ga * x + gb));}void add(double x) { if (x > 0 && x < 100) pos[cnt ++] = x;}int main() {#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);#endif // ONLINE_JUDGE int T, n; cin >> T; while (T --) { cnt = 0; pos[cnt ++] = 0; pos[cnt ++] = 100; cin >> n; for (int i = 0; i < n; i ++) { cin >> k[i] >> a[i] >> b[i]; A[i] = k[i]; B[i] = -2 * k[i] * a[i]; C[i] = k[i] * a[i] * a[i] + b[i]; if (b[i] < 100) { double buf = sqrt((100.0 - b[i]) / k[i]); add(a[i] + buf); add(a[i] - buf); } } for (int i = 0; i < n; i ++) { for (int j = i + 1; j < n; j ++) { ga = A[i] - A[j]; gb = B[i] - B[j]; gc = C[i] - C[j]; if (ga == 0) { if (gb != 0) add(-1.0 * gc / gb); continue; } int d = gb * gb - 4 * ga * gc; if (d >= 0) { add((-gb - sqrt(1.0 * d)) / 2.0 / ga); if (d) add((-gb + sqrt(1.0 * d)) / 2.0 / ga); } } } sort(pos, pos + cnt); double ans = 0; for (int i = 1; i < cnt; i ++) { double L = pos[i - 1], R = pos[i]; if (R - L < 1e-10) continue; double M = (L + R) / 2, minval = 100; int target = -1; for (int i = 0; i < n; i ++) { ga = A[i]; gb = B[i]; gc = C[i]; if (F(M) < minval) { minval = F(M); target = i; } } if (~target) { ga = A[target]; gb = B[target]; gc = C[target]; ans += Integral::getans(L, R, 1e-8, f); } else ans += R - L; } printf("%.2f\n", ans); } return 0;} |
[hdu4498]离散化,simpson求积分的更多相关文章
- bzoj1502 simpson求面积
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题解: simpson积分求面积,s = (f(a)+f(b)+4*f(c))/6*Δx ...
- codeforces_459D_(线段树,离散化,求逆序数)
链接:http://codeforces.com/problemset/problem/459/D D. Pashmak and Parmida's problem time limit per te ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
- HDOJ-6665(离散化+DFS求连通分量)
Calabash and Landlord HDOJ-6665 这里考察的是离散化的知识. 首先将所有的x坐标和y坐标放入两个数组中,然后对这两个数组进行排序.因为总共的坐标数就5个所以这两个数组的大 ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- [BZOJ 2178] 圆的面积并 【Simpson积分】
题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13 2)要去掉被其他圆包含的圆. ...
- 自适应Simpson积分
自适应Simpson积分 作用 如标题所示,这玩意就是当你不会微积分的时候来求积分的. 总所周知,积分的定义就是函数的某一段与坐标轴之间的面积. 那么,自适应Simpson积分就是一种可以再某些精度下 ...
- BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
BZOJ 洛谷 https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p3779# 正态分布 正态分布是随机变量\(X\)的一种概率分布形式.它 ...
- POJ 2528 区间染色,求染色数目,离散化
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47905 Accepted: 13903 ...
随机推荐
- Upload-Labs 实验操作记录
0x01 安装 下载:https://github.com/c0ny1/upload-labs 环境:简单搭建phpstudy环境即可,记得在upload-labs根目录下创建该文件夹 0x02 文件 ...
- [RCTF2015]EasySQL
[RCTF2015]EasySQL EasySQL github 打开靶机,是如下界面 到注册页面,试了一下,username 和 email 处有过滤,直接 fuzz 一下哪些字符被禁了 注册成功之 ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(上)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- Java ASM学习(2)
1.编译后的方法区,其中存储的代码都是一些字节码指令 2.Java虚拟机执行模型: java代码是在一个线程内部执行,每个线程都有自己的执行栈,栈由帧组成,每个帧表示一个方法的调用,每调用一个方法,都 ...
- Async,Await 深入源码解析
1.同步与异步 假设存在 IO事件A:请求网络资源 (完成耗时5s) IO事件B:查询数据库 (完成耗时5s) 情况一:线程1工人在发起A请求后,一直阻塞等待,在A响应返回结果后再接着处理事件B,那总 ...
- php 数据库备份(可用作定时任务)
参考: https://blog.csdn.net/weixin_37616043/article/details/87721181 https://blog.csdn.net/stpeace/art ...
- js 随机数生成器
title: js 随机数生成器 js 随机数生成器 js 随机数生成器 确定产生随机数的数目,最小值和最大值: 个数: 最小值: 最大值: 是否为唯一的随机数: 唯一 允许重复 点击生成产生随机数: ...
- 使用spring boot创建fat jar APP
文章目录 介绍 build和run fat jar和 fat war 更多配置 介绍 在很久很很久以前,我们部署web程序的方式是怎么样的呢?配置好服务器,将自己写的应用程序打包成war包,扔进服务器 ...
- Python语言类型
Python是一门动态解释型的强类型语言. 对这句话进行解析,语言分为动态的和静态的,编译型和解释型的,强类型的和弱类型的语言之分. 下面对三种不同维度的类型的语言进行解释: 1.编译型和解释型 差别 ...
- 解决material UI中弹窗(dialog、popover等)内容被遮挡问题
在material ui中有几种弹出层,比如:dialog.popover等,这些弹出层都会遇到的一个公共问题是: 假如弹出层中的内容变化了,弹出层的位置并不会重新定位. 这样,假如一开始弹出层定位在 ...