Submission #1311576

#TimeUsernameProblemLanguageResultExecution timeMemory
1311576bbartekFinancial Report (JOI21_financial)C++20
100 / 100
469 ms58412 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define st first #define nd second #define pb push_back const int maxn = 3e5+7; int tab[maxn]; int minn[maxn]; int koniec[maxn]; unordered_map<int,int> mapa; int drzewo[2048*1024]; int n2=1; void update(int v,int x){ v += n2-1; drzewo[v] = max(drzewo[v],x); if(x==0) drzewo[v] = 0; v/=2; while(v!=0){ drzewo[v] = max(drzewo[v*2],drzewo[v*2+1]); v/=2; } } int query(int v,int l,int r,int a,int b){ if(a>b) return 0; if(a <= l && r <= b){ return drzewo[v]; } else if(a > r || b < l){ return 0; } else{ int mid = (l+r)/2; return max(query(v*2,l,mid,a,b),query(v*2+1,mid+1,r,a,b)); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n,k; cin>>n>>k; set<int> rozne; for(int i=1;i<=n;i++){ cin>>tab[i]; rozne.insert(tab[i]); } //cout<<"jestem\n"; int licz = 0; for(auto it : rozne){ licz++; mapa[it] = licz; } multiset<int> minima; for(int i=n;i>n-k;i--){ minima.insert(tab[i]); } for(int i=n-k;i>=1;i--){ minima.insert(tab[i]); auto it = minima.find(tab[i+k]); minima.erase(it); minn[i+k] = mapa[*(minima.begin())]; } while(n2<n) n2*=2; set<int> drzewne; int x,wyn=0; for(int i=1;i<=n;i++){ if(i >= k){ while(drzewne.size() != 0){ auto it = drzewne.begin(); if((*it) >= minn[i]) break; update((*it),0); drzewne.erase(it); } } x = query(1,1,n2,1,mapa[tab[i]]-1)+1; wyn = max(wyn,x); update(mapa[tab[i]],x); drzewne.insert(mapa[tab[i]]); } cout<<wyn<<"\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...