# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
21020 | zigui | Lonely mdic (kriii1_L) | C++14 | 0 ms | 1440 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<double, int> pdi;
const double EPS = 1e-8;
const double PI = acos(-1);
double sq(double x){ return x*x; }
ll sq(ll x){ return x*x; }
pii operator+(const pii &l, const pii &r){
return pii(l.first + r.first, l.second + r.second);
}
pii operator-(const pii &l, const pii &r){
return pii(l.first - r.first, l.second - r.second);
}
ll operator^(const pii &l, const pii &r){
return (ll)l.first * r.second - (ll)l.second * r.first;
}
ll operator*(const pii &l, const pii &r){
return (ll)l.first * r.first + (ll)l.second * r.second;
}
pdd operator+(const pdd &l, const pdd &r){
return pdd(l.first + r.first, l.second + r.second);
}
pdd operator-(const pdd &l, const pdd &r){
return pdd(l.first - r.first, l.second - r.second);
}
double operator^(const pdd &l, const pdd &r){
return l.first * r.second - l.second * r.first;
}
double operator*(const pdd &l, const pdd &r){
return l.first * r.first + l.second * r.second;
}
pdd operator*(const pdd &l, const double &r){
return pdd(l.first * r, l.second * r);
}
pdd operator-(const pdd &l){
return pdd(-l.first, -l.second);
}
double size(pdd x){ return hypot(x.first, x.second); }
double size2(pdd x){ return sq(x.first) + sq(x.second); }
double polar(pdd x){ return atan2(x.second, x.first); }
//double abs(const double &x){ return x < 0 ? -x : x; }
pdd unit(double a){ return pdd(cos(a), sin(a)); }
pdd norm(pdd a){ return a * (1.0 / size(a)); }
pdd rotate(pdd v, double a){ return unit(a) * v.first + unit(a + PI / 2) * v.second; }
void normalize(double &a){
while (a < 0) a += 2 * PI;
while (a >= 2 * PI) a -= 2 * PI;
}
struct circle{
pdd O;
double r;
};
int tangent(circle &A, circle &B, pdd des[4]){
// outer
int top = 0;
double d = size(A.O - B.O), a = polar(B.O - A.O), b = PI + a;
double t = sq(d) - sq(A.r - B.r);
if (t >= 0){
t = sqrt(t);
double p = atan2(B.r - A.r, t);
des[top++] = pdd(a + p + PI / 2, b + p - PI / 2);
des[top++] = pdd(a - p - PI / 2, b - p + PI / 2);
}
// inner
t = sq(d) - sq(A.r + B.r);
if (t >= 0){
t = sqrt(t);
double p = atan2(B.r + A.r, t);
des[top++] = pdd(a + p - PI / 2, b + p - PI / 2);
des[top++] = pdd(a - p + PI / 2, b - p + PI / 2);
}
return top;
}
int intersect(circle &A, circle &B, pdd des[2]){
double d = size(A.O - B.O), t = (sq(A.r) + sq(d) - sq(B.r)) / 2 / A.r / d, u = (sq(B.r) + sq(d) - sq(A.r)) / 2 / B.r / d;
if (abs(d) < EPS) return 0;
if (1 - t*t < 0 || 1 - u*u < 0) return 0;
double a = atan2(sqrt(1 - t*t), t), b = atan2(sqrt(1 - u*u), u), p = polar(B.O - A.O), q = PI + p;
des[0] = pdd(p + a, q - b);
des[1] = pdd(p - a, q + b);
return 2;
}
int intersect(circle &A, pdd &s, pdd &d, pdd des[2]){
double c = size2(A.O - s) - sq(A.r), b = d * (s - A.O), a = size2(d);
if (b*b - a*c < 0) return 0;
des[0].second = (-b + sqrt(b*b - a*c)) / a;
des[1].second = (-b - sqrt(b*b - a*c)) / a;
des[0].first = polar(s + d*des[0].second - A.O);
des[1].first = polar(s + d*des[1].second - A.O);
return 2;
}
int intersect(pdd &a, pdd &b, pdd &u, pdd &v, pdd des[2]){
if (abs(b^v) < EPS) return 0;
des[0] = pdd(((a - u) ^ v) / (v^b), ((a - u) ^ b) / (v^b));
return 1;
}
double dist(pdd &A, pdd &p, pdd &d){
double a = atan2((A - p) ^ d, (A - p)*d);
double r = abs(size(A - p) * sin(a)), e = size(A - p) * cos(a);
if (0 < e && e < size(d));
else r = min(size(A - p), size(A - p - d));
return r;
}
struct V3{
double x, y, z;
V3(){}
V3(double x, double y, double z) :x(x), y(y), z(z){}
V3 operator-()const{ return V3(-x, -y, -z); }
V3 operator-(const V3 &l)const{
return V3(x - l.x, y - l.y, z - l.z);
}
V3 operator+(const V3 &l)const{
return V3(x + l.x, y + l.y, z + l.z);
}
V3 operator*(const double c)const{
return V3(x*c, y*c, z*c);
}
double operator*(const V3 &l)const{
return x*l.x + y*l.y + z*l.z;
}
V3 operator^(const V3 &l)const{
return V3(y*l.z - z*l.y, z*l.x - x*l.z, x*l.y - y*l.x);
}
double size(){ return sqrt(sq(x) + sq(y) + sq(z)); }
double size2(){ return sq(x) + sq(y) + sq(z); }
V3 norm(){
double p = size();
return V3(x / p, y / p, z / p);
}
void print(){ printf("%lf %lf %lf\n", x, y, z); }
bool operator < (const V3 &l) const {
if (abs(x - l.x) >= EPS) return x < l.x;
if (abs(y - l.y) >= EPS) return y < l.y;
if (abs(z - l.z) >= EPS) return z < l.z;
return false;
}
bool operator == (const V3 &l) const {
return abs(x - l.x) < EPS && abs(y - l.y) < EPS && abs(z - l.z) < EPS;
}
};
struct Quad{
double a;
V3 v;
Quad(double a, V3 v) :a(a), v(v){}
Quad operator * (const double &c)const{
return Quad(a * c, v * c);
}
Quad operator~() const {
return Quad(-a, -v);
}
Quad operator-() const {
return Quad(a, -v) * (1 / (sq(a) + sq(v.x) + sq(v.y) + sq(v.z)));
}
Quad operator * (const Quad &l)const{
return Quad(a*l.a - v*l.v, l.v*a + v*l.a + (v^l.v));
}
V3 apply(V3 p){
return ((*this) * Quad(0, p) * -(*this)).v;
}
};
Quad set_rotate(V3 axis, double a){
return Quad(cos(a / 2), axis.norm() * sin(a / 2));
}
struct sphere{
V3 O;
double r;
};
int intersect(sphere A, V3 s, V3 d, double des[2]){
double c = (A.O - s).size2() - sq(A.r), b = d * (s - A.O), a = d.size2();
if (b*b - a*c < 0) return 0;
des[0] = (-b + sqrt(b*b - a*c)) / a;
des[1] = (-b - sqrt(b*b - a*c)) / a;
return 2;
}
// == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == // == //
#include<vector>
const int MX = 305;
circle D[MX];
vector<double> L[MX];
int main()
{
// freopen("input.txt", "r", stdin);
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++){
scanf("%lf%lf%lf", &D[i].O.first, &D[i].O.second, &D[i].r);
}
bool chk[MX] = {};
for (int i = 1; i <= N; i++){
for (int j = i+1; j <= N; j++){
if (D[i].O == D[j].O && D[i].r == D[j].r || D[j].r == 0) chk[j] = 1;
}
}
for (int i = 1; i <= N; i++){
for (int j = i + 1; j <= N; j++){
pdd A[2];
int top = intersect(D[i], D[j], A);
for (int k = 0; k < top; k++){
L[i].push_back(A[k].first);
L[j].push_back(A[k].second);
}
}
}
for (int i = 1; i <= N; i++){
for (double &c : L[i]) normalize(c);
sort(L[i].begin(), L[i].end());
if (L[i].size() == 0) L[i].push_back(0);
L[i].push_back(L[i][0] + PI * 2);
}
int ans = 0;
for (int i = 1; i <= N; i++){
int in = 1;
for (int j = 0; j + 1 < L[i].size(); j++){
if (L[i][j + 1] - L[i][j] < EPS) continue;
double u = (L[i][j] + L[i][j+1]) / 2;
pdd c = D[i].O + unit(u) * D[i].r;
int pos = 1;
for (int k = 1; k <= N; k++){
if (size2(D[k].O - c) < (D[k].r - EPS) * (D[k].r - EPS)) pos = 0;
}
if (pos) in = 0;
}
if(in) chk[i] = 1;
ans += chk[i];
}
printf("%d\n", ans);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |