QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#111023#6436. Paimon Polygon5abWA 2ms5852kbC++203.8kb2023-06-05 14:43:002023-06-05 14:43:02

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-05 14:43:02]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:5852kb
  • [2023-06-05 14:43:00]
  • 提交

answer

/* name: 6436
 * author: 5ab
 * created at: 2023-06-04
 */
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <cmath>
using namespace std;

typedef long long ll;
using db = double;

const int max_n = 500000;

struct point
{
	int x, y;
	point operator-(const point& rhs) const {
		return point{ x - rhs.x, y - rhs.y };
	}
	bool operator==(const point& rhs) const = default;
}
a[max_n], b[max_n + 1];

inline void chmax(db& _a, db _b) { if (_a < _b) _a = _b; }
inline bool cclkw(point x, point y)
{
	return 1ll * x.x * y.y > 1ll * x.y * y.x;
}
inline bool cln(point x, point y)
{
	return 1ll * x.x * y.y == 1ll * x.y * y.x;
}
inline db dis(point x, point y)
{
	return hypot(x.x - y.x, x.y - y.y);
}

template<class It>
void cr(It bg, It ed)
{
	swap(*bg, *max_element(bg, ed, [](auto& x, auto& y) {
		return x.x == y.x ? x.y < y.y : x.x < y.x;
	}));
	sort(bg + 1, ed, [&](auto& lhs, auto& rhs) {
		return cclkw(lhs - *bg, rhs - *bg);
	});
}

template<class It>
db calc(It bg, It ed)
{
	db res = dis(*bg, *prev(ed));
	for (auto s = bg, t = next(bg); t != ed; s++, t++)
		res += dis(*s, *t);
	return res;
}

db solve1(int n)
{
	b[0] = {0, 0};
	copy(a, a + n, b + 1);
	cr(b, b + n + 1);
	
	static vector<point> c1, c2;
	c1.clear(), c2.clear();
	
	for (int i = 0; i <= n; i++)
	{
		while (ssize(c1) > 1 && cclkw(b[i] - c1.back(), c1.back() - end(c1)[-2]))
			c2.push_back(c1.back()), c1.pop_back();
		c1.push_back(b[i]);
	}
	// for (auto [x, y] : c1)
	// 	cerr << "(" << x << "," << y << ") ";
	// cerr << endl;
	
	// check colinearity
	for (int i = 1; i < ssize(c1) - 1; i++)
		if (cln(c1[i + 1] - c1[i], c1[i] - c1[i - 1]))
			return 0;
	for (int i = 1; i <= n; i++)
		if (c1.back() != b[i] && cln(c1.back() - b[i], b[i] - b[0]))
			return 0;
	if (find(c1.begin(), c1.end(), point{0, 0}) == c1.end())
		return 0;
	
	c2.push_back(point{0, 0});
	cr(c2.begin(), c2.end());
	for (int i = 0; i < ssize(c2); i++)
		if (!cclkw(c2[i] - c2[(i - 1 + ssize(c2)) % ssize(c2)], c2[(i + 1) % ssize(c2)] - c2[i]))
			return 0;
	
	return calc(c1.begin(), c1.end()) + calc(c2.begin(), c2.end());
}

