답안 #287434

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
287434 2020-08-31T17:01:07 Z ACmachine 원 고르기 (APIO18_circle_selection) C++17
87 / 100
3000 ms 82388 KB
#include <bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T, typename U> using ordered_map = tree<T, U, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef long double ld;
typedef double db;
typedef string str;

typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<str> vstr;

#define FOR(i,j,k,in) for(int i=(j); i < (k);i+=in)
#define FORD(i,j,k,in) for(int i=(j); i >=(k);i-=in)
#define REP(i,b) FOR(i,0,b,1)
#define REPD(i,b) FORD(i,b,0,1)
#define pb push_back 
#define mp make_pair
#define ff first
#define ss second
#define all(x) begin(x), end(x)
#define rsz resize 

const double EPS = 1e-9;
const int MOD = 1e9+7; // 998244353;
const ll INFF = 1e18;
const int INF = 1e9;
const ld PI = acos((ld)-1);
const vi dy = {1, 0, -1, 0, -1, 1, 1, -1};
const vi dx = {0, 1, 0, -1, -1, 1, -1, 1};

#ifdef DEBUG
#define DBG if(1)
#else
#define DBG if(0)
#endif

#define dbg(x) cout << "(" << #x << " : " << x << ")" << endl;
// ostreams
template <class T, class U>
ostream& operator<<(ostream& out, const pair<T, U> &par) {out << "[" << par.first << ";" << par.second << "]"; return out;}
template <class T>
ostream& operator<<(ostream& out, const set<T> &cont) { out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; }
template <class T, class U>
ostream& operator<<(ostream& out, const map<T, U> &cont) {out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; }
template<class T>
ostream& operator<<(ostream& out, const vector<T> &v){ out << "[";  REP(i, v.size()) out << v[i] << ", ";  out << "]"; return out;}
// istreams
template<class T>
istream& operator>>(istream& in, vector<T> &v){ for(auto &x : v) in >> x; return in; }
template<class T, class U>
istream& operator>>(istream& in, pair<T, U> &p){ in >> p.ff >> p.ss; return in; }
//searches
template<typename T, typename U>
T bsl(T lo, T hi, U f){ hi++; T mid; while(lo < hi){ mid = (lo + hi)/2; f(mid) ? hi = mid : lo = mid+1; } return lo; }
template<typename U>
double bsld(double lo, double hi, U f, double p = 1e-9){ int r = 3 + (int)log2((hi - lo)/p); double mid; while(r--){ mid = (lo + hi)/2; f(mid) ? hi = mid : lo = mid; } return (lo + hi)/2; }
template<typename T, typename U>
T bsh(T lo, T hi, U f){ lo--; T mid; while(lo < hi){ mid = (lo + hi + 1)/2; f(mid) ? lo = mid : hi = mid-1; } return lo; }
template<typename U>
double bshd(double lo, double hi, U f, double p = 1e-9){ int r = 3+(int)log2((hi - lo)/p); double mid; while(r--){ mid = (lo + hi)/2; f(mid) ? lo = mid : hi = mid; } return (lo + hi)/2; }
// some more utility functions
template<typename T>
pair<T, int> get_min(vector<T> &v){ typename vector<T> :: iterator it = min_element(v.begin(), v.end()); return mp(*it, it - v.begin());}
template<typename T>
pair<T, int> get_max(vector<T> &v){ typename vector<T> :: iterator it = max_element(v.begin(), v.end()); return mp(*it, it - v.begin());}        
template<typename T> bool ckmin(T& a, const T& b){return b < a ? a = b , true : false;}
template<typename T> bool ckmax(T& a, const T& b){return b > a ? a = b, true : false;}


struct circle{
    pii mid; 
    int r;
    int id;
    circle(pii _mid, int _r, int _id){
        mid = _mid; r = _r; id = _id;
    }
    bool intersect(circle &other){
        ll dist = (ll)(mid.ff - other.mid.ff)*(mid.ff - other.mid.ff) + (ll)(mid.ss - other.mid.ss)*(mid.ss - other.mid.ss);
        ll radsum = r + other.r;
        radsum *= radsum;
        return radsum >= dist;
    }
};

