classSolution { public: Solution(vector<int>& w) { n = w.size(); v.resize(n * 2); copy(begin(w), end(w), begin(v) + n); for (int i = n - 1; i > 0; --i) { v[i] = v[i * 2] + v[i * 2 + 1]; } srand(time(NULL)); }
voidupdate(int i, int val){ i += n; for (int d = val - v[i]; i > 0; i >>= 1) { v[i] += d; } }
intquery(int i){ int res = 0; for (int l = n, r = i + n; l <= r; l >>= 1, r >>= 1) { if (l & 1) { res += v[l++]; } if ((r & 1) == 0) { res += v[r--]; } } return res; }
intpickIndex(){ int x = rand() % v[1], l = 0, r = n - 1; while (l < r) { int m = l + (r - l) / 2; if (query(m) <= x) { // <是找下界<=是找上界c l = m + 1; } else { r = m; } } return l; }
vector<int> v; int n; };
/** * Your Solution object will be instantiated and called as such: * Solution* obj = new Solution(w); * int param_1 = obj->pickIndex(); */