Submission #535681

#TimeUsernameProblemLanguageResultExecution timeMemory
535681crystaalrooFinancial Report (JOI21_financial)C++17
5 / 100
387 ms12056 KiB
#include <bits/stdc++.h> #define f first #define s second #define fore(i,a,b) for(int i = (a), ThxMK = (b); i < ThxMK; ++i) #define pb push_back #define all(s) begin(s), end(s) #define _ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define sz(s) int(s.size()) #define ENDL '\n' #define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__)) #define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__))) using namespace std; long long gcd(long long a, long long b){ return b? gcd(b, a%b) : a; } long long lcm(long long a, long long b){ return (!a or !b)? 0 : a * b / gcd(a,b); } long long poww(long long a, long long b){ long long res = 1; while(b){ if(b%2) res = res * a ; a = a * a; b>>=1; } return res; } // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // int rnd(int n){return uniform_int_distribution<int>(0, n-1)(rng);} template <typename T> static constexpr T inf = numeric_limits<T>::max() / 2; template<class t,class u>bool mmax(t&a,u b){if(a<b)a=b;return a<b;} template<class t,class u>bool mmin(t&a,u b){if(b<a)a=b;return b<a;} template<class t> using vc=vector<t>; template<class t> using vvc=vc<vc<t>>; using li = long long; using vi = vc<int>; using ii = pair<int,int>; // ('-')7 struct ST{ #define mid (l+r)/2 #define left(u) (u+1) #define right(u) (u+((mid-l+1)<<1)) vi st; ST(int n):st(2*n,0){} int f(int a, int b){ return max(a,b); } void update(int u, int l, int r, int pos, int val){ if(l>r)return; if(l==r){st[u]=val; return;} if(pos<=mid)update(left(u),l,mid,pos,val); else update(right(u),mid+1,r,pos,val); st[u]=f(st[left(u)],st[right(u)]); } int query(int u, int l, int r, int ll, int rr){ if(l>r or rr<l or ll>r)return 0; if(l>=ll and r<=rr)return st[u]; return f(query(left(u),l,mid,ll,rr),query(right(u),mid+1,r,ll,rr)); } }; set<int>e; set<ii>s; int m; void add(int l, int r){ if(l>r)return; if(r-l+1<m)return; s.insert({l,r}); e.insert(r); } void del(int w){ auto u = s.upper_bound({w+1,-1}); if(u==s.begin())return; u--; auto [a,b]=*u; if(w>=a and w<=b){ s.erase(u); e.erase(b); add(a,w-1); add(w+1,b); } } int main(){_ auto solve=[&](){ int n; cin>>n>>m; e.insert(n); add(0,n-1); vc<ii>v(n); fore(i,0,n){ int a; cin>>a; v[i]={a,-i}; } sort(all(v),greater<ii>()); ST st(n); int best = 1; fore(i,0,n){ int w = -v[i].s; del(w); auto x = e.upper_bound(w); int res = st.query(0,0,n-1,w,*x); best = max(res+1,best); st.update(0,0,n-1,w,res+1); } cout<<best<<ENDL; }; //int t; cin>>t; while(t--) solve(); }
#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...