db solve2(int n)
{
	int l = partition(a, a + n, [](auto& x) {
		return x.y < 0 || (x.y == 0 && x.x > 0);
	}) - a;
	sort(a, a + l, cclkw), sort(a + l, a + n, cclkw);
	
	auto nxt = [&](int x) {
		return x + 1 == n ? 0 : x + 1;
	};
	for (int i = 0; i < n; i++)
		if (cln(a[i], a[nxt(i)]))
			return 0;
	
	db ans = 0, bsv = calc(a, a + n);
	vector<int> xps;
	
	auto pre = [&](int x) {
		return x == 0 ? n - 1 : x - 1;
	};
	for (int i = 0; i < n; i++)
		if (!cclkw(a[i] - a[pre(i)], a[nxt(i)] - a[i]))
			xps.push_back(i);
	if (xps.size() > 4)
		return 0;
	
	auto od = [&](int id) {
		return hypot(a[id].x, a[id].y);
	};
	for (int i = 0, j = 1; i < n; i++)
	{
		while (nxt(j) != i && !cclkw(point{0, 0} - a[i], a[nxt(j)]))
		{
			// cerr << i << " " << j << " " << a[i].x << " " << a[i].y << " " << a[nxt(j)].x << " " << a[nxt(j)].y << endl;
			j = nxt(j);
		}
		if (!cclkw(point{0, 0} - a[i], a[nxt(j)]) || !cclkw(point{0, 0} - a[j], a[nxt(i)]))
			continue;
		bool ok = true;
		for (int x : xps)
			if (x != i && x != j && x != nxt(i) && x != nxt(j))
			{
				ok = false;
				break;
			}
		if (ok)
		{
			// cerr << i << " " << j << endl;
			chmax(ans, bsv - dis(a[i], a[nxt(i)]) - dis(a[j], a[nxt(j)])
			               + od(i) + od(nxt(i)) + od(j) + od(nxt(j)));
		}
	}
	return ans;
}

signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int cas, n;
	
	cin >> cas;
	while (cas--)
	{
		cin >> n;
		for (int i = 0; i < n; i++)
			cin >> a[i].x >> a[i].y;
		
		cout << fixed << setprecision(10) << max(solve1(n), solve2(n)) << "\n";
	}
	
	return 0;
}
// started coding at: 06-04 17:50:44

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 5780kb

input:

3
4
0 3
3 0
2 3
3 2
5
4 0
5 -5
-4 -2
1 -2
-5 -2
4
0 1
1 0
0 2
1 1

output:

17.2111025509
36.6326947621
0.0000000000

result:

ok 3 numbers

Test #2:

score: 0
Accepted
time: 2ms
memory: 5664kb

input:

14
4
0 3
1 3
3 1
3 0
4
-4 0
5 3
0 -4
-1 0
5
4 4
5 0
3 3
3 2
-4 2
5
1 1
2 4
1 4
0 4
-1 1
4
4 5
-2 4
1 4
-5 -2
5
3 5
3 -1
4 -5
4 1
2 4
5
4 0
5 -5
-4 -2
1 -2
-5 -2
5
3 4
3 5
-5 -1
1 2
4 1
5
-5 -3
3 -3
-3 -3
2 -3
-4 5
5
0 1
-3 -1
-3 -3
-4 -4
-3 0
6
1 -3
-3 -3
2 -2
-3 1
-4 -5
3 -3
6
-1 -4
-3 0
0 4
-4 -3
...

output:

14.3245553203
0.0000000000
30.6896447944
18.7482240257
30.2540122179
27.8210682918
36.6326947621
33.4097258671
29.5562146354
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.0000000000

result:

ok 14 numbers

Test #3:

score: -100
Wrong Answer
time: 1ms
memory: 5852kb

input:

100
6
-4 1
-1 4
1 4
-4 -1
-2 3
3 2
7
-5641417 962017
-5641417 -962017
-5719589 193284
-5693492 -578972
-5693492 578972
-5563601 1340673
-5719589 -193284
9
-25 55
58 15
-13 14
-1 19
-60 6
-17 8
11 15
16 58
16 11
10
398546 -221163
-87181 -447383
-221163 -398546
-467649 -57196
55334 -452427
-427086 -19...

output:

25.1141680517
24824262.6835847646
359.1097585858
3042924.9210867872
547.7541625009
62188.8862666670
34663049.5304524675
51604481.6979927868
2264792232.4113187790
69911.1777695327
6924993.0023835879
27901.9604859406
0.0000000000
68869955.9200051129
741423.3147931471
35164453.6311061978
0.0000000000
3...

result:

wrong answer 17th numbers differ - expected: '671.8132617', found: '0.0000000', error = '1.0000000'