Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1100;
- int LIS[N]; // Arreglo para llevar la LIS en cada posición
- int LIS2[N]; // Arreglo para llevar la LIS en cada posición en orden inverso
- int nums[N];
- int main() {
- int t;
- cin >> t;
- while (t--) {
- memset(LIS, 0, sizeof(LIS));
- memset(LIS2, 0, sizeof(LIS2));
- int n;
- cin >> n;
- for (int i = 0; i < n; i++) {
- int ac;
- cin >> ac;
- nums[i] = ac;
- }
- multiset<int> ms;
- for (int i = 0; i < n; i++) {
- ms.insert(nums[i]);
- multiset<int>::iterator it = ms.lower_bound(nums[i]);
- it++;
- if (it != ms.end()) {
- ms.erase(it);
- }
- // Guardamos la respuesta en cada momento i
- LIS[i] = (int) ms.size();
- }
- int ans = (int) -1e9;
- multiset<int> ms2;
- for (int i = n - 1; i >= 0; i--) {
- ms2.insert(nums[i]);
- multiset<int>::iterator it = ms2.lower_bound(nums[i]);
- it++;
- if (it != ms2.end()) {
- ms2.erase(it);
- }
- LIS2[i] = (int) (ms2.size());
- // La respuesta será la mayor suma - 1 para no contar el elemento i 2 veces
- ans = max(ans, LIS2[i] + LIS[i] - 1);
- }
- cout << ans << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement