|
@@ -0,0 +1,44 @@
|
|
|
|
|
+type Solution struct {
|
|
|
|
|
+ size int
|
|
|
|
|
+ rects [][]int
|
|
|
|
|
+ areas []int
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func Constructor(rects [][]int) (sol Solution) {
|
|
|
|
|
+ sol.size = len(rects)
|
|
|
|
|
+ sol.areas = make([]int, sol.size+1)
|
|
|
|
|
+ sol.rects = rects
|
|
|
|
|
+ for i := 0; i < sol.size; i++ {
|
|
|
|
|
+ r := rects[i]
|
|
|
|
|
+ w, h := r[2]-r[0]+1, r[3]-r[1]+1
|
|
|
|
|
+ sol.areas[i+1] = sol.areas[i] + w*h
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (this *Solution) Pick() []int {
|
|
|
|
|
+ idx := rand.Intn(this.areas[this.size])
|
|
|
|
|
+ beg, end := 1, this.size
|
|
|
|
|
+ for beg <= end {
|
|
|
|
|
+ mid := beg + (end-beg)/2
|
|
|
|
|
+ if this.areas[mid] < idx {
|
|
|
|
|
+ beg = mid + 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ end = mid - 1
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if this.areas[beg] != idx {
|
|
|
|
|
+ beg--
|
|
|
|
|
+ }
|
|
|
|
|
+ pos := idx - this.areas[beg]
|
|
|
|
|
+ r := this.rects[beg]
|
|
|
|
|
+ w := r[2] - r[0] + 1
|
|
|
|
|
+ dx, dy := pos%w, pos/w
|
|
|
|
|
+ return []int{r[0] + dx, r[1] + dy}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Your Solution object will be instantiated and called as such:
|
|
|
|
|
+ * obj := Constructor(rects);
|
|
|
|
|
+ * param_1 := obj.Pick();
|
|
|
|
|
+ */
|