제출 #737154

#제출 시각아이디문제언어결과실행 시간메모리
737154alexddFinancial Report (JOI21_financial)C++17
0 / 100
4016 ms9068 KiB
#include<bits/stdc++.h>
using namespace std;
int n,d;
int a[300005];
int dp[300005];
int posmic[300005];
int posmare[300005];
int pozs[300005];
deque<int> dqmic;
deque<int> dqmare;
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);

    cin>>n>>d;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        while(!dqmic.empty() && a[dqmic.back()]>=a[i])
            dqmic.pop_back();
        if(!dqmic.empty())
            posmic[i] = dqmic.back();
        else
            posmic[i] = 0;
        dqmic.push_back(i);

        while(!dqmare.empty() && a[dqmare.back()]<=a[i])
            dqmare.pop_back();
        if(!dqmare.empty())
            posmare[i] = dqmare.back();
        else
            posmare[i] = 0;
        dqmare.push_back(i);
        //cout<<i<<"  "<<posmic[i]<<" "<<posmare[i]<<"\n";
    }
    for(int i=1;i<=n;i++)
    {
        int ult = i;
        pozs[i] = i;
        for(int j=i-1;j>0;j--)
        {
            if(ult-j>d)
                break;
            if(a[j]<a[i])
            {
                pozs[i] = j;
                ult = j;
            }
        }
    }
    int rez=0;
    for(int i=1;i<=n;i++)
    {
        dp[i]=0;
        int x = posmic[i];
        while(x>=pozs[i] && a[x]<a[i])
        {
            dp[i] = max(dp[i], dp[x]);
            x = posmare[x];
        }
        dp[i]++;
        rez=max(rez,dp[i]);
    }
    cout<<rez;
    return 0;
}
/**

dp[i] = scorul maxim care se poate obtine daca ultimul element care creste scorul se afla pe pozitia i

dp[i] = max(dp[x]) + 1,  a[x] < a[i], distanta dintre oricare 2 pozitii consecutive cu numere < a[i] este maxim d

x = primul element din stanga lui i < a[i]

repeta atat timp a[x] < a[i]:
x = primul element din stanga lui x > a[x]

folosim binary lifting

*/
#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...