Submission #1228781

#TimeUsernameProblemLanguageResultExecution timeMemory
1228781meth_enjoyerFinancial Report (JOI21_financial)C++20
31 / 100
78 ms5820 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxN = 3e5 + 5;
int n, d;
int a[maxN];
vector<int> val;

namespace sub1{

    int get(int mask){
        int res = 0, pre = 0, m = 0;
        for (int i = 1; i <= n; ++i)
        if (mask >> (i - 1) & 1){
            if (!pre)
                res++;
            else
            {
                if (i - pre <= d)
                    res+= (a[i] > m);
            }

            m = max(m, a[i]);
            pre = i;
        }

        return res;
    }

    void solve(){
        int ans = 0;
        for (int mask = 0; mask < (1 << n); ++mask)
            ans = max(ans, get(mask));

        cout << ans;

    }
}

void compress(){
    sort(val.begin(), val.end());
    val.resize(unique(val.begin(), val.end()) - val.begin());
    for (int i = 1; i <= n; ++i)
        a[i] = upper_bound(val.begin(), val.end(), a[i]) - val.begin();
}

namespace sub4{
    vector<int> q;

    void solve(){
        compress();
        int ans = 0;

        for (int i = n; i > 0; --i){
            while (q.size() && a[q.back()] <= a[i])
                q.pop_back();

            ans = max(ans, (int) q.size() + 1);

            q.push_back(i);
        }

        cout << ans;
    }
}

namespace sub5{
    int f[maxN];

    int get(int x){
        int res = 0;
        for (; x > 0; x-= x & (-x))
            res = max(res, f[x]);
        return res;
    }

    void update(int x, int val){
        for (; x <= maxN - 5; x+= x & (-x))
            f[x] = max(f[x], val);
    }

    void solve(){
        compress();
        int ans = 0;
        for (int i = 1; i <= n; ++i){
            int res = get(a[i] - 1) + 1;
            ans = max(ans, res);
            update(a[i], res);
        }

        cout << ans;
    }
}

void solve(){
    if (n <= 20)
        sub1::solve();
    else
    {
        if (d == 1)
            sub4::solve();
        if (d == n)
            sub5::solve();
    }
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    // freopen("a.inp", "r", stdin);
    // freopen("a.out", "w", stdout);
    cin >> n >> d;
    for (int i = 1; i <= n; ++i)
        cin >> a[i], val.push_back(a[i]);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...