There are many 2D rectangles in 2D space. Given a point, suppose this point did not hit (inside of) any rectangle, find the one rectangle it is closest to. Assume the rectangles are not rotated. Can it be faster than O(n)?

# | User | Rating |
---|---|---|

1 | tourist | 3509 |

2 | OO0OOO00O0OOO0O0…O | 3327 |

3 | Um_nik | 3297 |

4 | Syloviaely | 3274 |

5 | LHiC | 3216 |

6 | Petr | 3161 |

7 | Benq | 3130 |

8 | ko_osaga | 3124 |

9 | Swistakk | 3089 |

10 | dotorya | 3060 |

# | User | Contrib. |
---|---|---|

1 | Radewoosh | 185 |

2 | rng_58 | 161 |

3 | tourist | 158 |

4 | Petr | 152 |

5 | Swistakk | 150 |

5 | Vovuh | 150 |

7 | csacademy | 146 |

7 | PikMike | 146 |

9 | Errichto | 145 |

9 | Um_nik | 145 |

There are many 2D rectangles in 2D space. Given a point, suppose this point did not hit (inside of) any rectangle, find the one rectangle it is closest to. Assume the rectangles are not rotated. Can it be faster than O(n)?

↑

↓

Codeforces (c) Copyright 2010-2018 Mike Mirzayanov

The only programming contests Web 2.0 platform

Server time: Sep/21/2018 04:17:17 (d2).

Desktop version, switch to mobile version.

User lists

Name |
---|

I will kinda gloss over technical details for now, feel free to ask for clarifications.

I suppose that you want to answer queries of type "What is the closest rectangle to this point?" in less than

O(n) time. Now shortest distance from the pointPto the rectangle is the shortest distance from thePto one of its sides. The shortest distance fromPto the segmentABis eithermin(|PA|, |PB|) or length of perpendicular fromPtowardsAB, if it lands on the segmentABof course.Now, let's see which case actually happens for rectangle, which is the closest to the point

P. Dealing with second case is simple: we just need to cast 4 rays in all coordinate directions from the pointP, for each ray find the first rectangle they intersect and remin answer with this rectangles (note that because all rectangles are axis-parrallel, all perpendiculars to the sides are axis-parallel too). To deal with the first case, you need to find the closest point toPamong the corners of rectangles: in general, such a problem can be solved with Voronoi diagram (and I am pretty sure that there is not anything significantly simplier in general case), in your case there may be some simpler solution, but I can't see it for now.Total time: precalculation (for Voronoi diagram), per query. It seems that you need something like a persistent treap to answer queries online, but offline you can do a scanline with set to handle both described cases (after you built the Voronoi diagram, of course)).