Submission #785297

#TimeUsernameProblemLanguageResultExecution timeMemory
785297makanhuliaGlobal Warming (CEOI18_glo)C++17
25 / 100
144 ms6572 KiB
#include<bits/stdc++.h>
 
using namespace std;
 
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long, long long>
// jangan kebiasa kalah
// kalo OI, sampah aja dulu, tapi jangan menutup kemungkinan buat AC

long long n,x,arr[200069],ans,dp[200069],bef[200069];

long long lis()
{
    long long i,j;
    vector<long long> tmp(n+5,1e18);
    tmp[0] = -1e18;
    for(i=1;i<=n;i++)
    {
        j = upper_bound(tmp.begin(),tmp.end(),arr[i])-tmp.begin();
        if(tmp[j-1] < arr[i] and arr[i] < tmp[j])
        {
            tmp[j] = arr[i];
        }
    }
    j = 0;
    for(i=1;i<=n;i++)
    {
        if(tmp[i] < 1e18)
        {
            j = i;
        }
    }
    return j;
}

int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    long long i,j,s;
    cin>>n>>x;
    for(i=1;i<=n;i++)
    {
        cin>>arr[i];
        bef[i] = i;
        dp[i] = 1;
    }
    // for(i=2;i<=n;i++)
    // {
    //     for(j=1;j<i;j++)
    //     {
    //         if(arr[j] < arr[i] and dp[j] + 1 > dp[i])
    //         {
    //             dp[i] = dp[j] + 1;
    //             bef[i] = j;
    //         }
    //     }
    //     if(dp[i] > ans)
    //     {
    //         ans = dp[i];
    //         idx = i;
    //     }
    // }
    // cout<<"debug : "<<ans<<'\n';
    // for(ans=ans;ans;ans--)
    // {
    //     cout<<idx<<" ";
    //     idx = bef[idx];
    // }
    if(x == 0ll)
    {
        ans = lis();
        cout<<ans<<'\n';
        return 0;
    }
    if(n <= 50 and x <= 50)
    {
        long long l,r;
        ans = 1;
        for(s=-x;s<=0;s++)
        {
            for(l=1;l<=n;l++)
            {
                for(r=l;r<=n;r++)
                {
                    long long tmp[n+1];
                    tmp[0] = 0;
                    for(i=1;i<=n;i++)
                    {
                        tmp[i] = arr[i];
                        if(l <= i and i <= r)
                        {
                            tmp[i] += s;
                        }
                        dp[i] = 1;
                    }
                    for(i=2;i<=n;i++)
                    {
                        for(j=1;j<i;j++)
                        {
                            if(tmp[i] > tmp[j] and dp[i] < dp[j]+1)
                            {
                                dp[i] = dp[j]+1;
                            }
                        }
                        ans = max(ans,dp[i]);
                    }
                }
            }
        }
        cout<<ans<<'\n';
        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...
#Verdict Execution timeMemoryGrader output
Fetching results...