这道题提供了一个特别新奇的思路,单调栈!
今天刚考完数算实习,跪得一塌糊涂,满脑子都是线段树树状数组,考完试周围的竞赛爷一直在讨论什么kd树,什么状态压缩什么的完全听不懂,我还是默默准备我的数算考试吧。
单调栈就是维护一个单调的栈,我们在本题中要求的不是每一头奶牛能看到多少个头,而是每个奶牛的头会被多少其他的奶牛看到,因此我们每次读入一个高度,就与栈顶的数字进行比较,如果比栈顶数字大,那么就一直弹出栈中元素直到可以栈顶元素比自己大为止,此时栈中的元素数量-1就是我们要求的能看到这头奶牛的头顶的奶牛的数量,求和即可。
另外数值较大要使用long long
#include<iostream>
#include<cstdio>
#include<stack>
#include<memory.h>
using namespace std;
#define maxn 8005
int main(){
int n;
long long int sum=0;
scanf("%d",&n);
stack<int> cow;
for(int i=0;i<n;++i){
int d;
scanf("%d",&d);
while(!cow.empty() && cow.top()<=d)
cow.pop();
cow.push(d);
sum += cow.size()-1;
}
printf("%lld\n",sum);
//system("pause");
return 0;
}