C. LIS or Reverse LIS?
题意
题意:给我们一些数,让我们重新排列的到数组啊,然后把数组反向得到另一个数组b,我们规定好的值为两个数组最长上升子序列的最大值里小的那一个。问我们可以得到的最大好的值为多少。
思路
思路:这个题的话,我们可以先升序排列然后再降序排列,考虑每一个数对答案的贡献是多少,我们发现只有不同的数在出现小于等于两次的时候才对答案有贡献,多余出现的都是没有用的,,然后我们会发现在上述情况下我们得到的数是奇数的话,那么对于中间的数来说对答案的贡献是2。最后我们除二就可以得到答案。
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> mp;
void solve()
{
mp.clear();
int n;
cin >> n;
int ans = 1;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
mp[x]++;
if (mp[x] <= 2)
ans++;
}
cout << ans / 2 << endl;
}
int main()
{
cin.tie(0)->sync_with_stdio(false);
int T;
cin >> T;
while (T--)
{
solve();
}
return 0;
}