/*
QUESTION 1: Ordered Marble Grouping
Problem Statement:
You are given marbles numbered from 1 to n. Each marble is currently placed
in one of three boxes: A, B, or C.
In one operation, you may move any marble from its current box to another box.
After all operations:
- Sort each box individually.
- Join the boxes in this order: A, then B, then C.
- The final joined sequence must be strictly increasing.
Return the minimum number of marbles that must be moved.
Hard Constraints:
1 <= n <= 100000
Every value from 1 to n appears exactly once.
Any box may become empty.
Example:
A = [1, 5]
B = [2, 3]
C = [4, 6]
Expected Output:
2
Explanation:
Move 5 from A to C.
Move 4 from C to B.
Final:
A = [1]
B = [2, 3, 4]
C = [5, 6]
Joined sequence:
[1, 2, 3, 4, 5, 6]
Brute Force:
Try every possible split of values.
A gets the smallest segment, B gets the middle segment, and C gets the largest segment.
For every split, count how many marbles are already in the correct final group.
Time Complexity:
O(n^2)
Optimized Approach:
While scanning values from 1 to n, final group labels must be non-decreasing:
A...A B...B C...C
Use DP:
dpA = maximum kept marbles if current value is assigned to A
dpB = maximum kept marbles if current value is assigned to B
dpC = maximum kept marbles if current value is assigned to C
Answer = n - max(dpA, dpB, dpC)
Time Complexity:
O(n)
Space Complexity:
O(n)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int getMinMoves(vector<int>& groupA,
vector<int>& groupB,
vector<int>& groupC) {
int n = groupA.size() + groupB.size() + groupC.size();
vector<int> belongs(n + 1);
for (int x : groupA) belongs[x] = 0;
for (int x : groupB) belongs[x] = 1;
for (int x : groupC) belongs[x] = 2;
int dpA = 0;
int dpB = 0;
int dpC = 0;
for (int x = 1; x <= n; x++) {
int keepA = (belongs[x] == 0);
int keepB = (belongs[x] == 1);
int keepC = (belongs[x] == 2);
int newA = dpA + keepA;
int newB = max(dpA, dpB) + keepB;
int newC = max({dpA, dpB, dpC}) + keepC;
dpA = newA;
dpB = newB;
dpC = newC;
}
return n - max({dpA, dpB, dpC});
}
};
int main() {
Solution sol;
vector<int> A = {1, 5};
vector<int> B = {2, 3};
vector<int> C = {4, 6};
cout << sol.getMinMoves(A, B, C) << endl;
return 0;
}
LyoKUVVFU1RJT04gMTogT3JkZXJlZCBNYXJibGUgR3JvdXBpbmcKClByb2JsZW0gU3RhdGVtZW50OgpZb3UgYXJlIGdpdmVuIG1hcmJsZXMgbnVtYmVyZWQgZnJvbSAxIHRvIG4uIEVhY2ggbWFyYmxlIGlzIGN1cnJlbnRseSBwbGFjZWQKaW4gb25lIG9mIHRocmVlIGJveGVzOiBBLCBCLCBvciBDLgoKSW4gb25lIG9wZXJhdGlvbiwgeW91IG1heSBtb3ZlIGFueSBtYXJibGUgZnJvbSBpdHMgY3VycmVudCBib3ggdG8gYW5vdGhlciBib3guCgpBZnRlciBhbGwgb3BlcmF0aW9uczoKLSBTb3J0IGVhY2ggYm94IGluZGl2aWR1YWxseS4KLSBKb2luIHRoZSBib3hlcyBpbiB0aGlzIG9yZGVyOiBBLCB0aGVuIEIsIHRoZW4gQy4KLSBUaGUgZmluYWwgam9pbmVkIHNlcXVlbmNlIG11c3QgYmUgc3RyaWN0bHkgaW5jcmVhc2luZy4KClJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgbWFyYmxlcyB0aGF0IG11c3QgYmUgbW92ZWQuCgpIYXJkIENvbnN0cmFpbnRzOgoxIDw9IG4gPD0gMTAwMDAwCkV2ZXJ5IHZhbHVlIGZyb20gMSB0byBuIGFwcGVhcnMgZXhhY3RseSBvbmNlLgpBbnkgYm94IG1heSBiZWNvbWUgZW1wdHkuCgpFeGFtcGxlOgpBID0gWzEsIDVdCkIgPSBbMiwgM10KQyA9IFs0LCA2XQoKRXhwZWN0ZWQgT3V0cHV0OgoyCgpFeHBsYW5hdGlvbjoKTW92ZSA1IGZyb20gQSB0byBDLgpNb3ZlIDQgZnJvbSBDIHRvIEIuCgpGaW5hbDoKQSA9IFsxXQpCID0gWzIsIDMsIDRdCkMgPSBbNSwgNl0KCkpvaW5lZCBzZXF1ZW5jZToKWzEsIDIsIDMsIDQsIDUsIDZdCgpCcnV0ZSBGb3JjZToKVHJ5IGV2ZXJ5IHBvc3NpYmxlIHNwbGl0IG9mIHZhbHVlcy4KQSBnZXRzIHRoZSBzbWFsbGVzdCBzZWdtZW50LCBCIGdldHMgdGhlIG1pZGRsZSBzZWdtZW50LCBhbmQgQyBnZXRzIHRoZSBsYXJnZXN0IHNlZ21lbnQuCkZvciBldmVyeSBzcGxpdCwgY291bnQgaG93IG1hbnkgbWFyYmxlcyBhcmUgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmaW5hbCBncm91cC4KClRpbWUgQ29tcGxleGl0eToKTyhuXjIpCgpPcHRpbWl6ZWQgQXBwcm9hY2g6CldoaWxlIHNjYW5uaW5nIHZhbHVlcyBmcm9tIDEgdG8gbiwgZmluYWwgZ3JvdXAgbGFiZWxzIG11c3QgYmUgbm9uLWRlY3JlYXNpbmc6CkEuLi5BIEIuLi5CIEMuLi5DCgpVc2UgRFA6CmRwQSA9IG1heGltdW0ga2VwdCBtYXJibGVzIGlmIGN1cnJlbnQgdmFsdWUgaXMgYXNzaWduZWQgdG8gQQpkcEIgPSBtYXhpbXVtIGtlcHQgbWFyYmxlcyBpZiBjdXJyZW50IHZhbHVlIGlzIGFzc2lnbmVkIHRvIEIKZHBDID0gbWF4aW11bSBrZXB0IG1hcmJsZXMgaWYgY3VycmVudCB2YWx1ZSBpcyBhc3NpZ25lZCB0byBDCgpBbnN3ZXIgPSBuIC0gbWF4KGRwQSwgZHBCLCBkcEMpCgpUaW1lIENvbXBsZXhpdHk6Ck8obikKClNwYWNlIENvbXBsZXhpdHk6Ck8obikKKi8KCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU29sdXRpb24gewpwdWJsaWM6CiAgICBpbnQgZ2V0TWluTW92ZXModmVjdG9yPGludD4mIGdyb3VwQSwKICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiYgZ3JvdXBCLAogICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+JiBncm91cEMpIHsKICAgICAgICAKICAgICAgICBpbnQgbiA9IGdyb3VwQS5zaXplKCkgKyBncm91cEIuc2l6ZSgpICsgZ3JvdXBDLnNpemUoKTsKCiAgICAgICAgdmVjdG9yPGludD4gYmVsb25ncyhuICsgMSk7CgogICAgICAgIGZvciAoaW50IHggOiBncm91cEEpIGJlbG9uZ3NbeF0gPSAwOwogICAgICAgIGZvciAoaW50IHggOiBncm91cEIpIGJlbG9uZ3NbeF0gPSAxOwogICAgICAgIGZvciAoaW50IHggOiBncm91cEMpIGJlbG9uZ3NbeF0gPSAyOwoKICAgICAgICBpbnQgZHBBID0gMDsKICAgICAgICBpbnQgZHBCID0gMDsKICAgICAgICBpbnQgZHBDID0gMDsKCiAgICAgICAgZm9yIChpbnQgeCA9IDE7IHggPD0gbjsgeCsrKSB7CiAgICAgICAgICAgIGludCBrZWVwQSA9IChiZWxvbmdzW3hdID09IDApOwogICAgICAgICAgICBpbnQga2VlcEIgPSAoYmVsb25nc1t4XSA9PSAxKTsKICAgICAgICAgICAgaW50IGtlZXBDID0gKGJlbG9uZ3NbeF0gPT0gMik7CgogICAgICAgICAgICBpbnQgbmV3QSA9IGRwQSArIGtlZXBBOwogICAgICAgICAgICBpbnQgbmV3QiA9IG1heChkcEEsIGRwQikgKyBrZWVwQjsKICAgICAgICAgICAgaW50IG5ld0MgPSBtYXgoe2RwQSwgZHBCLCBkcEN9KSArIGtlZXBDOwoKICAgICAgICAgICAgZHBBID0gbmV3QTsKICAgICAgICAgICAgZHBCID0gbmV3QjsKICAgICAgICAgICAgZHBDID0gbmV3QzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuIC0gbWF4KHtkcEEsIGRwQiwgZHBDfSk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIFNvbHV0aW9uIHNvbDsKCiAgICB2ZWN0b3I8aW50PiBBID0gezEsIDV9OwogICAgdmVjdG9yPGludD4gQiA9IHsyLCAzfTsKICAgIHZlY3RvcjxpbnQ+IEMgPSB7NCwgNn07CgogICAgY291dCA8PCBzb2wuZ2V0TWluTW92ZXMoQSwgQiwgQykgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==