제출 #1346185

#제출 시각아이디문제언어결과실행 시간메모리
1346185iamhereforfunFinancial Report (JOI21_financial)C++20
53 / 100
82 ms12136 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))

const int N = 3e5 + 5;
const int M = 1 << 10;
const int K = 19;
const int LG = 11;
const int INF = 2e9 + 5;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;

struct LazySegmentTree
{
    vector<int> st, a, lazy;
    int n;
    void prop(int v, int l, int r)
    {
        if (lazy[v] == -1)
            return;
        st[v] = lazy[v];
        if (l != r)
        {
            lazy[2 * v] = lazy[v];
            lazy[2 * v + 1] = lazy[v];
        }
        lazy[v] = -1;
    }
    void update(int v, int val, int l, int r, int tl, int tr)
    {
        prop(v, l, r);
        if (tl > tr)
            return;
        if (tl <= l && r <= tr)
        {
            lazy[v] = val;
            prop(v, l, r);
        }
        else
        {
            int m = (l + r) / 2;
            update(2 * v, val, l, m, tl, min(tr, m));
            update(2 * v + 1, val, m + 1, r, max(tl, m + 1), tr);
            st[v] = max(st[2 * v], st[2 * v + 1]);
        }
    }
    LazySegmentTree(int len)
    {
        n = len;
        st.assign(4 * n, INF);
        lazy.assign(4 * n, -1);
    }
    void update(int val, int l, int r)
    {
        update(1, val, 0, n - 1, l, r);
    }
    int get(int p)
    {
        int v = 1, l = 0, r = n - 1;
        while (l <= r)
        {
            prop(v, l, r);
            if (l == r)
            {
                return l;
            }
            int m = (l + r) / 2;
            if (st[2 * v] < p)
            {
                l = m + 1;
                v = 2 * v + 1;
            }
            else
            {
                r = m;
                v = 2 * v;
            }
            // cout << l << " " << r << " " << v << " " << st[v] << " " << p << "\n";
        }
        return 0;
    }
    void print(int v, int l, int r)
    {
        prop(v, l, r);
        if (l == r)
        {
            cout << st[v] << " ";
            return;
        }
        else
        {
            int m = (l + r) / 2;
            print(2 * v, l, m);
            print(2 * v + 1, m + 1, r);
        }
    }
};

int n, d, a[N], len, ans;
vector<int> v, q, st;
deque<int> dq;

inline void solve()
{
    cin >> n >> d;
    ans = 0;
    for (int x = 1; x <= n; x++)
    {
        cin >> a[x];
    }
    LazySegmentTree q(n);
    len = 0;
    for (int x = 1; x <= n; x++)
    {
        if (x <= d)
        {
            int i = q.get(a[x]);
            ans = max(ans, i);
            q.update(a[x], i, i);
        }
        else
        {
            if (a[dq.front()] <= a[x])
            {
                int i = q.get(a[x]);
                // cout << i << "\n";
                ans = max(ans, i);
                q.update(a[x], i, i);
            }
            else
            {
                int i = q.get(a[dq.front()]);
                q.update(a[dq.front()], 0, i - 1);
                q.update(a[x], 0, 0);
            }
        }
        // cout << ans << "\n";
        while (!dq.empty())
        {
            if (a[dq.back()] >= a[x])
                dq.pop_back();
            else
                break;
        }
        dq.push_back(x);
        if (dq.front() == x - d)
        {
            dq.pop_front();
        }
        // q.print(1, 0, n - 1);
        // cout << "\n";
    }
    cout << ans + 1 << "\n";
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        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...