楼上大佬单调栈解法太强了 能不能帮忙看看我的代码是否可行,应该是O(nlogn)的复杂度。 dp[i]表示 以i为结尾的子序列的最大值的和 const int maxn = 1e5+7; typedef long long ll; int pos[maxn]; int val[maxn*10]; ll dp[maxn*10]; int max_pos(int s, int e) { if(s > e) return -1; if(s == e) return pos[s]; int mid = s + (e-s)/2; int l = max_pos(s,mid); int r = max_pos(mid+1,e); return l > r ? l : r; } int main() { int n; while(~scanf("%d",&n)) { int mx = -1; for(int i = 0;i < n;i ++) { scanf("%d",val+i); mx = max(mx,val[i]); } double sum = 0; memset(pos,-1,sizeof(pos)); for(int i = 0;i < n;i ++) { int p = max_pos(val[i]+1,mx); pos[val[i]] = i; if(p == -1) dp[i] = val[i] * 1LL * (i-p); else dp[i] = dp[p] + val[i] * 1LL * (i-p); sum += dp[i]; } sum = 2*sum / ((n+1) * n); printf("%.6lf\n",sum); } return 0; }
点赞 评论

相关推荐

星辰再现:裁员给校招生腾地方
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务