目录
显示
题目链接
https://www.luogu.org/problem/P2866
http://poj.org/problem?id=3250
题解
我们可以维护一个单调递减栈来解决问题(何谓单调栈?就是满足栈内元素单调递增或递减的栈)。每次插入一个元素时,如果栈顶元素小于要插入的元素,就将栈顶弹出,直到栈顶元素严格大于要插入的元素为止,此时栈内元素的个数即为 \(c_i\) 的值。
将操作重复 \(n\) 次,即可算出结果。
#include <iostream> #include <algorithm> using namespace std; int a[80005],st[80005],t; long long sum; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; while(t&&st[t]<=a[i])//将所有会挡住的牛都出栈 t--; sum+=t;//累加结果 st[++t]=a[i];//入栈操作 } cout<<sum; return 0; }