C. LIS or Reverse LIS?

https://codeforces.com/problemset/problem/1682/C

题意:给定长度为n的数组a,问a的任意排列的逆序和正序的LIS的较小的一个,最长是多少。

思路:如果某个字符出现大于两次,那么这个数字可以被正序和逆序同时使用,长度+1。如果某个数字出现1次,那么可以被正序或者逆序使用,而且有一个单独出现的字符可以被正序和逆序同时使用

总结:写了半天,想了多种构造方法,仍无法通过tc2,没想到思路直接错了。。还写LIS,服了。

inline void solve() {
    int n;
    cin >> n;

    vector<int> a(n);
    map<int, int> mapp;
    for (auto& x : a) {
        cin >> x;
        mapp[x] ++;
    }
    int d = 0, s = 0;
    for (const auto& [x, y] : mapp) {
        if (y >= 2) {
            d ++;
        }
        else {
            s ++;
        }
    }

    cout << (d + (s + 1) / 2) << '\n';

}
posted @ 2025-07-09 09:32  _Yxc  阅读(5)  评论(0)    收藏  举报