struct hash_pair{
    size_t operator()(const pair<int, int>& p) const
    {
        auto hsh1 = hash<int>{}(p.ff);
        auto hsh2 = hash<int>{}(p.ss);
        return hsh1 ^ hsh2;
    }
};
bool operator<(const circle &lhs, const circle &rhs){
    if(lhs.r == rhs.r) return lhs.id < rhs.id;
    return lhs.r > rhs.r; 
}
struct AcAutomaton{
    int n; 
    vi out;
    vector<circle> circles;
    map<pii, set<int>> grid;
    vector<bool> removed;
	void read_in(){
		cin >> n;
        out.rsz(n, -1);
        removed.rsz(n, false);
        REP(i, n){
            pii mid; int r; cin >> mid >> r;
            circles.pb(circle(mid, r, i));
        }
	}
    void rescale(int square_size){
        grid.clear();
        REP(i, n){
            if(!removed[i]){
                circle c = circles[i];
                pii newmid = mp(c.mid.ff / square_size, c.mid.ss / square_size);
                grid[newmid].insert(i);
            }
        }
    }
	void solve(){
		set<circle> pq;
        REP(i, circles.size()) pq.insert(circles[i]);
        int square_size = pq.begin()->r;
        rescale(square_size);
        vector<circle> circles_sorted = circles;
        sort(all(circles_sorted));
        for(circle c : circles_sorted){
            if(removed[c.id]) continue;
            if(c.r <= square_size / 2){
                square_size = c.r;
                rescale(square_size);
            }
            pii newmid = mp(c.mid.ff / square_size, c.mid.ss / square_size);
            vi toerase;
            FOR(i, newmid.ff - 2, newmid.ff + 3, 1){
                FOR(j, newmid.ss - 2, newmid.ss + 3, 1){
                    if(grid.find(mp(i, j)) == grid.end()) continue;
                    toerase.clear();
                    for(int c2id : grid[mp(i, j)]){
                        circle c2 = circles[c2id];
                        if(c.intersect(c2)){
                            out[c2.id] = c.id;
                            removed[c2.id] = true;
                            toerase.pb(c2.id); 
                        }
                    }
                    for(auto x : toerase) grid[mp(i, j)].erase(x);
                }
            }
        }
        /* while(!pq.empty()){ */
        /*     circle c = *pq.begin(); */
        /*     if(c.r <= square_size/2) { */
        /*         square_size = c.r; */
        /*         rescale(square_size); */
        /*     } */
        /*     pii newmid = mp(c.mid.ff / square_size, c.mid.ss / square_size); */
        /*     FOR(i, newmid.ff - 2, newmid.ff + 3, 1){ */
        /*         FOR(j, newmid.ss - 2, newmid.ss + 3, 1){ */
        /*             if(grid.find(mp(i, j)) == grid.end()) continue; */
        /*             for(int c2id : grid[mp(i, j)]){ */
        /*                 if(removed[c2id]) continue; */
        /*                 circle c2 = circles[c2id]; */
        /*                 if(c.intersect(c2)){ */
        /*                     out[c2.id] = c.id; */
        /*                     removed[c2.id] = true; */
        /*                     pq.erase(c2); */
        /*                 } */
        /*             } */
        /*         } */
        /*     } */
        /* } */
        REP(i, n) cout << out[i]+1 << (i == n - 1 ? "\n" : " ");
	}
};
    
int main(){
 	ios_base::sync_with_stdio(false);
 	cin.tie(NULL); cout.tie(NULL);
	int tcase = 1;
	while(tcase--){
		AcAutomaton solver;
		solver.read_in();
		solver.solve();
	}
    return 0;
}

Compilation message

circle_selection.cpp: In member function 'void AcAutomaton::solve()':
circle_selection.cpp:26:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circle>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 | #define FOR(i,j,k,in) for(int i=(j); i < (k);i+=in)
      |                                        ^
