Submission #846842

#TimeUsernameProblemLanguageResultExecution timeMemory
846842AbitoFinancial Report (JOI21_financial)C++17
40 / 100
229 ms292180 KiB
#include <bits/stdc++.h> #define F first #define S second #define pb push_back #define ppb pop_back #define ep insert #define endl '\n' #define elif else if #define pow pwr #define sqrt sqrtt //#define int long long #define y1 YONE typedef unsigned long long ull; using namespace std; const int N=3e5+5,M=405; int a[N],n,d,bit[N],lis[N],b[N],dp[M][M][M]; bool vis[M][M][M]; void edit(int x){ while (x<=n){ bit[x]++; x+=x&-x; }return; }int query(int x){ int y=0; while (x){ y+=bit[x]; x-=x&-x; }return y; } int rec(int i,int last,int mx){ if (i-last>d && last) return INT_MIN; if (i>n && last!=n) return INT_MIN; if (i>n) return 0; if (vis[i][last][mx]) return dp[i][last][mx]; vis[i][last][mx]=true; int nextmx=mx; if (a[i]>a[mx]) nextmx=i; return dp[i][last][mx]=max(rec(i+1,last,mx),rec(i+1,i,nextmx)+bool(nextmx==i)); } int32_t main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); cin>>n>>d; for (int i=1;i<=n;i++) cin>>a[i]; a[0]=INT_MIN; if (d==1){ stack<int> s; for (int i=1;i<=n;i++){ while (!s.empty()){ if (a[s.top()]<a[i]) s.pop(); else{ b[i]=s.top(); break; } }s.push(i); } int ans=0; for (int i=n;i;i--){ edit(b[i]+1); ans=max(ans,query(i)); }cout<<ans<<endl; return 0; }cout<<rec(1,0,0)<<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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...