标签:pre right totalStrength leetcode2281 巫师 st int 管辖 力量
思路:
单调栈计算出每个数字的“管辖范围”,再对每个“管辖范围”单独计算并求和。
实现:
1 class Solution { 2 public: 3 int totalStrength(vector<int>& a) { 4 int n=a.size(); 5 vector<int>left,right; 6 stack<int>st; 7 st.push(-1); 8 for(int i=0;i<n;i++){ 9 while(st.top()>=0 and a[i]<=a[st.top()]){ 10 st.pop(); 11 } 12 left.push_back(st.top()); 13 st.push(i); 14 } 15 while(!st.empty())st.pop(); 16 st.push(n); 17 for(int i=n-1;i>=0;i--){ 18 while(st.top()<n and a[i]<a[st.top()]){ 19 st.pop(); 20 } 21 right.push_back(st.top()); 22 st.push(i); 23 } 24 reverse(right.begin(),right.end()); 25 int mod=1e9+7; 26 int res=0; 27 vector<long long>pre(n+1,0); 28 for(int i=0;i<n;i++){ 29 pre[i+1]=(pre[i]+a[i])%mod; 30 } 31 vector<long long>prepre(n+2,0); 32 for(int i=1;i<=n;i++){ 33 prepre[i+1]=(prepre[i]+pre[i])%mod; 34 } 35 for(int i=0;i<n;i++){ 36 int l=left[i]+1; 37 int r=right[i]-1; 38 int tmp=(prepre[r+2]-prepre[i+1]+mod)%mod*(i-l+1)%mod; 39 int tmp2=(prepre[i+1]-prepre[l]+mod)%mod*(r-i+1)%mod; 40 res=(res+(long long)a[i]*(tmp-tmp2+mod)%mod)%mod; 41 } 42 return res; 43 } 44 };
标签:pre,right,totalStrength,leetcode2281,巫师,st,int,管辖,力量 来源: https://www.cnblogs.com/wangyiming/p/16320937.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。