제출 #1216799

#제출 시각아이디문제언어결과실행 시간메모리
1216799Younis_DwaiFinancial Report (JOI21_financial)C++20
100 / 100
2874 ms88496 KiB
//#pragma GCC optimize("Ofast,O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> #define int long long #define F first #define S second #define pb push_back #define popp pop_back #define in insert #define endl "\n" #define mid (l+r)/2 using namespace std; const int N=3e5+5; struct item{ int mx=0,mxp=0,mxs=0,sz; }; int n,D,b[N],tree[N*4],dp[N],tt=0; vector<int> adj[N]; item T[N*4]; item combine(item x , item y){ item ret; ret.mxp=x.mxp;ret.mxs=y.mxs; if(x.mxp==x.sz) ret.mxp=x.mxp+y.mxp; if(y.mxs==y.sz) ret.mxs=y.mxs+x.mxs; ret.mx=max({x.mx,y.mx,x.mxs+y.mxp}); ret.sz=x.sz+y.sz; return ret; } void build(int node , int l , int r){ T[node]={r-l+1,r-l+1,r-l+1,r-l+1}; if(l==r) return ; build(node*2,l,mid); build(node*2+1,mid+1,r); return ; } void flip(int node , int l , int r , int id){ if(l==r){ T[node]={0,0,0,1}; return ; } else if(id<=mid) flip(node*2,l,mid,id); else flip(node*2+1,mid+1,r,id); T[node]=combine(T[node*2],T[node*2+1]); return ; } item longest(int node , int l ,int r , int s , int e){ if(s>e) return {0,0,0,0}; if(l>=s && r<=e) return T[node]; else if(l>e || r<s) return {0,0,0,1}; return combine(longest(node*2,l,mid,s,e),longest(node*2+1,mid+1,r,s,e)); } int query(int node , int l , int r ,int s , int e){ if(l>=s && r<=e) return tree[node]; else if(l>e || r<s) return 0; return max(query(node*2,l,mid,s,e),query(node*2+1,mid+1,r,s,e)); } void upd(int node , int l , int r , int id , int v){ if(l==r){ tree[node]=v; return ; } else if(id<=mid) upd(node*2,l,mid,id,v); else upd(node*2+1,mid+1,r,id,v); tree[node]=max(tree[node*2],tree[node*2+1]); return ; } int32_t main(){ ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); cin>>n>>D; build(1,1,n); vector<int> v;map<int,int> mp; for(int i=1;i<=n;i++) cin>>b[i],v.pb(b[i]); sort(v.begin(),v.end());v.resize(unique(v.begin(),v.end())-v.begin()); for(auto u : v) mp[u]=++tt; for(int i=1;i<=n;i++){ b[i]=mp[b[i]]; adj[b[i]].pb(i); //cout<<b[i]<<' '; } int ret=1; for(int i=1;i<=tt;i++){ for(auto u : adj[i]){ dp[u]=1; int l=1,r=u-1,midd=(l+r)/2; while(l<r){ item x=longest(1,1,n,midd,u-1); if(x.mx<D) r=midd; else l=midd+1; midd=(l+r)/2; } dp[u]=1+query(1,1,n,midd,u); ret=max(ret,dp[u]); //cout<<" # "<<u<<' '<<' '<<midd<<' '<<dp[u]<<endl; } for(auto u : adj[i]){ upd(1,1,n,u,dp[u]); flip(1,1,n,u); } } cout<<ret; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...