Submission #1134239

#TimeUsernameProblemLanguageResultExecution timeMemory
1134239ByeWorldFinancial Report (JOI21_financial)C++20
5 / 100
1986 ms60344 KiB
#include <bits/stdc++.h> #define int long long #define ll long long #define pb push_back #define fi first #define se second #define lf (id<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) #define ld long double using namespace std; typedef pair<int,int> pii; typedef pair<char,char> pcc; typedef pair<int,pii> ipii; typedef pair<pii,pii> ipiii; const int MAXN = 3e5+10; const int SQRT = 610; const int MAXA = 50; const int MOD = 1e6+7; const int INF = 1e9+10; const int LOG = 30; int n, d, a[MAXN]; vector <pii> vec, vec2; int ANS, dp[MAXN], tag[MAXN], las[MAXN]; struct seg { int st[4*MAXN]; int que(int id, int l, int r, int x, int y){ if(x<=l && r<=y) return st[id]; if(r<x || y<l) return 0; return max(que(lf,l,md,x,y), que(rg,md+1,r,x,y)); } int upd(int id, int l, int r, int x, int p){ if(l==r && l==x) return st[id] = p; if(r<x || x<l)return st[id]; return st[id] = max(upd(lf,l,md,x,p),upd(rg,md+1,r,x,p)); } } A; struct node{ int le,ri,val,sum; } NOL; node MAKE(int x){ node ret; ret.le = ret.ri = ret.val = ret.sum = x; return ret; } node mer(node a, node b){ if(a.sum==-2*INF) return b; else if(b.sum==-2*INF) return a; node ret; ret.sum = a.sum + b.sum; ret.le = max(a.le, a.sum+b.le); ret.ri = max(b.ri, a.ri+b.sum); ret.val = max(max(a.val, b.val), a.ri+b.le); return ret; } struct seg2 { node st[4*MAXN]; void bd(int id, int l, int r){ st[id] = MAKE(-INF-1); if(l==r){ return; } bd(lf,l,md); bd(rg,md+1,r); st[id] = mer(st[lf],st[rg]); } node que(int id,int l,int r,int x,int y){ if(x<=l && r<=y) return st[id]; if(r<x || y<l) return NOL; return mer(que(lf,l,md,x,y), que(rg,md+1,r,x,y)); } node upd(int id,int l,int r,int x,int p){ if(l==r && x==l) return st[id] = MAKE(p); if(r<x || x<l) return st[id]; return st[id] = mer(upd(lf,l,md,x,p), upd(rg,md+1,r,x,p)); } } B; signed main(){ // ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); NOL = MAKE(-2*INF); cin>>n>>d; for(int i=1; i<=n; i++){ cin>>a[i]; vec.pb({a[i],i}); vec2.pb({a[i],-i}); } sort(vec2.rbegin(), vec2.rend()); B.bd(1,1,n); for(auto [x, id] : vec2){ id = -id; tag[id] = 1; // cout << B.que(1,1,n,1,3).val << ' ' << B.que(1,1,n,2,3).val // << ' ' << B.que(1,1,n,1,id).val << " pp\n"; int l=1, r=id, mid=0, cnt=1; while(l<=r){ mid = md; if(B.que(1,1,n,mid,id).val >= d) cnt = mid, l = mid+1; else r = mid-1; } las[id] = cnt; B.upd(1,1,n,id,1); // int tot = 0; // for(int j=id-1; j>=1; j--){ // las[id] = j; // if(tag[j]) tot++; // else tot = 0; // if(tot == d) break; // } // cout << id << ' ' << las[id] << " las\n"; } sort(vec2.begin(), vec2.end()); for(auto [x, id] : vec2){ id = -id; dp[id] = A.que(1,1,n,las[id],id)+1; A.upd(1,1,n,id,dp[id]); ANS = max(ANS, dp[id]); } cout << ANS << '\n'; } /* 11 2 1 4 4 2 2 4 9 5 7 0 3 7 1 las 9 1 las 8 1 las 2 1 las 3 1 las 6 2 las 11 8 las 4 2 las 5 3 las 1 0 las 10 8 las 4 7 1 100 600 600 200 300 500 500 2 1 las 3 2 las 6 3 las 7 6 las 5 3 las 4 3 las 1 0 las 3 */
#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...