Submission #2740398


Source Code Expand

Copy
#include <bits/stdc++.h>
using namespace std;

#define NDEBUG
#ifdef DEBUG
#include "../cout11.h"
#undef NDEBUG
#endif
#include <cassert>

typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int,int> ii;
typedef pair<ll,ll> llll;
typedef pair<double,double> dd;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;

#define sz(a)  int((a).size())
#define pb  push_back
#define FOR(var,from,to) for(int var=(from);var<=(to);++var)
#define rep(var,n)  for(int var=0;var<(n);++var)
#define rep1(var,n)  for(int var=1;var<=(n);++var)
#define repC2(vari,varj,n)  for(int vari=0;vari<(n)-1;++vari)for(int varj=vari+1;varj<(n);++varj)
#define ALL(c)  (c).begin(),(c).end()
#define RALL(c)  (c).rbegin(),(c).rend()
#define tr(i,c)  for(auto i=(c).begin(); i!=(c).end(); ++i)
#define found(s,e)  ((s).find(e)!=(s).end())
#define mset(arr,val)  memset(arr,val,sizeof(arr))
#define mid(x,y) ((x)+((y)-(x))/2)
#define IN(x,a,b) ((a)<=(x)&&(x)<=(b))
#define cons make_pair


typedef complex<double> Point;

namespace std {
    bool operator<(const Point& a, const Point& b) {
        return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
    }
}
double cross(const Point& a, const Point& b) {
    return imag(conj(a) * b);
}
double dot(const Point& a, const Point& b) {
    return real(conj(a) * b);
}
// norm

int ccw(Point a, Point b, Point c) {
    // 与えられた三点 a, b, c を a → b → c と進むとき,
    // a → b で時計方向に折れて b → c
    // a → b で半時計方向に折れて b → c
    // a → b で逆を向いて a を通り越して b → c
    // a → b でそのまま b → c
    // a → b で逆を向いて b → c ( または b == 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;
}

vector<int> convex_hull(int n, vi& x, vi& y) {
    vector<pair<Point,int>> work(n);
    rep(i, n){
        work[i] = make_pair(Point(x[i],y[i]), i);
    }
    sort(ALL(work));

    vector<int> ch(n*2);
    int k = 0;
    // rep(i,n) {
    // for (int i=0; i<n; ++i) { // lower-hull
    for (int i=0; i<n; ++i) { // lower-hull
        while (k >= 2 && ccw(work[ch[k-2]].first, work[ch[k-1]].first, work[i].first) <= 0) --k;
        // ch[k++]=points[i++]
        ch[k++] = i;
    }
    for (int i=n-2, t=k+1; i>=0; --i) { // upper-hull
        while (k >= t && ccw(work[ch[k-2]].first, work[ch[k-1]].first, work[i].first) <= 0) --k;
        ch[k++] = i;
    }
    ch.resize(k-1);

    vector<int> res(k-1);
    rep(i, k-1) {
        res[i] = work[ch[i]].second;
    }
    return res;
}

// vector<int> convex_hull(int N, vi& x, vi& y) {
//     vector<int> indices;
//     return indices;
// }

void solve(int N, vi& x, vi& y) {
    vi ix = convex_hull(N, x, y);
    int L = ix.size();
    vector<double> th;
    rep(i, L) {
        int i0 = ix[i], i1 = ix[(i+1)%L];
        int dx = x[i1] - x[i0], dy = y[i1] - y[i0];
        // それを90度右へ
        int rx = dy, ry = -dx;
        double th0 = atan2(ry, rx);
        th.pb(th0);
        // これより右はi0, 左はi1
    }
    vector<double> ratio(N, 0.0);
    rep(i, L) {
        double thM = th[(i-1+L)%L], th0 = th[i%L];
        double dth = th0 - thM;
        double r = dth / (M_PI * 2);
        if (r < 0) r += 1.0;
        ratio[ ix[i] ] = r;
    }
    rep(i,N) {
        printf("%.20f\n", ratio[i]);
    }
}

int main() {
    int N; cin >> N;
    vi x(N), y(N);
    rep(i,N) cin >> x[i] >> y[i];
    solve(N,x,y);
    return 0;
}

Submission Info

Submission Time
Task B - Holes
User naoya_t
Language C++14 (GCC 5.4.1)
Score 600
Code Size 4035 Byte
Status
Exec Time 5 ms
Memory 512 KB

Test Cases

Set Name Score / Max Score Test Cases
Sample 0 / 0 s1.txt, s2.txt
All 600 / 600 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, s1.txt, s2.txt
Case Name Status Exec Time Memory
01.txt 5 ms 384 KB
02.txt 1 ms 256 KB
03.txt 1 ms 256 KB
04.txt 1 ms 256 KB
05.txt 1 ms 256 KB
06.txt 1 ms 256 KB
07.txt 1 ms 256 KB
08.txt 3 ms 512 KB
09.txt 1 ms 256 KB
10.txt 1 ms 256 KB
11.txt 1 ms 256 KB
12.txt 1 ms 256 KB
13.txt 1 ms 256 KB
14.txt 1 ms 256 KB
15.txt 1 ms 256 KB
16.txt 1 ms 256 KB
17.txt 1 ms 256 KB
18.txt 1 ms 256 KB
19.txt 1 ms 256 KB
20.txt 1 ms 256 KB
21.txt 1 ms 256 KB
22.txt 1 ms 256 KB
23.txt 1 ms 256 KB
24.txt 1 ms 256 KB
s1.txt 1 ms 256 KB
s2.txt 1 ms 256 KB