Submission #441177

#TimeUsernameProblemLanguageResultExecution timeMemory
441177leakedMoney (IZhO17_money)C++14
45 / 100
1583 ms77380 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//    #pragma GCC optimize("-O3")
//    #pragma GCC optimize("no-stack-protector")
//    #pragma GCC optimize("fast-math")
//    #pragma GCC optimize("Ofast")
//    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
//    #pragma GCC target("avx,avx2,fma")
//    #pragma GCC optimization ("unroll-loops")
using namespace std;
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifndef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
	*this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
//using namespace __gnu_pbds;
#define fast_io ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define vec vector
#define getin freopen("input.txt","r",stdin);
#define getout ofstream cout("output.txt");
#define getfiles getin;getout
#define m_p make_pair
#define f first
#define sz(x) (int)x.size()
#define pw(x) (1LL<<x)
#define pb push_back
#define endl '\n'
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define s second
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;
typedef pair<int,ll> pil;
typedef long double ld;
template<typename T>bool umax(T &a,const T &b)  {return (a<b?a=b,1:0);}
template<typename T>bool umin(T &a,const T &b)  {return (a>b?a=b,1:0);}
const int lg=20;
const int N=1e6+1;
int a[N];
int n;
int uk[N];
deque<pii>dq1,dq2;
void add1(pii v){
    while(sz(dq1) && dq1.back().f<v.f){
        dq1.pop_back();
    }
    dq1.push_back(v);
}
void era1(pii v){
    assert(sz(dq1));
    if(dq1.front()==v)
        dq1.pop_front();
}
void add2(pii v){
    while(sz(dq2) && dq2.back().f>v.f){
        dq2.pop_back();
    }
    dq2.push_back(v);
}
void era2(pii v){
    assert(sz(dq2));
    if(dq2.front()==v)
        dq2.pop_front();
}
int t[4*N];
void upd(int id,int x,int v,int tl,int tr){
    if(tl==tr){
        t[v]=x;
        return;
    }
    int tm=(tl+tr)>>1;
    if(tm>=id)
        upd(id,x,2*v,tl,tm);
    else
        upd(id,x,2*v+1,tm+1,tr);
    t[v]=min(t[2*v],t[2*v+1]);
}
int get(int l,int r,int v,int tl,int tr){
    if(tl>=l && tr<=r){
        return t[v];
    }
    if(tl>r || tr<l){
        return 2e9;
    }
    int tm=(tl+tr)>>1;
    return min(get(l,r,2*v,tl,tm),get(l,r,2*v+1,tm+1,tr));
}
signed main(){

    fast_io;
//    ifstream cin("money.in");
//    ofstream cout("money.out");
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int l=0;
    set<int>st;
    auto ok=[&](){
        int x=dq2.front().f,y=dq1.front().f;
//        debug()<<imie(x)imie(y)imie(l);
        auto it=st.upper_bound(x);
        if(it!=st.end() && *it<y){
            return 0;
        }
        return 1;
    };
    for(int i=0;i<n;i++){
        add1({a[i],i});
        add2({a[i],i});
        while(!ok() || a[i]!=dq1.front().f){
            era1({a[l],l});
            era2({a[l],l});
            st.insert(a[l]);
            l++;
        }
        uk[i]=l;
    }
    fill(t,t+4*N,2e9);
    upd(0,0,1,0,n);
    for(int i=0;i<n;i++){
        int vl=get(uk[i],n,1,0,n);
//        debug()<<imie(uk[i]);
        upd(i+1,vl+1,1,0,n);
    }
    cout<<get(n,n,1,0,n);
    return 0;
}
/*
1
4 2
0110

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...