QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#202540#6542. Optimal Quadratic Functionucup-team1209WA 3410ms8240kbC++203.5kb2023-10-06 11:15:272023-10-06 11:15:27

Judging History

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

  • [2023-10-06 11:15:27]
  • 评测
  • 测评结果:WA
  • 用时:3410ms
  • 内存:8240kb
  • [2023-10-06 11:15:27]
  • 提交

answer

#include<bits/stdc++.h>
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-12;
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], o[N];
db eval(db a, db b) {
	db min = y[0] - a * x[0] * x[0] - b * x[0];
	db max = min;
	for(int i = 1;i < n;++i) {
		db v = y[i] - a * x[i] * x[i] - b * x[i];
		if(max < v) max = v;
		if(min > v) min = v;
	}
	return max - min;
}
std::pair<vec2, db> eval_d(db a, db b) {
	db min = y[0] - a * x[0] * x[0] - b * x[0], damin = -x[0] * x[0], dbmin = -x[0];
	db max = min, damax = -x[0] * x[0], dbmax = -x[0];
	for(int i = 1;i < n;++i) {
		db v = y[i] - a * x[i] * x[i] - b * x[i];
		if(max < v) max = v, damax = -x[i] * x[i], dbmax = -x[i];
		if(min > v) min = v, damin = -x[i] * x[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;
		}
		const db V = 1e18;
		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 = eval(0, 0) / 2;
		for(int i = 0;i < 220;++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';
	}
}

详细

Test #1:

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

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: 0
Accepted
time: 390ms
memory: 8240kb

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.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
543160.1259963989
121.0000000000
0.8320061812
412780.6071794287
12.2500000000
15750.2500000000
118751.3800860987
880245.5054735214
1.0000000000
15.3633733603
854986.7131649936
20.2500000000
24567.6673810631
881031.5630210962
306.250000...

result:

ok 60 numbers

Test #3:

score: 0
Accepted
time: 181ms
memory: 7808kb

input:

1000
1
-585478 527569
1
152984 679945
1
-174472 172630
1
235983 471538
1
-250372 650998
1
521028 -109032
1
121457 989514
1
916700 -223410
1
25908 939341
1
999032 369442
1
249207 -874185
1
-921949 719467
1
-692065 -756006
1
580461 644861
1
-382986 975568
1
644060 -113069
1
-588888 717169
1
2947 -3929...

output:

0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0...

result:

ok 1000 numbers

Test #4:

score: 0
Accepted
time: 3410ms
memory: 6892kb

input:

1000
2
578578 -462573
-614596 -50411
2
568651 926188
-15389 -281674
2
-56242 -213116
215036 310015
2
-568452 -743741
-314862 -573269
2
-428037 -926383
-172945 -31965
2
-58020 145819
-69585 116311
2
-629887 -794837
704590 -761914
2
243217 -433618
98814 -457689
2
147490 681479
665176 -119632
2
-851707...

output:

0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0...

result:

ok 1000 numbers

Test #5:

score: 0
Accepted
time: 479ms
memory: 5684kb

input:

1000
3
-734917 -489090
419510 102330
712427 633246
3
36286 -456156
747264 -743132
260371 -674274
3
429263 14588
352092 -105774
547767 232534
3
-913665 328259
240305 -680653
-295994 -678964
3
597443 -368402
-231672 43641
-590555 396735
3
-603016 904082
-607928 649743
464117 526551
3
350193 -351624
33...

output:

0.0000000002
0.0000000000
0.0000000000
0.0000000000
0.0000000001
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0...

result:

ok 1000 numbers

Test #6:

score: -100
Wrong Answer
time: 519ms
memory: 5688kb

input:

1000
4
-48411 -514672
165369 -349660
-281244 -842990
50473 -422110
4
-487482 -318709
861670 -709796
-491931 -335068
-523699 -455262
4
-817575 -338873
869501 905839
-717462 -668516
841972 769497
4
530706 615905
128991 -871809
82920 -948448
-317630 -725769
4
144451 772470
-923425 791489
513030 193835
...

output:

0.0016354198
0.4418888938
0.0950875754
3655702.6519580577
769858.6660405861
876.9644189422
2.3833781271
0.0033143387
0.0460742901
0.4140908021
31534.7528415217
0.0115333110
1322109.7958560728
2475705.1418785509
5494047.0765112033
0.6047581994
36615.9822733809
15433.4438032757
0.0000134834
416.623552...

result:

wrong answer 10th numbers differ - expected: '0.4140871', found: '0.4140908', error = '0.0000037'