Submission #1794722


Source Code Expand

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
//---------------------------------------------------------------------------------------------------
const double EPS = 1e-8, INF = 1e12, PI = 2 * acos(0.0);
typedef complex<double> P;
namespace std {
    bool operator < (const P& a, const P& b) { return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b); } 
    bool operator == (const P& a, const P& b) { return abs(real(a) - real(b)) < EPS && abs(imag(a) - imag(b)) < EPS; }
    P operator / (const P& a, const double& b) { return P(real(a) / b, imag(a) / b); }
    P operator * (const P& a, const double& b) { return P(real(a) * b, imag(a) * b); }
}
double cross(const P& a, const P& b) { return imag(conj(a)*b); }
double dot(const P& a, const P& b) { return real(conj(a)*b); }
struct L : public vector<P> { L() {} L(const P &a, const P &b) { push_back(a); push_back(b); } };
typedef vector<P> G;
struct C { P p; double r; C() {} C(const P &p, double r) : p(p), r(r) {} };
int ccw(P a, P b, P c) {
	b -= a; c -= a;
	if (cross(b, c) > 0)   return +1;       // counter clockwise
	if (cross(b, c) < 0)   return -1;       // clockwise
	if (dot(b, c) < 0)     return +2;       // c--a--b on line
	if (norm(b) < norm(c)) return -2;       // a--b--c on line
	return 0;
}
P rotate(P vec, double ang) {
    double x = real(vec), y = imag(vec);
    return P(x * cos(ang) - y * sin(ang), x * sin(ang) + y * cos(ang));
}
// 投影
P projection(const L &l, const P &p) {
    double t = dot(p - l[0], l[0] - l[1]) / norm(l[0] - l[1]);
    return l[0] + t*(l[0] - l[1]);
}

// 反射
P reflection(const L &l, const P &p) {
    return p + (projection(l, p) - p) * 2;
}

// 法線
P normal(const P& p)
{
    return P(-imag(p), real(p));
}
bool intersectLL(const L &l, const L &m) {
    return abs(cross(l[1] - l[0], m[1] - m[0])) > EPS || // non-parallel
        abs(cross(l[1] - l[0], m[0] - l[0])) < EPS;   // same line
}
bool intersectLS(const L &l, const L &s) {
    return cross(l[1] - l[0], s[0] - l[0])*       // s[0] is left of l
        cross(l[1] - l[0], s[1] - l[0]) < EPS; // s[1] is right of l
}
bool intersectLP(const L &l, const P &p) {
    return abs(cross(l[1] - p, l[0] - p)) < EPS;
}
bool intersectSS(const L &s, const L &t) {
    return ccw(s[0], s[1], t[0])*ccw(s[0], s[1], t[1]) <= 0 &&
        ccw(t[0], t[1], s[0])*ccw(t[0], t[1], s[1]) <= 0;
}
bool intersectSP(const L &s, const P &p) {
    return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) < EPS; // triangle inequality
}

P crosspoint(const L &l, const L &m) {
    double A = cross(l[1] - l[0], m[1] - m[0]);
    double B = cross(l[1] - l[0], l[1] - m[0]);
    if (abs(A) < EPS && abs(B) < EPS) return m[0]; // same line
    if (abs(A) < EPS) assert(false); // !!!PRECONDITION NOT SATISFIED!!!
    return m[0] + B / A * (m[1] - m[0]);
}
double distanceLP(const L &l, const P &p) {
    return abs(p - projection(l, p));
}
double distanceLL(const L &l, const L &m) {
    return intersectLL(l, m) ? 0 : distanceLP(l, m[0]);
}
double distanceLS(const L &l, const L &s) {
    if (intersectLS(l, s)) return 0;
    return min(distanceLP(l, s[0]), distanceLP(l, s[1]));
}
double distanceSP(const L &s, const P &p) {
    const P r = projection(s, p);
    if (intersectSP(s, r)) return abs(r - p);
    return min(abs(s[0] - p), abs(s[1] - p));
}
double distanceSS(const L &s, const L &t) {
    if (intersectSS(s, t)) return 0;
    return min(min(distanceSP(s, t[0]), distanceSP(s, t[1])),
        min(distanceSP(t, s[0]), distanceSP(t, s[1])));
}
/*---------------------------------------------------------------------------------------------------
            ∧_∧  
      ∧_∧  (´<_` )  Welcome to My Coding Space!
     ( ´_ゝ`) /  ⌒i     
    /   \     | |     
    /   / ̄ ̄ ̄ ̄/  |  
  __(__ニつ/     _/ .| .|____  
     \/____/ (u ⊃  
---------------------------------------------------------------------------------------------------*/



