Problem F
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Some of Farmer John\'s N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows\' heads.
Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.
Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.
Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.
Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.
Input
The first line is the number of test cases T(T<=20).
For each of the test case:
Line 1: The number of cows, N.
Lines 2 Contains N integers that is the height of every cow from left to right.
For each of the test case:
Line 1: The number of cows, N.
Lines 2 Contains N integers that is the height of every cow from left to right.
Output
For each of the test case,output a single integer that is the sum of c1 through cN.
Sample Input
1 6 10 3 7 4 12 2
Sample Output
5
/*维护一个严格递减的栈,统计每个元素比他大的数的数量,相加求和即是答案*/
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<stack>
#define N 100005
using namespace std;
int main()
{
int n,t;
scanf("%d",&t);
for(int ca=1;ca<=t;ca++)
{
int a[N];
stack<int>s;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
s.push(a[1]); __int64 ans=0;
for(int i=2;i<=n;i++)
{
while(!s.empty() && s.top()<=a[i]) s.pop();
ans+=(__int64)s.size();
s.push(a[i]);
}
printf("%I64d\n",ans);
}
return 0;
}