Submission #1134221

#TimeUsernameProblemLanguageResultExecution timeMemory
1134221ByeWorldFinancial Report (JOI21_financial)C++20
19 / 100
436 ms46076 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 = 1e18+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 dsu { int par[MAXN]; void bd(){ for(int i=0; i<=n+1; i++) par[i] = i; } int f(int x){ return (par[x]==x ? x : par[x]=f(par[x])); } void mer(int x, int y){ x = f(x); y = f(y); par[x] = y; } } LE, RI; signed main(){ // ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 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()); LE.bd(); RI.bd(); set <int> s; s.insert(0); for(auto [x, id] : vec2){ id = -id; tag[id] = 1; if(tag[id-1]) LE.mer(id, id-1); int le = LE.f(id), ri = RI.f(id); for(int i=ri-d; i>=le; i--){ if(s.find(i) != s.end()) break; s.insert(i); } for(int i=le; i<=ri-d; i++){ if(s.find(i) != s.end()) break; s.insert(i); } las[id] = *(--s.lower_bound(id))+1; if(tag[id+1]) RI.mer(id, id+1); for(int i=ri-d; i>=le; i--){ if(s.find(i) != s.end()) break; s.insert(i); } for(int i=le; i<=ri-d; i++){ if(s.find(i) != s.end()) break; s.insert(i); } // 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'; }
#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...