正题
题目大意
0∼n0\sim n0∼n的点,从iii移动到jjj获得aj∗(j−i)a_j*(j-i)aj∗(j−i)的价值。求最大价值。
解题思路
考虑贪心,每次移动到往后aia_iai最大的点。
证明:
反证明:我们假设有一种情况i<ji<ji<j且aj<aia_j<a_iaj<ai但是之间移动到jjj比先移动到iii更优。
但是若我们先移动到iii之后在移动jjj权值为i∗ai+(j−i)∗aji*a_i+(j-i)*a_ji∗ai+(j−i)∗aj而之间移动到jjj权值为j∗ajj*a_jj∗aj。两个抵消掉(j−i)∗aj(j-i)*a_j(j−i)∗aj的部分就是i∗aii*a_ii∗ai和i∗aji*a_ji∗aj。因为ai>aja_i>a_jai>aj所以先移动到iii更优。
此情况不存在
证毕
所以我们预处理后缀maxmaxmax就好了
codecodecode
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int n,a[N],maxs[N],ans,last;
int main()
{freopen("game.in","r",stdin);freopen("game.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=n;i>=0;i--)maxs[i]=max(maxs[i+1],a[i]);last=0;for(int i=1;i<=n;i++){if(a[i]==maxs[last+1]){ans+=(i-last)*a[i];last=i;}}printf("%d",ans);
}