int N, R[20], SX[20], SY[20], TX[20], TY[20];
int dp[1 << 16];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> R[i] >> SX[i] >> SY[i] >> TX[i] >> TY[i];

    dp[0] = 1;
    rep(msk, 0, 1 << N) if (dp[msk]) rep(i, 0, N) if (!(msk & (1 << i))) {
        L l(P(SX[i], SY[i]), P(TX[i], TY[i]));
        vector<P> v; vector<int> r;
        rep(j, 0, N) if (i != j) {
            if (msk & (1 << j)) v.push_back(P(TX[j], TY[j])), r.push_back(R[j]);
            else v.push_back(P(SX[j], SY[j])), r.push_back(R[j]);
        }

        int ok = 1, n = v.size();
        rep(j, 0, n) {
            double d = distanceSP(l, v[j]);
            if (d < R[i] + r[j] - EPS) ok = 0;
        }
        if (ok) dp[msk + (1 << i)] = 1;
    }

    int ans = 0;
    rep(msk, 0, 1 << N) if (dp[msk]) {
        int c = 0;
        rep(i, 0, N) if (msk & (1 << i)) c++;
        ans = max(ans, c);
    }
    cout << ans << endl;
}

Submission Info

Submission Time
Task G - Coin Slider
User hamayanhamayan
Language C++14 (GCC 5.4.1)
Score 100
Code Size 5442 Byte
Status AC
Exec Time 684 ms
Memory 512 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 27
Set Name Test Cases
All 00_sample_00, 00_sample_01, 00_sample_02, 10_random_0, 10_random_1, 10_random_2, 10_random_3, 10_random_4, 10_random_5, 10_random_6, 10_random_7, 10_random_8, 10_random_9, 20_small_r_0, 20_small_r_1, 20_small_r_2, 20_small_r_3, 20_small_r_4, 20_small_r_5, 20_small_r_6, 20_small_r_7, 20_small_r_8, 20_small_r_9, 90_align_0, 91_star_0, 99_max_0, 99_max_1
Case Name Status Exec Time Memory
00_sample_00 AC 1 ms 256 KB
00_sample_01 AC 1 ms 256 KB
00_sample_02 AC 1 ms 256 KB
10_random_0 AC 2 ms 256 KB
10_random_1 AC 1 ms 256 KB
10_random_2 AC 1 ms 256 KB
10_random_3 AC 1 ms 256 KB
10_random_4 AC 1 ms 256 KB
10_random_5 AC 1 ms 256 KB
10_random_6 AC 1 ms 256 KB
10_random_7 AC 1 ms 256 KB
10_random_8 AC 1 ms 256 KB
10_random_9 AC 1 ms 256 KB
20_small_r_0 AC 1 ms 256 KB
20_small_r_1 AC 6 ms 256 KB
20_small_r_2 AC 1 ms 256 KB
20_small_r_3 AC 2 ms 256 KB
20_small_r_4 AC 2 ms 256 KB
20_small_r_5 AC 1 ms 256 KB
20_small_r_6 AC 2 ms 256 KB
20_small_r_7 AC 27 ms 256 KB
20_small_r_8 AC 2 ms 256 KB
20_small_r_9 AC 1 ms 256 KB
90_align_0 AC 2 ms 256 KB
91_star_0 AC 2 ms 256 KB
99_max_0 AC 676 ms 512 KB
99_max_1 AC 684 ms 512 KB