AC。
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
#define EPSILON 1e-6
|
#define EPSILON 1e-6
|
||||||
|
|
||||||
double A[5051] = {0};
|
double A[5051] = {0};
|
||||||
double point_xs[101] = {0};
|
double point_xs[101] = {0};
|
||||||
int valid_point_num = 0;
|
int valid_point_num = 0;
|
||||||
|
double t[101] = {0};
|
||||||
|
int n, m;
|
||||||
|
|
||||||
double get_num(int row, int col) {
|
double get_num(int row, int col) {
|
||||||
if (col > row) {
|
if (col > row) {
|
||||||
@@ -33,6 +35,15 @@ double evaluate(double x, int highest) {
|
|||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double evaluate_2(double x, int highest) {
|
||||||
|
double ans = t[highest];
|
||||||
|
for (int j = highest - 1; j >= 0; j--) {
|
||||||
|
ans *= x - point_xs[j];
|
||||||
|
ans += t[j];
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
int display_mat() {
|
int display_mat() {
|
||||||
for (int i = 0; i < valid_point_num; i++) {
|
for (int i = 0; i < valid_point_num; i++) {
|
||||||
for (int j = 0; j < valid_point_num; j++) {
|
for (int j = 0; j < valid_point_num; j++) {
|
||||||
@@ -44,9 +55,66 @@ int display_mat() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main_2() {
|
||||||
int n, m;
|
double read_x, read_y;
|
||||||
scanf("%d %d", &n, &m);
|
bool found_duplicate = false;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
scanf("%lf %lf", &read_x, &read_y);
|
||||||
|
for (int j = 0; j < valid_point_num; j++) {
|
||||||
|
if (compare_double(read_x, point_xs[valid_point_num])) {
|
||||||
|
found_duplicate = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_duplicate) {
|
||||||
|
point_xs[valid_point_num] = read_x;
|
||||||
|
t[valid_point_num] = read_y;
|
||||||
|
valid_point_num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare the matrix
|
||||||
|
for (int row = 0; row < valid_point_num; row++) {
|
||||||
|
set_num(row, 0, 1);
|
||||||
|
for (int col = 1; col <= row; col++) {
|
||||||
|
set_num(row, col, get_num(row, col - 1) * (point_xs[row] - point_xs[col - 1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Solve for t
|
||||||
|
for (int row = 0; row < valid_point_num; row++) {
|
||||||
|
for (int i = 0; i < row; i++) {
|
||||||
|
t[row] -= t[i] * get_num(row, i);
|
||||||
|
}
|
||||||
|
if (!compare_double(t[row], 0)) {
|
||||||
|
t[row] /= get_num(row, row);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
t[row] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find for highest exponent
|
||||||
|
int highest = valid_point_num - 1;
|
||||||
|
for (; highest >= 0; highest--) {
|
||||||
|
if (!compare_double(t[highest], 0)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%d\n", highest);
|
||||||
|
|
||||||
|
// Evaluate
|
||||||
|
for (int i = 0; i < m; i++) {
|
||||||
|
double to_be_evaled = 0;
|
||||||
|
scanf("%lf", &to_be_evaled);
|
||||||
|
printf("%lf\n", evaluate_2(to_be_evaled, highest));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main_1() {
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
bool found_duplicate = false;
|
bool found_duplicate = false;
|
||||||
double read_x, read_y;
|
double read_x, read_y;
|
||||||
@@ -69,7 +137,9 @@ int main() {
|
|||||||
for (int col = 1; col < valid_point_num; col++) {
|
for (int col = 1; col < valid_point_num; col++) {
|
||||||
int delta = col;
|
int delta = col;
|
||||||
for (int row = col; row < valid_point_num; row++) {
|
for (int row = col; row < valid_point_num; row++) {
|
||||||
set_num(row, col, (get_num(row, col - 1) - get_num(row - 1, col - 1)) / (point_xs[row] - point_xs[row - delta]));
|
set_num(row, col,
|
||||||
|
(get_num(row, col - 1) - get_num(row - 1, col - 1)) /
|
||||||
|
(point_xs[row] - point_xs[row - delta]));
|
||||||
}
|
}
|
||||||
if (compare_double(get_num(col, col) / 1000, 0)) {
|
if (compare_double(get_num(col, col) / 1000, 0)) {
|
||||||
set_num(col, col, 0);
|
set_num(col, col, 0);
|
||||||
@@ -77,7 +147,6 @@ int main() {
|
|||||||
// display_mat();
|
// display_mat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Find the highest
|
// Find the highest
|
||||||
int highest = valid_point_num - 1;
|
int highest = valid_point_num - 1;
|
||||||
for (; highest >= 0; highest--) {
|
for (; highest >= 0; highest--) {
|
||||||
@@ -95,6 +164,16 @@ int main() {
|
|||||||
printf("%lf\n", evaluate(to_be_evaled, highest));
|
printf("%lf\n", evaluate(to_be_evaled, highest));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
scanf("%d %d", &n, &m);
|
||||||
|
if (n > 50) {
|
||||||
|
main_2();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
main_1();
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user