/*
Problem: Minimum Top-Ranked Elements Needed to Form a Majority Subarray
Company Tag: Trilogy OA problem
Problem Statement:
We are given A books in a row.
B[i] is the thickness of the i-th book.
All thicknesses are unique.
If we cover a book of thickness x, then every book thicker than x
must also be covered.
So we can only choose the k thickest books.
We need the minimum k such that there exists a contiguous subarray
of length at least C where:
number of covered books > number of uncovered books
Constraints:
1 <= A <= 100000
1 <= B[i] <= A
B[i] values are unique.
1 <= C <= A
Simple Brute Force:
Try every k.
For every k, check every possible subarray.
Why Brute Force Fails:
There can be 100000 books.
Checking all subarrays for every k is too slow.
Better Idea:
Binary search the answer k.
For a fixed k:
- Mark the k thickest books as +1.
- Mark all other books as -1.
Now the question becomes:
Is there any subarray of length at least C with sum > 0?
If yes, covered books are more than uncovered books in that subarray.
Dry Run:
A = 6
B = [6, 1, 4, 2, 5, 3]
C = 4
Try k = 3.
Covered books are 6, 5, and 4.
Converted array:
[1, -1, 1, -1, 1, -1]
Subarray [6, 1, 4, 2, 5] has sum 1.
So it has more covered books.
Answer = 3
Time Complexity:
O(A log A)
Space Complexity:
O(A)
*/
#include <bits/stdc++.h>
using namespace std;
bool canCreateMajoritySubarray(int A, vector<int>& B, int C, int k) {
vector<int> prefix(A + 1, 0);
/*
Since B contains unique values from 1 to A,
the k thickest books have thickness >= A - k + 1.
*/
int minimumCoveredThickness = A - k + 1;
for (int i = 0; i < A; i++) {
int value;
if (B[i] >= minimumCoveredThickness) {
value = 1;
} else {
value = -1;
}
prefix[i + 1] = prefix[i] + value;
}
int minimumPrefixSeen = 0;
for (int right = C; right <= A; right++) {
/*
For a subarray ending at right and having length at least C,
the left prefix can be at most right - C.
*/
minimumPrefixSeen = min(minimumPrefixSeen, prefix[right - C]);
int bestSum = prefix[right] - minimumPrefixSeen;
if (bestSum > 0) {
return true;
}
}
return false;
}
int solution(int A, vector<int> B, int C) {
int low = 1;
int high = A;
int answer = A;
while (low <= high) {
int mid = low + (high - low) / 2;
if (canCreateMajoritySubarray(A, B, C, mid)) {
answer = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
return answer;
}
int main() {
int A, C;
cin >> A;
vector<int> B(A);
for (int i = 0; i < A; i++) {
cin >> B[i];
}
cin >> C;
cout << solution(A, B, C) << endl;
return 0;
}
LyoKICAgIFByb2JsZW06IE1pbmltdW0gVG9wLVJhbmtlZCBFbGVtZW50cyBOZWVkZWQgdG8gRm9ybSBhIE1ham9yaXR5IFN1YmFycmF5CiAgICBDb21wYW55IFRhZzogVHJpbG9neSBPQSBwcm9ibGVtCgogICAgUHJvYmxlbSBTdGF0ZW1lbnQ6CiAgICAgICAgV2UgYXJlIGdpdmVuIEEgYm9va3MgaW4gYSByb3cuCgogICAgICAgIEJbaV0gaXMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgaS10aCBib29rLgogICAgICAgIEFsbCB0aGlja25lc3NlcyBhcmUgdW5pcXVlLgoKICAgICAgICBJZiB3ZSBjb3ZlciBhIGJvb2sgb2YgdGhpY2tuZXNzIHgsIHRoZW4gZXZlcnkgYm9vayB0aGlja2VyIHRoYW4geAogICAgICAgIG11c3QgYWxzbyBiZSBjb3ZlcmVkLgoKICAgICAgICBTbyB3ZSBjYW4gb25seSBjaG9vc2UgdGhlIGsgdGhpY2tlc3QgYm9va3MuCgogICAgICAgIFdlIG5lZWQgdGhlIG1pbmltdW0gayBzdWNoIHRoYXQgdGhlcmUgZXhpc3RzIGEgY29udGlndW91cyBzdWJhcnJheQogICAgICAgIG9mIGxlbmd0aCBhdCBsZWFzdCBDIHdoZXJlOgoKICAgICAgICAgICAgbnVtYmVyIG9mIGNvdmVyZWQgYm9va3MgPiBudW1iZXIgb2YgdW5jb3ZlcmVkIGJvb2tzCgogICAgQ29uc3RyYWludHM6CiAgICAgICAgMSA8PSBBIDw9IDEwMDAwMAogICAgICAgIDEgPD0gQltpXSA8PSBBCiAgICAgICAgQltpXSB2YWx1ZXMgYXJlIHVuaXF1ZS4KICAgICAgICAxIDw9IEMgPD0gQQoKICAgIFNpbXBsZSBCcnV0ZSBGb3JjZToKICAgICAgICBUcnkgZXZlcnkgay4KICAgICAgICBGb3IgZXZlcnkgaywgY2hlY2sgZXZlcnkgcG9zc2libGUgc3ViYXJyYXkuCgogICAgV2h5IEJydXRlIEZvcmNlIEZhaWxzOgogICAgICAgIFRoZXJlIGNhbiBiZSAxMDAwMDAgYm9va3MuCiAgICAgICAgQ2hlY2tpbmcgYWxsIHN1YmFycmF5cyBmb3IgZXZlcnkgayBpcyB0b28gc2xvdy4KCiAgICBCZXR0ZXIgSWRlYToKICAgICAgICBCaW5hcnkgc2VhcmNoIHRoZSBhbnN3ZXIgay4KCiAgICAgICAgRm9yIGEgZml4ZWQgazoKICAgICAgICAgICAgLSBNYXJrIHRoZSBrIHRoaWNrZXN0IGJvb2tzIGFzICsxLgogICAgICAgICAgICAtIE1hcmsgYWxsIG90aGVyIGJvb2tzIGFzIC0xLgoKICAgICAgICBOb3cgdGhlIHF1ZXN0aW9uIGJlY29tZXM6CiAgICAgICAgICAgIElzIHRoZXJlIGFueSBzdWJhcnJheSBvZiBsZW5ndGggYXQgbGVhc3QgQyB3aXRoIHN1bSA+IDA/CgogICAgICAgIElmIHllcywgY292ZXJlZCBib29rcyBhcmUgbW9yZSB0aGFuIHVuY292ZXJlZCBib29rcyBpbiB0aGF0IHN1YmFycmF5LgoKICAgIERyeSBSdW46CiAgICAgICAgQSA9IDYKICAgICAgICBCID0gWzYsIDEsIDQsIDIsIDUsIDNdCiAgICAgICAgQyA9IDQKCiAgICAgICAgVHJ5IGsgPSAzLgogICAgICAgIENvdmVyZWQgYm9va3MgYXJlIDYsIDUsIGFuZCA0LgoKICAgICAgICBDb252ZXJ0ZWQgYXJyYXk6CiAgICAgICAgICAgIFsxLCAtMSwgMSwgLTEsIDEsIC0xXQoKICAgICAgICBTdWJhcnJheSBbNiwgMSwgNCwgMiwgNV0gaGFzIHN1bSAxLgogICAgICAgIFNvIGl0IGhhcyBtb3JlIGNvdmVyZWQgYm9va3MuCgogICAgICAgIEFuc3dlciA9IDMKCiAgICBUaW1lIENvbXBsZXhpdHk6CiAgICAgICAgTyhBIGxvZyBBKQoKICAgIFNwYWNlIENvbXBsZXhpdHk6CiAgICAgICAgTyhBKQoqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGNhbkNyZWF0ZU1ham9yaXR5U3ViYXJyYXkoaW50IEEsIHZlY3RvcjxpbnQ+JiBCLCBpbnQgQywgaW50IGspIHsKICAgIHZlY3RvcjxpbnQ+IHByZWZpeChBICsgMSwgMCk7CgogICAgLyoKICAgICAgICBTaW5jZSBCIGNvbnRhaW5zIHVuaXF1ZSB2YWx1ZXMgZnJvbSAxIHRvIEEsCiAgICAgICAgdGhlIGsgdGhpY2tlc3QgYm9va3MgaGF2ZSB0aGlja25lc3MgPj0gQSAtIGsgKyAxLgogICAgKi8KICAgIGludCBtaW5pbXVtQ292ZXJlZFRoaWNrbmVzcyA9IEEgLSBrICsgMTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEE7IGkrKykgewogICAgICAgIGludCB2YWx1ZTsKCiAgICAgICAgaWYgKEJbaV0gPj0gbWluaW11bUNvdmVyZWRUaGlja25lc3MpIHsKICAgICAgICAgICAgdmFsdWUgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlID0gLTE7CiAgICAgICAgfQoKICAgICAgICBwcmVmaXhbaSArIDFdID0gcHJlZml4W2ldICsgdmFsdWU7CiAgICB9CgogICAgaW50IG1pbmltdW1QcmVmaXhTZWVuID0gMDsKCiAgICBmb3IgKGludCByaWdodCA9IEM7IHJpZ2h0IDw9IEE7IHJpZ2h0KyspIHsKICAgICAgICAvKgogICAgICAgICAgICBGb3IgYSBzdWJhcnJheSBlbmRpbmcgYXQgcmlnaHQgYW5kIGhhdmluZyBsZW5ndGggYXQgbGVhc3QgQywKICAgICAgICAgICAgdGhlIGxlZnQgcHJlZml4IGNhbiBiZSBhdCBtb3N0IHJpZ2h0IC0gQy4KICAgICAgICAqLwogICAgICAgIG1pbmltdW1QcmVmaXhTZWVuID0gbWluKG1pbmltdW1QcmVmaXhTZWVuLCBwcmVmaXhbcmlnaHQgLSBDXSk7CgogICAgICAgIGludCBiZXN0U3VtID0gcHJlZml4W3JpZ2h0XSAtIG1pbmltdW1QcmVmaXhTZWVuOwoKICAgICAgICBpZiAoYmVzdFN1bSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IHNvbHV0aW9uKGludCBBLCB2ZWN0b3I8aW50PiBCLCBpbnQgQykgewogICAgaW50IGxvdyA9IDE7CiAgICBpbnQgaGlnaCA9IEE7CiAgICBpbnQgYW5zd2VyID0gQTsKCiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKCiAgICAgICAgaWYgKGNhbkNyZWF0ZU1ham9yaXR5U3ViYXJyYXkoQSwgQiwgQywgbWlkKSkgewogICAgICAgICAgICBhbnN3ZXIgPSBtaWQ7CiAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBhbnN3ZXI7Cn0KCmludCBtYWluKCkgewogICAgaW50IEEsIEM7CiAgICBjaW4gPj4gQTsKCiAgICB2ZWN0b3I8aW50PiBCKEEpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQTsgaSsrKSB7CiAgICAgICAgY2luID4+IEJbaV07CiAgICB9CgogICAgY2luID4+IEM7CgogICAgY291dCA8PCBzb2x1dGlvbihBLCBCLCBDKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9