답안 #50133

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
50133 2018-06-07T17:11:05 Z mirbek01 원 고르기 (APIO18_circle_selection) C++17
0 / 100
1517 ms 133216 KB
# include <bits/stdc++.h>

# define f first
# define s second

using namespace std;

const int N = 3e5 + 2;

struct st{
      int x, y, r, id;
} a[N];
struct node{
      int l, r;
      pair <int, int> x;
      node(){
            l = r = 0;
            x = {1e9, 1e9};
      }
}t[N * 4];

int n, fl = 1, ans[N], sz = 1;

bool cmp(st a, st b){
      if(a.r == b.r)
            return a.id < b.id;
      return a.r > b.r;
}

void update(int pos, pair <int, int> val, int v = 1, int tl = -1e9, int tr = 1e9){
      if(tl == tr){
            t[v].x = val;
      } else {
            int tm = (tl + tr) >> 1;
            if(pos <= tm){
                  if(!t[v].l) t[v].l = ++ sz;
                  update(pos, val, t[v].l, tl, tm);
            } else {
                  if(!t[v].r) t[v].r = ++ sz;
                  update(pos, val, t[v].r, tm + 1, tr);
            }
            t[v].x = min(t[ t[v].l ].x, t[ t[v].r ].x);
      }
}

pair <int, int> get(int l, int r, int v = 1, int tl = -1e9, int tr = 1e9){
      if(l > tr || tl > r || t[v].x.f == 1e9) return {1e9, 1e9};
      if(l <= tl && tr <= r) return t[v].x;
      int tm = (tl + tr) >> 1;
      return min(get(l, r, t[v].l, tl, tm),
                        get(l, r, t[v].r, tm + 1, tr));
}

int main(){
      cin >> n;

      for(int i = 1; i <= n; i ++){
            cin >> a[i].x >> a[i].y >> a[i].r;
            a[i].id = i;
            if(a[i].y) fl = 0;
      }

      if(fl){
            sort(a + 1, a + n + 1, cmp);

            set <int> st;

            for(int i = 1; i <= n; i ++){
                  st.insert(a[i].x);
                  st.insert(a[i].x - a[i].r);
                  st.insert(a[i].x + a[i].r);
            }

            for(int i = 1; i <= n; i ++){
                  vector <int> v;
                  for(auto j = st.lower_bound(a[i].x - a[i].r); j != st.end() && *j <= a[i].x + a[i].r; j ++){
                        update(*j, {-a[i].r, a[i].id});
                        v.push_back(*j);
                  }
                  while(!v.empty()){
                        st.erase(v.back());
                        v.pop_back();
                  }
                  ans[a[i].id] = get(a[i].x - a[i].r, a[i].x + a[i].r).s;
            }

            for(int i = 1; i <= n; i ++){
                  cout << ans[i] << " ";
            }
      }
}
/**
3
1 0 5
9 0 4
3 0 3

11
9 9 2
13 2 1
11 8 2
3 3 2
3 12 1
12 14 1
9 8 5
2 8 2
5 2 1
14 4 2
14 14 1
**/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 19064 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1517 ms 133216 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 133216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 443 ms 133216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 19064 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 19064 KB Output isn't correct
2 Halted 0 ms 0 KB -