제출 #1298353

#제출 시각아이디문제언어결과실행 시간메모리
1298353david_g611Global Warming (CEOI18_glo)C++20
100 / 100
107 ms16680 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]), LIS_end[i]=sz; else { int st=1, dr=sz, poz=0; 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+1].push_back(v[i]); LIS_end[i]=poz+1; } } int ans=sz; for(int i=n; i>=2; i--)//pana la 2 ca n are sens sa fac update pe tot sirul { int poz=1; if(sz2==0 || dp2[sz2].back() > v[i]) dp2[++sz2].push_back(v[i]), poz=sz2; else { int st=1, dr=sz2; 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 int st=1, dr=n; int poz2=0; while(st<=dr) { int mid=(st+dr)/2; if(dp[mid].empty() || dp[mid].back() >= v[i]+x) dr=mid-1; else poz2=mid, st=mid+1; } ans=max(ans, poz+poz2); } 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...