#include <bits/stdc++.h>
#define int long long
using namespace std;
const int NMAX=2e5;
int n, x, v[NMAX+1];
int LIS_end[NMAX+1]; ///length care se termina la i
vector<int> dp[NMAX+1];///strict crescator
vector<int> dp2[NMAX+1];///strict descrescator
int sz, sz2;
signed main()
{
cin>>n>>x;
for(int i=1; i<=n; i++)
cin>>v[i];
for(int i=1; i<=n; i++)
{
if(sz==0 || dp[sz].back() < v[i])
dp[++sz].push_back(v[i]);
else
{
int st=1, dr=sz, poz=st;
while(st<=dr)
{
int mid=(st+dr)/2;
if(dp[mid].back() < v[i])
poz=mid, st=mid+1;
else
dr=mid-1;
}
dp[poz].push_back(v[i]);
LIS_end[i]=poz;
}
}
int ans=sz;
for(int i=n; i>=2; i--)//pana la 2 ca n are sens sa fac update pe tot sirul
{
if(sz2==0 || dp2[sz2].back() > v[i])
dp2[++sz2].push_back(v[i]);
else
{
int st=1, dr=sz, poz=1;
while(st<=dr)
{
int mid=(st+dr)/2;
if(dp2[mid].back() > v[i])
st=mid+1;
else
poz=mid, dr=mid-1;
}
dp2[poz].push_back(v[i]);
///LIS care incepe la i de lungime poz = LIS_begin[i]
///dau reverse la update-ul pe prefix ca sa trec la prefixul pana la i-1
dp[LIS_end[i]].pop_back();
///si acum presupun ca solutia e formata cu LIS_begin[i]
///si caut un prefix unde pot sa pun acest numar
st=1, dr=n;
int poz2=1;
while(st<=dr)
{
int mid=(st+dr)/2;
if(dp[i].empty() || dp[i].back() >= v[i]-x)
dr=mid-1;
else
poz2=mid, st=mid+1;
}
ans=max(ans, poz+poz2+1);
}
}
cout<<ans;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |