BZOJ 1628 [Usaco2007 Demo]City skyline:单调栈

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1628

题意:

  

题解:

  单调栈。

  单调性:

    栈内元素高度递增。

    一旦出现比栈顶小的元素,则表明一栋房子的结束。

  入栈:

    如果出现了一个新的高度b(栈中没有),则入栈。

    表明从现在开始,一定有一栋高度为b的房子,只是我们不知道它在哪里结束而已。

  出栈:

    对于现在的高度b,将栈中所有高度 > b的元素都出栈。

    因为此时比b高的房子不得不结束。

    每出栈一个元素,ans++。

  注:最后要再多算一次b = 0,确保将最后一栋房子出栈。

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stack>
 5
 6 using namespace std;
 7
 8 int n,w;
 9 int ans=0;
10 stack<int> stk;
11
12 int main()
13 {
14     cin>>n>>w;
15     int a,b;
16     for(int i=0;i<=n;i++)
17     {
18         if(i<n) cin>>a>>b;
19         else b=0;
20         while(!stk.empty() && stk.top()>b)
21         {
22             stk.pop();
23             ans++;
24         }
25         if(stk.empty() || stk.top()!=b) stk.push(b);
26     }
27     cout<<ans<<endl;
28 }
时间: 2024-10-07 15:11:33

BZOJ 1628 [Usaco2007 Demo]City skyline:单调栈的相关文章

BZOJ1628: [Usaco2007 Demo]City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 256  Solved: 210[Submit][Status] Description The best part of the day for Farmer John's cows is when the sun sets. They can see the skyline of the distant city. Bessie w

bzoj 3238 [Ahoi2013]差异 后缀数组 + 单调栈

题目链接 Description 一个长度为\(n\)的字符串\(S\),令\(T_i\)表示它从第\(i\)个字符开始的后缀.求\[\sum_{1\leq i\leq j\leq n}len(T_i)+len(T_j)-2*lcp(T_i,T_j)\]其中,\(len(a)\)表示字符串\(a\)的长度,\(lcp(a,b)\)表示字符串\(a\)和字符串\(b\)的最长公共前缀. \(2\leq n\leq 500000\) 思路 \(O(n^2)\)枚举显然是不可行的,应从 贡献 的角度取

BZOJ 1695 [Usaco2007 Demo]Walk the Talk 链表+数学

题意:链接 方法:乱搞 解析: 出这道题的人存心报复社会. 首先这个单词表-先上网上找这个单词表- 反正总共2265个单词,然后就考虑怎么做就行了. 刚开始我没看表,找不到怎么做,最快的方法我也只是想到了类n^6的做法. 然后我就卡关辣,这关怎么过! 神犇的方法是:观察表,发现规律: 发现表中的单词最长就是4个字母. 所以我们可以考虑求1,2,3,4长度的单词数. 1的话可以直接记录,扫的时候顺带加上就行. 然后神犇说了一句话: 表中长度为4的单词前两个字母相同的单词个数不超过35个. 长度为3

BZOJ 2286 SDOI2011 消耗战 倍增LCA+单调栈

题目大意:给定一棵树,边上有边权,m次询问,每次选定一些关键点,求将1号节点与所有关键点都切断所需的最小花销 关键点的总数<=50W 首先我们考虑暴力想法 令f[x]表示切断以x为根的子树中所有关键点的最小花销 g[x]表示x是不是关键点 那么对于x的每个子节点y有f[x]=Σmin(g[y]?INF:f[y],Distance(x,y) ) 这样每次暴力做一遍树形DP,时间复杂度是O(n*m)的 现在由于每次询问的点数不一定会达到n的级别,对所有节点进行DFS非常浪费 我们可以将询问的关键点拿

BZOJ 1629: [Usaco2007 Demo]Cow Acrobats

Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the trapeze (and their last attempt at firing a cow out of a ca

BZOJ 1693 [Usaco2007 Demo]Asteroids 最大流

题意:链接 方法:最大流 解析: 这题总感觉看到过. 然后其实这就是个二分图最大匹配问题. 建立源点到每个行有流量为1的边. 对于坏点来说,该坏点所在的行与该坏点所在的列间有一条流量为1的边. 每一列到汇点有流量为1的边. 就可以用最大流来解这个匹配了. 代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>

[Usaco2007 Demo][BZOJ1628] City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 320  Solved: 260[Submit][Status][Discuss] Description Input 第一行给出N,W 第二行到第N+1行:每行给出二个整数x,y,输入的x严格递增,并且第一个x总是1 Output 输出一个整数,表示城市中最少包含的建筑物数量 Sample Input 10 26 1 1 2 2 5

BZOJ_1628_[Usaco2007_Demo]_City_skyline_(单调栈)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1628 给出\(n\)个距形的影子,问最少是多少个建筑的?(建筑的影子可以重叠). 分析 用单调栈维护一下. 栈内是可能"延续"到当前位置的之前的影子.那么显然比当前位置高的不可能.如果有和当前位置等高的影子,就延续过来,就可以少一个建筑,否则,就向栈里加入当前位置高度的影子. 1 #include <bits/stdc++.h> 2 using namespace st

小结:单调栈 &amp; 单调队列

概要: 对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列. 技巧及注意: 技巧很多,只要能将问题转化为单调性问题,就好解决了. 当维护固定长度的单调区间,我们考虑用单调队列,如[BZOJ]3314: [Usaco2013 Nov]Crowded Cows(单调队列) 单调栈维护长度时要进行及时更新,例如:[BZOJ]3039: 玉蟾宫(DP/单调栈) 假设完美状态后再进行减法原理,例如:[BZOJ]1628 && 1683: [Usaco