Topic 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.
Consider this example:
=
= =
= - = Cows facing right -->
= = =
= - = = =
= = = = = =
1 2 3 4 5 6 Cow#1 can see the hairstyle of cows #2, 3, 4
Cow#2 can see no cow's hairstyle
Cow#3 can see the hairstyle of cow #4
Cow#4 can see no cow's hairstyle
Cow#5 can see the hairstyle of cow 6
Cow#6 can see no cows at all!
Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.
Farmer John's certain N (1 < N < 80000) cows are having a hair festival! Since every cow is aware of its messy hairstyle, John wants to count the number of cows who can see the hair of other cows.
Each cow i has a height. All N cows are lined up facing east, cow N is at the front, and cow 1 is at the back. Cow i can see the heads of those cows in front of her, as long as those cows have The height is strictly less than her height, and there are no cows in between that are taller or equal to hi.
Let N denote the number of cows whose hairstyle can be seen by the ith cow; please output the sum of Ci
Input and output format
Input format:
Line 1: The number of cows, N.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.
Output format:
Line 1: A single integer that is the sum of c1 through cN.
Input and output example
6 10 3 7 4 12 2
5
As long as you can see that it is a monotonic stack
, the problem is done
#include<cstdio> #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) #define LL long long char buf[1<<21],*p1=buf,*p2=buf; const int MAXN = 80001; inline LL read() { char c = getchar(); LL x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();} return x * f; } LL a[MAXN]; int Ans[MAXN], s[MAXN]; int N, top = 0; int main() { N = read(); for(int i = 1; i <= N; i++) a[i] = read(); s[0] = N + 1; LL ans = 0; for(int i = N; i >= 1; i--) { while(top > 0 && a[i] > a[ s[top] ]) top--; ans += (s[top] - i - 1); s[++top] = i; } printf("%lld", ans); return 0; }