zoukankan      html  css  js  c++  java
  • POJ 3250 Bad Hair Day(DP / 单调栈)

    Bad Hair Day

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

    #include <stdio.h>
    #include <string.h>
    #define N 80001
    long 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
    ",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
    ", ans);
        return 0;
    }
    单调栈
  • 相关阅读:
    js中“==”与“===”区别
    java中的除法及求余运算特殊性。
    oracle数据库查询历史某一时刻的表数据
    Java多线程总结(转载)
    I/O之Writer-Reader
    I/O之File
    MYSQL之內链接 左链接 右链接 区别
    ubuntu下编译boost
    linux下编译安装boost库
    搭建无线弱网测试环境
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3386849.html
Copyright © 2011-2022 走看看