4
Tag: Segment Tree, Greedy (put the possible feasible smallest index in place5
of cur index), Queue Difficulty: H (Both Logic and Implementation)12
SegmentTree(int size) {13
tree.resize(4 * size + 1, 0);17
for (int num : tree) cout << num << "";21
void updateTree(int lo, int hi, int index, int upd) {22
if (upd < lo || upd > hi) return;27
int mid = lo + (hi - lo) / 2;28
updateTree(lo, mid, 2 * index, upd);29
updateTree(mid + 1, hi, 2 * index + 1, upd);30
tree[index] = tree[2 * index] + tree[2 * index + 1];33
int queryTree(int lo, int hi, int index, int qs, int qe) {34
if (qe < lo || qs > hi) return 0;35
if (qe >= hi && qs <= lo) return tree[index];37
int mid = lo + (hi - lo) / 2;39
int left = queryTree(lo, mid, 2 * index, qs, qe);40
int right = queryTree(mid + 1, hi, 2 * index + 1, qs, qe);47
string minInteger(string num, int k) {49
for (int i = 0; i < num.length(); i++) {50
pos[num[i] - '0'].push(i);53
SegmentTree *seg = new SegmentTree((int)num.length());54
for (int i = 0; i < num.length(); i++) {55
if (num[i] == '-') continue;56
int digit = num[i] - '0';59
for (int j = 0; j < digit; j++) {60
if (pos[j].size() > 0) {61
int curNumIndex = pos[j].front();62
int shifts = seg->queryTree(0, num.length() - 1, 1, i, pos[j].front());64
if (curNumIndex - i - shifts <= k) {65
seg->updateTree(0, num.length() - 1, 1, curNumIndex);66
k -= curNumIndex - i - shifts;68
res += num[curNumIndex];69
num[curNumIndex] = '-';