题目链接:
题意:
分析:
计算出每一个数字作为最大值,最小值的范围;
然后结果就是乘法原理,因为,左右端点可以任意组合;
1 #include2 3 using namespace std; 4 5 int n; 6 const int maxn = 5e4+10; 7 struct num { 8 long long value; 9 int maxleft,maxright;10 int minleft,minright;11 num():maxleft(1),maxright(1),minleft(1),minright(1){}12 }a[maxn];13 14 stack > S;15 16 17 void getMax()18 {19 while(!S.empty())20 S.pop();21 S.push(make_pair(a[0].value,0));22 for(int i=1;i =a[i].value) {51 //int value = S.top().first;52 int key = S.top().second;53 S.pop();54 55 a[i].minleft +=a[key].minleft;56 if(!S.empty()) {57 a[S.top().second].minright +=a[key].minright;58 }59 }60 S.push(make_pair(a[i].value,i));61 }62 while(!S.empty()) {63 int key = S.top().second;64 S.pop();65 if(!S.empty()) {66 a[S.top().second].minright +=a[key].minright;67 }68 }69 }70 71 int main()72 {73 74 scanf("%d",&n);75 for(int i=0;i