QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#202558#6542. Optimal Quadratic Functionucup-team1209WA 275ms7944kbC++203.4kb2023-10-06 11:27:572023-10-06 11:27:57

Judging History

你现在查看的是最新测评结果

  • [2023-10-06 11:27:57]
  • 评测
  • 测评结果:WA
  • 用时:275ms
  • 内存:7944kb
  • [2023-10-06 11:27:57]
  • 提交

answer

#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")

using std::cin;
using std::cout;
using ll = long long;
using u64 = unsigned long long;
void IOinit() {
	std::ios::sync_with_stdio(false), cin.tie(0);
#ifdef zqj
	freopen("$.in", "r", stdin);
#endif
}
using db = __float128;
int T, n;
const int N = 100000;
const db eps = 1e-13;
db sgn(db x) { return x < -eps ? -1 : x > eps; }
db eq(db x, db y) { return !sgn(x - y); }
struct vec2 {
	db x, y;
	db norm() const { return x * x + y * y; }
	db arg() const { return atan2(y, x); }
};
vec2 r90(vec2 x) { return {-x.y, x.x}; }
vec2 operator + (vec2 x, vec2 y) { return {x.x + y.x, x.y + y.y}; }
vec2 operator - (vec2 x, vec2 y) { return {x.x - y.x, x.y - y.y}; }
vec2 operator / (vec2 x, db y) { return {x.x / y, x.y / y}; }
vec2 operator * (vec2 x, db y) { return {x.x * y, x.y * y}; }
vec2 operator * (db y, vec2 x) { return {x.x * y, x.y * y}; }
db operator * (vec2 x, vec2 y) { return x.x * y.y - x.y * y.x; }
db operator % (vec2 x, vec2 y) { return x.x * y.x + x.y * y.y; }

struct line : vec2 {
	db z;
	// a * x + b * y + c (= or >) 0
	line() = default;
	line(db a, db b, db c) : vec2{a, b}, z(c) {}
	line(vec2 a, vec2 b) : vec2(r90(b - a)), z(a * b) { }
	// 左侧 > 0
	db operator ()(vec2 a) const { return a % vec2(*this) + z; }
	line perp() const { return {y, -x, 0}; } // 垂直
	line para(vec2 o) { return {x, y, z - (*this)(o)}; } // 平行
};
vec2 operator & (line x, line y) {
	return vec2{vec2{x.z, x.y} * vec2{y.z, y.y}, vec2{x.x, x.z} * vec2{y.x, y.z}} / -(vec2(x) * vec2(y));
	// 注意此处精度误差较大,以及 res.y 需要较高精度
}

std::vector<vec2> cut(const std::vector<vec2> & o, line l) {
	std::vector<vec2> res;
	int n = size(o);
	for(int i = 0;i < n;++i) {
		vec2 a = o[i], b = o[(i + 1) % n];
		if(sgn(l(a)) >= 0) res.push_back(a); // 注意 sgn 精度
		if(sgn(l(a)) * sgn(l(b)) < 0) res.push_back(line(a, b) & l);
	}
	return res;
} // 切凸包
db x[N], y[N], sx[N];
std::pair<vec2, db> eval_d(db a, db b) {
	db min = y[0] - (a * sx[0] + b * x[0]), damin = -sx[0], dbmin = -x[0];
	db max = min, damax = -sx[0], dbmax = -x[0];
	for(int i = 1;i < n;++i) {
		db v = y[i] - (a * sx[i] + b * x[i]);
		if(max < v) max = v, damax = -sx[i], dbmax = -x[i];
		if(min > v) min = v, damin = -sx[i], dbmin = -x[i];
	}
	return std::make_pair(vec2{damax - damin, dbmax - dbmin}, max - min);
}


int main() {
	IOinit();
	cin >> T;
	for(int i = 0;i < T;++i) {
		cin >> n;
		for(int i = 0;i < n;++i) {
			int a, b; cin >> a >> b;
			x[i] = a;
			y[i] = b;
			sx[i] = x[i] * x[i];
		}
		if(n <= 3) {
			puts("0");
			continue;
		}
		const db V = 1e12;
		std::vector<vec2> v = { {-V, -V}, {V, - V}, {V, V}, {-V, V} };
		auto center = [&]() -> vec2 {
			vec2 sum = v[0];
			for(int j = 1;j < (int) v.size();++j) sum = sum + v[j];
			sum = sum / v.size();
			return sum;
		};
		db res = 1e6;
		for(int i = 0;i < 200;++i) {
			vec2 x = center();
			auto [d, tmp] = eval_d(x.x, x.y);
			res = std::min(res, tmp / 2);
			d.x *= -1, d.y *= -1;
			line L; L.x = d.x, L.y = d.y; L = L.para(x);
			v = cut(v, L);
			assert(v.size());
		}
		for(auto [x, y] : v) {
		//	std::cerr << "de " << x << ' ' << y << '\n';
		}
		// std::cerr << (double)res << '\n';
		printf("%.10lf\n", double(res * res));
		// cout << res * res << '\n';
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6128kb

input:

1
4
0 0
1 3
2 9
3 0

output:

5.0625000000

result:

ok found '5.0625000', expected '5.0625000', error '0.0000000'

Test #2:

score: -100
Wrong Answer
time: 275ms
memory: 7944kb

input:

60
1
1000 -990
2
171 -638
949 -99
2
633 227
-257 -602
3
634 -994
633 999
-374 995
3
445 -110
586 -121
462 29
9
-995 -224
-458 -833
691 -670
456 -259
-376 55
-563 -12
834 827
-826 -220
299 744
17
997 991
997 976
997 988
998 -986
999 -982
999 -980
999 -996
998 -988
998 -991
997 987
1000 996
999 -1000
...

output:

0
0
0
0
0
543160.1259963982
121.0000000000
0.8320061812
412780.6071794284
12.2500000000
15750.2500000000
118751.3800860984
880245.5054735196
1.0000000000
15.3633733603
854986.7131649867
20.2500000000
24567.6673810630
881031.5630210808
306.2500000000
0
0
181005481253.1223449707
7601049.0000000000
189...

result:

wrong answer 27th numbers differ - expected: '23931780601.0000000', found: '151003831878.9704285', error = '5.3097617'