circle_selection.cpp:28:18: note: in expansion of macro 'FOR'
   28 | #define REP(i,b) FOR(i,0,b,1)
      |                  ^~~
circle_selection.cpp:138:9: note: in expansion of macro 'REP'
  138 |         REP(i, circles.size()) pq.insert(circles[i]);
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 1 ms 512 KB Output is correct
17 Correct 2 ms 512 KB Output is correct
18 Correct 1 ms 488 KB Output is correct
19 Correct 7 ms 1152 KB Output is correct
20 Correct 5 ms 1152 KB Output is correct
21 Correct 6 ms 1152 KB Output is correct
22 Correct 20 ms 1536 KB Output is correct
23 Correct 19 ms 1536 KB Output is correct
24 Correct 17 ms 1536 KB Output is correct
25 Correct 17 ms 1592 KB Output is correct
26 Correct 19 ms 1536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 520 ms 49240 KB Output is correct
2 Correct 536 ms 46932 KB Output is correct
3 Correct 513 ms 45556 KB Output is correct
4 Correct 499 ms 49380 KB Output is correct
5 Correct 642 ms 46400 KB Output is correct
6 Correct 1166 ms 59628 KB Output is correct
7 Correct 731 ms 47452 KB Output is correct
8 Correct 770 ms 49880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 737 ms 24812 KB Output is correct
3 Correct 2728 ms 73976 KB Output is correct
4 Correct 2758 ms 74068 KB Output is correct
5 Correct 2535 ms 67568 KB Output is correct
6 Correct 963 ms 34776 KB Output is correct
7 Correct 404 ms 18680 KB Output is correct
8 Correct 45 ms 4204 KB Output is correct
9 Correct 2959 ms 73408 KB Output is correct
10 Correct 2292 ms 75632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1991 ms 74068 KB Output is correct
2 Correct 1459 ms 73992 KB Output is correct
3 Correct 810 ms 53588 KB Output is correct
4 Correct 1586 ms 73984 KB Output is correct
5 Correct 1539 ms 73984 KB Output is correct
6 Correct 609 ms 46760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 1 ms 512 KB Output is correct
17 Correct 2 ms 512 KB Output is correct
18 Correct 1 ms 488 KB Output is correct
19 Correct 7 ms 1152 KB Output is correct
20 Correct 5 ms 1152 KB Output is correct
21 Correct 6 ms 1152 KB Output is correct
22 Correct 20 ms 1536 KB Output is correct
23 Correct 19 ms 1536 KB Output is correct
24 Correct 17 ms 1536 KB Output is correct
25 Correct 17 ms 1592 KB Output is correct
26 Correct 19 ms 1536 KB Output is correct
27 Correct 11 ms 1916 KB Output is correct
28 Correct 11 ms 1916 KB Output is correct
29 Correct 11 ms 1788 KB Output is correct
30 Correct 39 ms 2804 KB Output is correct
31 Correct 36 ms 2804 KB Output is correct
32 Correct 45 ms 2804 KB Output is correct
33 Correct 132 ms 15340 KB Output is correct
34 Correct 132 ms 15596 KB Output is correct
35 Correct 164 ms 15848 KB Output is correct
36 Correct 642 ms 24812 KB Output is correct
37 Correct 654 ms 24828 KB Output is correct
38 Correct 655 ms 24808 KB Output is correct
39 Correct 799 ms 23436 KB Output is correct
40 Correct 813 ms 23476 KB Output is correct
41 Correct 758 ms 23476 KB Output is correct
42 Correct 395 ms 24812 KB Output is correct
43 Correct 416 ms 24684 KB Output is correct
44 Correct 409 ms 24600 KB Output is correct
45 Correct 424 ms 24576 KB Output is correct
46 Correct 410 ms 24628 KB Output is correct
47 Correct 424 ms 24592 KB Output is correct
48 Correct 412 ms 24556 KB Output is correct
49 Correct 420 ms 24588 KB Output is correct
50 Correct 411 ms 24668 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 1 ms 512 KB Output is correct
17 Correct 2 ms 512 KB Output is correct
18 Correct 1 ms 488 KB Output is correct
19 Correct 7 ms 1152 KB Output is correct
20 Correct 5 ms 1152 KB Output is correct
21 Correct 6 ms 1152 KB Output is correct
22 Correct 20 ms 1536 KB Output is correct
23 Correct 19 ms 1536 KB Output is correct
24 Correct 17 ms 1536 KB Output is correct
25 Correct 17 ms 1592 KB Output is correct
26 Correct 19 ms 1536 KB Output is correct
27 Correct 520 ms 49240 KB Output is correct
28 Correct 536 ms 46932 KB Output is correct
29 Correct 513 ms 45556 KB Output is correct
30 Correct 499 ms 49380 KB Output is correct
31 Correct 642 ms 46400 KB Output is correct
32 Correct 1166 ms 59628 KB Output is correct
33 Correct 731 ms 47452 KB Output is correct
34 Correct 770 ms 49880 KB Output is correct
35 Correct 1 ms 384 KB Output is correct
36 Correct 737 ms 24812 KB Output is correct
37 Correct 2728 ms 73976 KB Output is correct
38 Correct 2758 ms 74068 KB Output is correct
39 Correct 2535 ms 67568 KB Output is correct
40 Correct 963 ms 34776 KB Output is correct
41 Correct 404 ms 18680 KB Output is correct
42 Correct 45 ms 4204 KB Output is correct
43 Correct 2959 ms 73408 KB Output is correct
44 Correct 2292 ms 75632 KB Output is correct
45 Correct 1991 ms 74068 KB Output is correct
46 Correct 1459 ms 73992 KB Output is correct
47 Correct 810 ms 53588 KB Output is correct
48 Correct 1586 ms 73984 KB Output is correct
49 Correct 1539 ms 73984 KB Output is correct
50 Correct 609 ms 46760 KB Output is correct
51 Correct 11 ms 1916 KB Output is correct
52 Correct 11 ms 1916 KB Output is correct
53 Correct 11 ms 1788 KB Output is correct
54 Correct 39 ms 2804 KB Output is correct
55 Correct 36 ms 2804 KB Output is correct
56 Correct 45 ms 2804 KB Output is correct
57 Correct 132 ms 15340 KB Output is correct
58 Correct 132 ms 15596 KB Output is correct
59 Correct 164 ms 15848 KB Output is correct
60 Correct 642 ms 24812 KB Output is correct
61 Correct 654 ms 24828 KB Output is correct
62 Correct 655 ms 24808 KB Output is correct
63 Correct 799 ms 23436 KB Output is correct
64 Correct 813 ms 23476 KB Output is correct
65 Correct 758 ms 23476 KB Output is correct
66 Correct 395 ms 24812 KB Output is correct
67 Correct 416 ms 24684 KB Output is correct
68 Correct 409 ms 24600 KB Output is correct
69 Correct 424 ms 24576 KB Output is correct
70 Correct 410 ms 24628 KB Output is correct
71 Correct 424 ms 24592 KB Output is correct
72 Correct 412 ms 24556 KB Output is correct
73 Correct 420 ms 24588 KB Output is correct
74 Correct 411 ms 24668 KB Output is correct
75 Correct 556 ms 56092 KB Output is correct
76 Correct 595 ms 55628 KB Output is correct
77 Correct 505 ms 54564 KB Output is correct
78 Correct 481 ms 54868 KB Output is correct
79 Correct 709 ms 54596 KB Output is correct
80 Correct 500 ms 56148 KB Output is correct
81 Correct 2652 ms 82132 KB Output is correct
82 Correct 2558 ms 81936 KB Output is correct
83 Correct 2510 ms 81836 KB Output is correct
84 Correct 2734 ms 82388 KB Output is correct
85 Correct 2579 ms 82004 KB Output is correct
86 Correct 2469 ms 82004 KB Output is correct
87 Execution timed out 3010 ms 82004 KB Time limit exceeded
88 Halted 0 ms 0 KB -