POJ 3250 Bad Hair Day(DP / 单调栈)

来源:互联网 发布:淘宝bin牙齿矫正器 编辑:程序博客网 时间:2024/06/03 13:55

Bad Hair Day

 

开个标记数组记录,记录右边第一个比它大的位置。

#include <stdio.h>#include <string.h>#define N 80001long long p[N],left[N],sum;int main(){    int n,i,j;    scanf("%d",&n);    for(i = 1; i <= n; i++)        scanf("%lld",&p[i]);    sum = 0;    for(i = n; i >= 1; i--)    {        j = i+1;        while(j <= n && p[j] < p[i])        {            j = left[j];        }        left[i] = j;        sum += j-i-1;    }    printf("%lld\n",sum);    return 0;}
DP

 

单调栈:

给出这些牛的高度,要求每头牛可以看到的牛的数量的和。

把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。

从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量。把这个数量加在一起,就可以得到最后的答案了。

#include <iostream>#include <cstdio>using namespace std;const int N = 80005;int stack[N];int top, n;int main(){    int num;    long long ans = 0;    scanf("%d", &n);    for (int i = 0; i < n; ++i)    {        scanf("%d", &num);        while (top > 0 && stack[top - 1] <= num)            --top;        ans += top;        stack[top++] = num;    }    printf("%lld\n", ans);    return 0;}
单调栈

 

 

0 0