我亲爱的小同学们,这其实是个脑筋急转弯…… - -|||
一个位置的液柱高度只取决于三个因素:左边最高多高、右边最高多高、底多高。
所以,O(n)扫描记录一下前两个参数,然后直接算就行……

        int n=arr.size();
        auto lm=new int[n+10];lm+=1;
        auto rm=new int[n+10];rm+=1;
        lm[-1]=rm[n]=0;
        for (int i=0;i<n;++i)
        {
            lm[i]=max(lm[i-1],arr[i]);
            rm[n-i-1]=max(rm[n-i],arr[n-i-1]);
        }
        long long  res=0;
        for (int i=0;i<n;++i)
            res+=max(0, min(lm[i-1],rm[i+1])-arr[i]  );