Submission #1298344

#TimeUsernameProblemLanguageResultExecution timeMemory
1298344david_g611Global Warming (CEOI18_glo)C++20
0 / 100
63 ms5252 KiB
#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 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...