제출 #319200

#제출 시각아이디문제언어결과실행 시간메모리
319200kshitij_sodaniMoney (IZhO17_money)C++14
9 / 100
1 ms492 KiB
#include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second //#define endl '\n' int n; int it[1000001]; int tree[1000001*4]; void build(int no,int l,int r){ if(l==r){ tree[no]=it[l]; } else{ int mid=(l+r)/2; build(no*2+1,l,mid); build(no*2+2,mid+1,r); tree[no]=max(tree[no*2+1],tree[no*2+2]); } } int query(int no,int l,int r,int aa,int bb){ if(r<aa or l>bb){ return 0; } if(aa<=l and r<=bb){ return tree[no]; } else{ int mid=(l+r)/2; return max(query(no*2+1,l,mid,aa,bb),query(no*2+2,mid+1,r,aa,bb)); } } bool cmp(pair<int,int> aa,pair<int,int> bb){ if(aa.b<bb.b){ return true; } return false; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n; for(int i=0;i<n;i++){ cin>>it[i]; } vector<pair<int,int>> ss; vector<pair<int,int>> tt; set<int> kk; build(0,0,n-1); for(int i=0;i<n;i++){ while(ss.size()){ if(ss.back().a<=it[i]){ ss.pop_back(); } else{ break; } } if(ss.size()){ int ne=ss.back().b; tt.pb({ne,i-1}); int jj=*kk.upper_bound(it[i]); int low=i; for(int j=19;j>=0;j--){ if(low+(1<<j)<n){ if(query(0,0,n-1,i,low+(1<<j))<=jj){ low+=(1<<j); } } } if(low<n-1){ tt.pb({i,low}); } } kk.insert(it[i]); ss.pb({it[i],i}); } set<pair<int,int>> mm; for(auto j:tt){ mm.insert(j); } sort(tt.begin(),tt.end(),cmp); int ans=1; for(auto j:tt){ if(mm.find(j)!=mm.end()){ ans+=1; auto jj=mm.lower_bound({j.a,0}); vector<pair<int,int>> xx; while(jj!=mm.end()){ if((*jj).a<=j.b){ xx.pb(*jj); jj++; } else{ break; } } for(auto jjj:xx){ mm.erase(jjj); } } } cout<<ans<<endl; 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...