Submission #240169

#TimeUsernameProblemLanguageResultExecution timeMemory
240169lycMountains (IOI17_mountains)C++14
100 / 100
44 ms16384 KiB
#include "mountains.h" #include <bits/stdc++.h> using namespace std; #define TRACE(x) cout << #x << " :: " << x << endl; #define _ << " " << #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(),(x).end() const double EPS = 1e-6; const int mxN = 2e3+5; int memo[mxN][mxN]; int solve(int l, int r, vector<int>& y) { if (l > r) return 0; if (l == r) return 1; if (~memo[l][r]) return memo[l][r]; int mx = l; FOR(i,l+1,r) if (y[i] > y[mx]) mx = i; memo[l][r] = solve(l,mx-1,y) + solve(mx+1,r,y); int cur = 1; if (l < mx-1) { int j = mx-2; double mng = (double)(y[mx]-y[mx-1]); RFOR(i,mx-2,l){ double g = (double)(y[mx]-y[i])/(mx-i); if (g < mng+EPS) { mng = g; cur += solve(i+1,j,y); j = i-1; } } cur += solve(l,j,y); } if (mx+1 < r) { int j = mx+2; double mng = (double)(y[mx]-y[mx+1]); FOR(i,mx+2,r){ double g = (double)(y[mx]-y[i])/(i-mx); if (g < mng+EPS) { mng = g; cur += solve(j,i-1,y); j = i+1; } } cur += solve(j,r,y); } memo[l][r] = max(memo[l][r],cur); return memo[l][r]; } int maximum_deevs(vector<int> y) { memset(memo,-1,sizeof memo); return solve(0,SZ(y)-1,y); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...