제출 #1150570

#제출 시각아이디문제언어결과실행 시간메모리
1150570fatman87878Financial Report (JOI21_financial)C++20
14 / 100
219 ms8636 KiB
#include<bits/stdc++.h> using namespace std; #define IOS cin.tie(nullptr)->sync_with_stdio(0),cin.exceptions(cin.failbit); #define lb(x) (x)&-(x) #define all(x) (x).begin(),(x).end() #define ll long long constexpr int maxN=3e5+5; int n,N,d,segt[maxN<<1],tag[maxN],ans; pair<int,int> tagflag[maxN]; inline void upd(int pos,int tpos){ if(tagflag[tpos].first)segt[pos] = tag[tpos]; if(tagflag[tpos].second)segt[pos] = max(segt[pos],tag[tpos]); if(pos<n){ if(tagflag[tpos].first)tag[pos]=tag[tpos],tagflag[pos] = tagflag[tpos]; if(tagflag[tpos].second)tag[pos] = max(tag[pos],tag[tpos]),tagflag[pos].second=1; } } inline void push(int pos){ pos+=n; for(int h = __lg(n);h;h--){ int i = pos>>h; if(!i)continue; if(tagflag[i].first||tagflag[i].second) upd(i<<1,i),upd(i<<1|1,i),tagflag[i] = {0,0},tag[pos] = -1e9; } } inline void pull(int pos){ for(pos+=n;pos>>=1;)if(!tagflag[pos].first&&!tagflag[pos].second){ segt[pos] = max(segt[pos<<1],segt[pos<<1|1]); } } inline void ass(int _l,int _r,int tgw){ push(_l),push(_r-1); tag[n+1] = tgw; tagflag[n+1] = {1,0}; for(int l = _l+n,r = _r+n;l<r;l>>=1,r>>=1){ if(l&1)upd(l++,n+1); if(r&1)upd(--r,n+1); } pull(_l),pull(_r-1); } inline void mdf(int _l,int _r,int tgw){ push(_l),push(_r-1); tag[n+1] = tgw; tagflag[n+1] = {0,1}; for(int l = _l+n,r = _r+n;l<r;l>>=1,r>>=1){ if(l&1)upd(l++,n+1); if(r&1)upd(--r,n+1); } pull(_l),pull(_r-1); } inline int query(int l,int r){ push(l),push(r-1); int ret = 0; for(l+=n,r+=n;l<r;l>>=1,r>>=1){ if(l&1)ret = max(ret,segt[l++]); if(r&1)ret = max(ret,segt[--r]); } return ret; } vector<int> disc; deque<pair<int,int>> dq; int h[maxN]; int main(){ IOS cin>>n>>d; for(int i = 1;i<=n;i++){ cin>>h[i]; disc.emplace_back(h[i]); } sort(all(disc)); disc.erase(unique(all(disc)),disc.end()); N=n; n=disc.size(); for(int i = 1;i<=N;i++)h[i] = lower_bound(all(disc),h[i])-disc.begin(); for(int i = 1;i<=N;i++){ for(;!dq.empty()&&dq.back().first>h[i];dq.pop_back()); dq.emplace_back(h[i],i); for(;!dq.empty()&&dq.front().second+d<i;dq.pop_front()); if(i>d)ass(0,dq.front().first,-1e9); mdf(h[i],n,query(0,h[i])+1); ans = max(ans,query(0,n)); } cout<<ans<<'\n'; }
#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...