Submission #1245604

#TimeUsernameProblemLanguageResultExecution timeMemory
1245604JovicaGlobal Warming (CEOI18_glo)C++20
100 / 100
633 ms43492 KiB
#include <bits/stdc++.h> using namespace std; int const maxn = 2e5+1; int dp[maxn],lis[maxn]; void LIS(int n,vector<int> &v) { vector<int> s; for (int i=n-1;i>=0;i--) { int x = -v[i]; int p = lower_bound(s.begin(),s.end(),x) - s.begin(); if (p == s.size()) s.push_back(x); else s[p] = x; dp[i] = p+1; } s = {}; for (int i=0;i<n;i++) { int p = lower_bound(s.begin(),s.end(),v[i]) - s.begin(); if (p == s.size()) s.push_back(v[i]); else s[p] = v[i]; lis[i] = p; } //for (int i=0;i<n;i++) cout<<dp[i]<< " "; } map<int,int> prevod; void kompres(int n,vector<int> &v,int k) { set<int> s; for (int i=0;i<n;i++){ s.insert(v[i]); s.insert(v[i]+k-1); } int p = 1; for (auto a: s) { prevod[a] = p; p++; } } int drvo[2000000]; int najdi(int l,int r,int poz,int const levo,const int desno) { if (r<levo || desno<l) return 0; if (levo<=l && r<=desno) return drvo[poz]; int mid = (l+r)/2; return max(najdi(l,mid,poz*2,levo,desno),najdi(mid+1,r,poz*2+1,levo,desno)); } int update(int l,int r,int poz,const int p,int const k) { if (p<l || r<p) return drvo[poz]; if (l == r) { drvo[poz] = max(drvo[poz],k); return drvo[poz]; } int mid = (l+r)/2; drvo[poz] = max(update(l,mid,poz*2,p,k),update(mid+1,r,poz*2+1,p,k)); return drvo[poz]; } int main() { int n,k; cin>>n>>k;vector<int> v(n); for (int i=0;i<n;i++) cin>>v[i]; LIS(n,v); kompres(n,v,k); int odg = 0; int ns = 1;while (ns<n*2) ns*=2; for (int i=0;i<n;i++){ odg = max(odg,dp[i] + najdi(1,ns,1,1,prevod[v[i]+k-1])); //cout<<"odg "<<i<<": "<<dp[i] <<" + "<<najdi(1,ns,1,1,prevod[v[i]+k-1])<<endl; //cout<<"dodava "<<lis[i]<<endl; update(1,ns,1,prevod[v[i]],lis[i]+1); } cout<<odg<<endl; return 0; } /* 8 100 7 3 5 12 2 7 3 4 10 10 1 2 5 6 4 2 3 8 7 10 */
#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...