QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#121854 | #6517. Computational Geometry | Sorting# | WA | 5ms | 3532kb | C++20 | 2.9kb | 2023-07-08 22:20:56 | 2023-07-08 22:21:00 |
Judging History
answer
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <numeric>
#include <utility>
#include <array>
#include <climits>
using namespace std;
typedef long long ll;
template<class T> int sgn(T x) { return (x > 0) - (x < 0);}
template <class T>
struct Point{
typedef Point P;
T x, y;
explicit Point(T x=0, T y=0): x(x), y(y){}
bool operator<(P p) const {return tie(x, y) < tie(p.x, p.y);}
P operator+(P p)const {return P(x+p.x, y+p.y);}
P operator-(P p)const {return P(x-p.x, y-p.y);}
T dot(P p)const{return x * p.x + y * p.y;}
T cross(P p) const { return x * p.y - y * p.x;}
T cross(P a, P b) const {return (a-*this).cross(b-*this);}
T dist2() const {return x * x + y * y;}
};
template<class P> bool onSegment(P s, P e, P p){
return p.cross(s, e) == 0 && (s - p).dot(e - p) <= 0;
}
typedef Point<ll> P;
array<P, 2> hullDiameter(vector<P> S){
int n = S.size(), j = n < 2 ? 0 : 1;
pair<ll, array<P, 2>> res({0, {S[0], S[0]}});
for(int i = 0; i < j; ++i){
for(;;j = (j + 1) % n){
res = max(res, {(S[i] - S[j]).dist2(), {S[i], S[j]}});
if((S[(j + 1) % n] - S[j]).cross(S[i + 1] - S[i]) >= 0)
break;
}
}
return res.second;
}
const int N = 5e3 + 3;
int n;
P p[N];
int nxt(int x){
return (x + 1) % n;
}
int prv(int x){
return (x + n - 1) % n;
}
ll diam(int l, int r){
vector<P> v;
for(int x = l; x != r; x = nxt(x)){
while(v.size() >= 2 && onSegment(p[x], v.back(), v[(int)v.size() - 2]))
v.pop_back();
v.push_back(p[x]);
}
for(int x: vector<int>{r, l}){
while(v.size() >= 2 && onSegment(p[x], v.back(), v[(int)v.size() - 2]))
v.pop_back();
v.push_back(p[x]);
}
v.pop_back();
auto [p1, p2] = hullDiameter(v);
return (p1 - p2).dist2();
}
void solve(){
cin >> n;
for(int i = 0; i < n; ++i){
cin >> p[i].x >> p[i].y;
}
int j = 0;
ll ans = LLONG_MAX;
for(int i = 0; i < n; ++i){
// cout << i << " " << j << " i j" << endl;
while(i == j || nxt(i) == j)
j = nxt(j);
while(onSegment(p[i], p[nxt(i)], p[j]))
j = nxt(j);
if(nxt(j) == i)
continue;
if(onSegment(p[j], p[nxt(j)], p[i]))
continue;
ll d1 = diam(i, j);
ll d2 = diam(j, i);
ans = min(ans, d1 + d2);
// cout << i << " " << j << " - " << d1 << " " << d2 << "\n";
if(d1 < d2){
j = nxt(j);
i = i - 1;
continue;
}
else{
continue;
}
}
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while(t--)
solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3524kb
input:
2 4 1 0 2 0 1 1 0 0 6 10 4 9 7 5 7 4 5 6 4 9 3
output:
4 44
result:
ok 2 number(s): "4 44"
Test #2:
score: -100
Wrong Answer
time: 5ms
memory: 3532kb
input:
713 8 8 25 3 15 0 5 10 0 19 2 24 6 23 15 15 34 8 25 16 18 25 10 32 1 23 0 14 21 0 27 2 32 6 7 16 15 8 20 1 16 0 12 16 0 21 1 24 5 7 15 1 18 0 24 8 27 15 4 19 0 17 7 8 4 10 20 0 30 15 0 14 10 6 15 0 24 10 21 14 12 14 7 11 0 3 7 18 7 16 9 12 10 6 9 0 4 5 0 15 1 9 0 23 8 13 14 6 24 0 34 1 41 11 37 20 1...
output:
1075 1417 706 687 1550 497 324 1668 494 162 519 190 786 983 367 1154 580 524 509 275 651 298 146 1618 494 965 705 1450 274 322 69 442 616 457 1078 175 431 555 371 1222 1222 1994 712 586 858 624 885 575 1351 27 222 407 703 670 1003 1455 579 3389 939 334 1794 834 938 602 203 198 1666 617 769 326 2553 ...
result:
wrong answer 2nd numbers differ - expected: '1389', found: '1417'