• P2866 [USACO06NOV]糟糕的一天Bad Hair Day


    ---------------------------------------------------

    题目链接:Miku

    ---------------------------------------------------

    这道题看第一眼可能想到暴搜,从每个点开始向右找到第一个大于它的点并且计算距离

    然而绝对会TLE

    ---------------------------------------------------

    这时候我们就要找到一个数据结构了——单调栈。

    单调栈,顾名思义,就是和单调队列一样的东西。只不过一个是栈,一个

    是队列

    (不知道单调队列是什么:

    所谓单调,就是里面的元素都是按照某一关键字递增或递减。那么,我们怎样实现单调栈呢?
    ---------------------------------------------------

    比如说我们要建立一个元素递增的栈,首先,我们在放入每一个元素时要进行判断,如果这个元素大于栈顶元素,我们就把它压进去

    反之,如果我们直接压进去们就会破坏单调性,那么我们就需要不断地弹出栈顶元素,直到栈为空或符合第一条。

    ---------------------------------------------------

    再来看一看代码(主要看注释)

     1 #include<iostream>
     2 #include<stack>
     3 #include<bits/stdc++.h>
     4 using namespace std;
     5 long long ans;
     6 stack <int> s;
     7 int n;
     8 int now;
     9 int main(){
    10     cin>>n; 
    11     for(int i=1;i<=n;++i)
    12     {
    13         cin>>now;
    14         if(!s.size())//特判(好像不用?) 
    15         {
    16             s.push(now);
    17             continue;
    18         }
    19         else{
    20         while(s.size()&&s.top()<=now)//这是单调栈 
    21         s.pop();
    22         ans+=s.size();//计算答案 
    23         //只要这个新元素小于栈顶,它就必然小于栈内的每个元素
    24         //所以我们把栈的大小加给答案即可 
    25         }
    26         s.push(now);
    27     }
    28     cout<<ans;
    29     return 0;
    30 }
    Ac
  • 相关阅读:
    颠覆C#王权的“魔比斯环” — 实现AOP框架的终极利器
    使用.Net的CodeDOM技术实现语言无关的Code Wizard
    拆半查找的递归和非递归算法
    使用wxWidgets for C++从资源文件中静态装载图像
    全排列算法原理和实现
    得到第K个大的数算法研究
    用C#2.0实现网络蜘蛛(WebSpider)
    Php实现Js的escape方法
    google map 获取 地理定位
    将sqlserver表中的数据导出sql语句(转)
  • 原文地址:https://www.cnblogs.com/For-Miku/p/11234183.html
Copyright © 2020-2023  润新知