Luogu P2866 [USACO06NOV] Bad Hair Day (Monotone Stack)

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

Input Example #1:  Copy
6
10
3
7
4
12
2
Output Sample #1:  Copy
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;
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325018862&siteId=291194637