Я решаю следующую проблему.
Есть две функции f (x) и g (x). Каждый из них делится на части. Функция f (x) состоит из «n» частей, а функция g (x) состоит из «m» частей. Каждая часть представлена как полиномиальная функция второй степени (ax ^ 2 + bx + c). Нам нужно найти область между f (x) и g (x) с точностью 10 ^ (- 6).
Входные данные:
n, м ( 1 <= n, m <= 10 ^ 5); </p>
граничные точки f (x); // n + 1 балл
многочлены от f (x); // n строк (a, b, c для топора ^ 2 + bx + c)
граничные точки g (x); // m + 1 балл
полиномов от g (x); // m строк (a, b, c для топора ^ 2 + bx + c)
Первая и последняя точки функций равны.
Пример ввода:
1 1
0 1
1 -2 1
0 1
-1 2 1
Выход :
1.3333333333
Вот мой код:
#include <bits/stdc++.h>
using namespace std;
long double integrate(int f[3], int g[3], long double left, long double right) {
long double a = f[0] - g[0], b = f[1] - g[1], c = f[2] - g[2];
long double up = (a * right * right * right) / 3 + (b * right * right) / 2 + c * right;
long double down = (a * left * left * left) / 3 + (b * left * left) / 2 + c * left;
return (up > down) ? up - down : down - up;
}
void solve(int f[3], int g[3], int left, int right, long double &sum) {
long double a = f[0] - g[0], b = f[1] - g[1], c = f[2] - g[2];
if (a == 0) {
if (b != 0) {
long double x = -c/b;
if (x > left && x < right) {
sum += integrate(f, g, left, x);
sum += integrate(f, g, x, right);
}
} else {
sum += integrate(f, g, left, right);
}
return;
}
long double discriminant = b * b - 4 * a * c;
if (discriminant < 0) { sum += integrate(f, g, left, right); }
else {
long double q = b >= 0 ? (-b - sqrt(discriminant))/2 : (-b + sqrt(discriminant))/2;
long double x1 = q / a, x2 = c / q;
if (discriminant == 0.0) {
if (x1 > left && x1 < right) {
sum += integrate(f, g, left, x1);
sum += integrate(f, g, x1, right);
} else {
sum += integrate(f, g, left, right);
}
} else {
long double first = min(x1, x2), second = max(x1, x2);
if (first > left && first < right) {
sum += integrate(f, g, left, first);
if (second > left && second < right) {
sum += integrate(f, g, first, second);
sum += integrate(f, g, second, right);
} else {
sum += integrate(f, g, first, right);
}
} else if (second > left && second < right) {
sum += integrate(f, g, left, second);
sum += integrate(f, g, second, right);
} else {
sum += integrate(f, g, left, right);
}
}
}
return;
}
int main() {
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n, m;
cin >> n >> m;
int f[n+1];
int ffunc[n][3];
int g[m+1];
int gfunc[m][3];
set <int> points;
for (int i = 0; i < n+1; i++) {
cin >> f[i];
points.insert(f[i]);
}
for (int i = 0; i < n; i++) {
for (int k = 0; k < 3; k++) {
cin >> ffunc[i][k];
}
}
for (int i = 0; i < m+1; i++) {
cin >> g[i];
points.insert(g[i]);
}
for (int i = 0; i < n; i++) {
for (int k = 0; k < 3; k++) {
cin >> gfunc[i][k];
}
}
int fit = 0, git = 0;
long double sum = 0.0;
auto it1 = points.begin();
auto it2 = points.begin();
it2++;
while (it2 != points.end()) {
solve(ffunc[fit], gfunc[git], *it1, *it2, sum);
if (f[fit+1] == *it2) {
fit++;
}
if (g[git+1] == *it2) {
git++;
}
it1++;
it2++;
}
cout.precision(27);
cout << sum;
return 0;
}
Программа не проходит некоторые тесты. Он получает неправильный ответ.
В чем может быть проблема?