51nod 1215 数组的宽度
2017-10-28 19:37
162 查看
N个整数组成的数组,定义子数组a[i]..a[j]的宽度为:max(a[i]..a[j]) - min(a[i]..a[j]),求所有子数组的宽度和。
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000) 第2 - N + 1行:每行1个数,表示数组中的元素(1 <= A[i] <= 50000)Output
输出所有子数组的宽度和。Input示例
5 1 2 3 4 5Output示例
20
————————————————————————————
这题单独考虑mx的和 和 mn的和
开两个单调栈就可以了23333
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=50007,inf=0x3f3f3f3f; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,w1[M],w2[M]; int sk1[M],tp1,sk2[M],tp2; LL mx,mn; int main() { n=read(); for(int i=1;i<=n;i++) w1[i]=w2[i]=read(); n++; w1 =inf; w2 =-1; for(int i=1;i<=n;i++){ while(tp1&&w1[i]>=w1[sk1[tp1]]) mx+=1LL*w1[sk1[tp1]]*(i-sk1[tp1])*(sk1[tp1]-sk1[tp1-1]),tp1--; while(tp2&&w2[i]<=w2[sk2[tp2]]) mn+=1LL*w2[sk2[tp2]]*(i-sk2[tp2])*(sk2[tp2]-sk2[tp2-1]),tp2--; sk1[++tp1]=sk2[++tp2]=i; } printf("%lld\n",mx-mn); return 0; }View Code
相关文章推荐
- 51Nod-1215-数组的宽度
- 51nod-1215 数组的宽度(单调栈)
- [分治 || 单调栈 单调队列] 51Nod 1215 数组的宽度
- 51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)
- 51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)
- 51nod 1215 数组的宽度
- 【分治计数|单调栈】51Nod 1215 数组的宽度
- 51Nod - 1215 数组的宽度 思维+单调栈
- 51nod 1215:数组的宽度 单调栈
- 51nod 1215 数组的宽度
- 51nod 1215 数组的宽度(单调栈)
- 51 Nod 1215 数组的宽度(单调栈)
- 1215 数组的宽度
- 51nod 1001 数组中和等于K的数对(二分)
- 51NOD 1210 矩阵查询 【线段树/树状数组】
- 51nod 1050 循环数组最大子段和 (dp)
- 51nod 1001 数组中和等于K的数对
- 18.把1~100存到一维数组a[100]中,并输出。要求每行输出10个,数据所占宽度相同。
- 【排序】51NOD 1001-数组中和等于K的数对
- 51nod 1215 单调栈/迭代