# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1144153 | AlgorithmWarrior | Sequence (APIO23_sequence) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
// Clasa MedianHeap pentru a menține medianele eficient
class MedianHeap {
private:
priority_queue<int> leftMaxHeap; // Max-heap pentru jumătatea mai mică
priority_queue<int, vector<int>, greater<int>> rightMinHeap; // Min-heap pentru jumătatea mai mare
public:
void insert(int num) {
if (leftMaxHeap.empty() || num <= leftMaxHeap.top()) {
leftMaxHeap.push(num);
} else {
rightMinHeap.push(num);
}
// Rebalansare pentru a menține echilibrul dintre cele două heap-uri
if (leftMaxHeap.size() > rightMinHeap.size() + 1) {
rightMinHeap.push(leftMaxHeap.top());
leftMaxHeap.pop();
} else if (rightMinHeap.size() > leftMaxHeap.size()) {
leftMaxHeap.push(rightMinHeap.top());
rightMinHeap.pop();
}
}
void remove(int num) {
if (!leftMaxHeap.empty() && num <= leftMaxHeap.top()) {
leftMaxHeap.pop();
} else {
rightMinHeap.pop();
}
// Rebalansare
if (leftMaxHeap.size() > rightMinHeap.size() + 1) {
rightMinHeap.push(leftMaxHeap.top());
leftMaxHeap.pop();
} else if (rightMinHeap.size() > leftMaxHeap.size()) {
leftMaxHeap.push(rightMinHeap.top());
rightMinHeap.pop();
}
}
int getMedian() {
return leftMaxHeap.top(); // Mediană este mereu în vârful max-heap-ului
}
void clear() {
while (!leftMaxHeap.empty()) leftMaxHeap.pop();
while (!rightMinHeap.empty()) rightMinHeap.pop();
}
};
int solveSequence(int n, vector<int>& arr) {
int max_freq = 0;
unordered_map<int, int> freq_map; // Pentru a stoca frecvențele medianelor
// Parcurgem fiecare subsecvență (l, r)
for (int l = 0; l < n; ++l) {
MedianHeap medianHeap;
freq_map.clear();
for (int r = l; r < n; ++r) {
medianHeap.insert(arr[r]);
int median = medianHeap.getMedian();
freq_map[median]++;
max_freq = max(max_freq, freq_map[median]);
}
}
return max_freq;
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
cout << solveSequence(n, arr) << endl;
return 0;
}