POJ 3250 Bad Hair Day(单调栈)

题目地址:POJ 3250

初学单调栈。多校和网络赛已经碰到两次了。

单调栈的原理简单的不能再简单了。。就是让栈里的元素从栈顶到栈底呈单调性。

比如说递增单调栈。

每次放进一个数的时候,如果栈顶的数小于要放的数,就把栈顶的数pop出来使得栈里保持单调性。

对于这道题来说,就从右往左开始遍历,建一个递增单调栈。那么每次pop出来的就是当前的牛可以看到的牛数。然后累加即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <stack>
using namespace std;
#define LL long long
LL a[100000], dp[100000];
stack<int>q;
int main()
{
    int n, i, j;
    LL sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
    }
    memset(dp,0,sizeof(dp));
    for(i=n-1;i>=0;i--)
    {
        dp[i]=1;
        while(!q.empty()&&a[q.top()]<a[i])
        {
            dp[i]+=dp[q.top()];
            sum+=dp[q.top()];
            q.pop();
        }
        q.push(i);
    }
    /*for(i=0;i<n;i++)
    {
        printf("%d ",dp[i]);
    }*/
    printf("%lld\n",sum);
    return 0;
}
时间: 2024-12-26 15:25:07

POJ 3250 Bad Hair Day(单调栈)的相关文章

poj 3250 Bad Hair Day (单调栈)

Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14883   Accepted: 4940 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

poj 3250 Bad Hair Day 单调栈入门

Bad Hair Day 题意:给n(n <= 800,000)头牛,每头牛都有一个高度h,每头牛都只能看到右边比它矮的牛的头发,将每头牛看到的牛的头发加起来为多少? 思路:每头要进栈的牛,将栈顶比其矮的牛出栈,因为这些牛都没有机会看到更后面的牛了,所以出栈;这时加上栈中的元素个数即可: #include<iostream> #include<cstdio> #include<cstring> #include<string.h> #include&l

51nod 1215 数组的宽度&amp;poj 2796 Feel Good(单调栈)

单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath

poj 2796 Feel Good (单调栈)

Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9778   Accepted: 2652 Case Time Limit: 1000MS   Special Judge Description Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated

poj 2796 Feel Good(单调栈)

Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11148   Accepted: 3059 Case Time Limit: 1000MS   Special Judge Description Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated

poj 3250 Bad Hair Day(栈的运用)

http://poj.org/problem?id=3250 Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15985   Accepted: 5404 Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious abou

poj 3250 Bad Hair Day【栈】

Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15922   Accepted: 5374 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

[poj 2796]单调栈

题目链接:http://poj.org/problem?id=2796 单调栈可以O(n)得到以每个位置为最小值,向左右最多扩展到哪里. #include<cstdio> #include<algorithm> #include<stack> using namespace std; const int maxn=100005; int a[maxn]; int l[maxn]; int r[maxn]; long long pre[maxn]; stack< p

[单调栈] poj 3250 Bad Hair Day

题意: 一排母牛站成一排,给出牛的身高,每只牛都只能往右看,对于每只母牛有一个c[i] c[i]代表i能看见多少只牛,矮的牛看不见高的牛,问所有c[i]的和是多少. 思路: 我们转换一下,其实就是求对于每只母牛能被看见多少次,显然是对于它往左单调递增的牛都能看见它 那么我们维护一个这样的单调栈,每次都将小于等于它的出栈,那么栈中的元素的个数就是能看见它的个数 这样再把该元素插入栈就好了. 代码: #include"cstdlib" #include"cstring"