
栈
文章平均质量分 54
f_zyj
一个追逐蝴蝶的人!
展开
-
51Nod-1289-大鱼吃小鱼
有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼? Input 第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。 第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动原创 2016-05-16 20:27:46 · 1479 阅读 · 0 评论 -
HDU-2017 多校训练赛2-1008-To my boyfriend
ACM模版描述题解给定一个矩阵,求任选一个子矩阵的所拥有的不同颜色的期望个数。大致就是这么个意思。这里我们换位思考,可以考虑为求每一种颜色的贡献次数,也就是每一个颜色所出现的产生贡献的子矩阵个数。最后将所有颜色的贡献之和除以所有的子矩阵数目就是结果。至于怎么求贡献,可以去参考一下 RJ28 大佬的这篇博客,感觉比官方题解的思路好一些,容易理解一些。这里单调栈的应用实在是不错,代码也更加简单一些。感觉原创 2017-08-06 19:08:58 · 503 阅读 · 0 评论 -
51Nod-1962-区间计数
ACM模版描述题解官方题解: 代码#include <iostream>#define mp make_pairusing namespace std;typedef long long ll;typedef pair<int, int> pii;template <class T>inline void scan_d(T &ret){ char c; ret = 0;原创 2017-07-08 16:49:44 · 1285 阅读 · 4 评论 -
51Nod-1437-迈克步
ACM模版描述题解单调栈问题,直接一遍单调栈求出来每一个数作为最小值的区间范围,根据范围大小进行更新结果。一开始我求出来每个值作为最小值的区间范围大小 xx 后,我用了一个循环让他更新从 1∼x1 \sim x 的所有值,然后 TLE 了,后来发现,其实我们完全不用酱紫的,只要更新一下 xx 的值,因为我们可以保证,最后输出的序列是一个单调不递增的序列,如果宽度为 xx 的最大力量为 yy,那么宽度原创 2017-06-25 15:52:03 · 570 阅读 · 0 评论 -
51Nod-1423-最大二"货"
ACM模版描述题解正反向单调递减栈搞一遍即可。因为在单调递减栈的求解过程中,每一次 push 值时都保证 push 前的 top 值大于要 push 的值,并且中间所有的数小于要 push 的值和 push 前的 top 值,所以呢,这两个值刚刚是该区间的最大和次大值,异或求最即可,当然还要反向搞一下,依然是递减栈。这里再说一点,如果是单调递增栈的话,那么这两个值就是最小和次小值,不错的性质哦……代原创 2017-06-23 23:23:58 · 353 阅读 · 0 评论 -
51Nod-1403-有趣的堆栈
ACM模版描述题解按照我的思路,这里我们首先通过第二个方法恢复到原序列,接着呢,就是按照一方法遍历一遍即可。这里我们很容易想到,我们需要用到递归来恢复序列,那么怎么递归呢?仔细观察可以发现,方法二表示这个 pop 元素被压上了几个,那么我们可以将序列划分为两部分进行递归,一个是在该元素下的,一个是在该元素上的,所以呢,当我们处理过前者后,需要对该元素进行一次 push 操作,当我们处理过后者后,需要原创 2017-06-21 18:11:31 · 505 阅读 · 0 评论 -
蓝桥-ALGO-16-进制转换
ACM模版描述题解这个题让我更加深刻的认识到了取模与取余……以前总是以为取模就是取余,取余就是取模,谁成想原来这两个竟然不一样,而不一样的地方主要是体现在对负整数的除法运算有些许差异。经过查阅资料发现,不论是取余还是取模,都涉及到两个过程(r=a%br = a \% b): 1、求整数商:c=a/bc = a / b 2、计算模或者余数:r=a−c∗br = a - c * b 在取余过程中,原创 2017-06-02 22:14:06 · 441 阅读 · 0 评论 -
51Nod-1574-排列转换
ACM模版描述题解这个题是 CF 的一个题,但不是原题,题目弱化了,数据强化了,一开始想着一个经典算法——使序列有序的最少交换次数,可是意志不坚定的我还是点开了评论区,发现这个要用贪心写,可是发现写来写去就是过不去,一直 TLE,后来用栈写(代码 One),需要右移的入栈,遇见左移的时候出栈交换移动,可是最后依然是 TLE 了……后来我佐学姐用使序列有序的最少交换次数的代码的变种(代码 Two)提交原创 2017-05-19 21:14:42 · 890 阅读 · 2 评论 -
51Nod-1349-最大值
ACM模版描述题解和 51Nod 1215 数组的宽度 几乎一毛一样,不过这个只需要求一下每个数作为最大值的左右区间范围,单调栈搞一遍就行了!最后再求一个前缀和就没毛病了。我没有加输入输出优化,险过,差点超时,如果将左右区间的求解用两次单调栈求的话,说不定就超时了,所以这里需要注意的是如果超时了,记好输入输出优化……外挂走起!建议将这道题和 数组的宽度 一题放在一起做,写出一个代码来,另一个只是稍加原创 2017-05-19 15:02:49 · 521 阅读 · 0 评论 -
2016河南ACM省赛-A-表达式求值
描述假设表达式定义为: 1. 一个十进制的正整数X是一个表达式。 2. 如果X和Y是表达式,则X + Y, X * Y也是表达式;优先级*高于+。 3. 如果X和Y是表达式,则函数Smax(X, Y)也是表达式,其值为:先分别求出X,Y值的各位数字之和,再从中选最大值。 4. 如果X是表达式,则(X)也是表达式。 例如: 表达式 12*(2+3)+Smax(333,220+28原创 2016-06-07 18:05:54 · 2784 阅读 · 9 评论 -
51Nod-1215-数组的宽度
ACM模版描述题解在讨论区中,夹克老师讲得十分透彻了,我也不再做那么详细赘述了,大致的分析一下,根据夹克老师的说法,用单调栈分别求出来一个数作为最大值和最小值的贡献区间,也就是说求出这个数作为最大或者最小的值时能往前往后延伸的长度,最后根据乘法原则就能求出来每个数贡献的区间数目。先单调递减栈搞一遍,求出每一个数作为最大值所覆盖的前后范围,然后再单调递增搞一遍,求出每一个数作为最小值所覆盖的前后范围,原创 2017-04-03 21:56:05 · 849 阅读 · 0 评论 -
51Nod-1821-最优集合
ACM模版描述题解这道题属于一道模拟问题吧,如果没有定义错模拟这个词的话。看到讨论区中有一个 ID 为 zhenhao 的大牛,写了十分详细的题解,我也是看了人家的思路才写的代码,像这种模拟的问题,需要注意的就是思路一定要清晰,把情况考虑周全了,不然很容易错,我就是少考虑一种情况,一直错。繁琐的循环判断有机的组合在一起,最后达到 O(T*(M+N)) 的复杂度还不行,还需要进行剪枝,break 或者原创 2017-03-14 01:02:43 · 655 阅读 · 0 评论 -
51Nod-1255-字典序最小的子序列
ACM模版描述题解这道题大致思路不难,但是细节问题颇多,用两种方法解题。第一种,遍历原串,如果答案串中没有则往答案串中插入,如果答案串中第i个等于它,并且该字母往后查有第j个比他小,并且保证i和j之间的字母在原串中依然存在(保证可以被替换掉),则删除第i个,后续向前迁移1,并在结尾处插入该字母。第二种是利用栈原理实现,具体思路注释很清晰,可以仔细研究一下。第二种较第一种效率略微高一些。代码One:#原创 2016-08-29 18:59:17 · 3895 阅读 · 1 评论 -
51Nod-1102-面积最大的矩形
ACM模版描述题解类似于在(某一区间中最小值*此区间所有元素之和)最大的问题,这里是(某一区间中最小值*此区间宽度)最大的问题。 此类问题可以使用单调栈来实现,使问题可以在O(N)的复杂度中解决。 不管是单调递增还是递减均可,这里使用的是单调递减栈。代码#include <iostream>#include <cstdio>#include <stack>typedef long long原创 2016-08-07 18:29:55 · 765 阅读 · 0 评论 -
关于爆栈问题——手动加栈
今天忽然遇见了一行很牛逼的代码:#pragma comment(linker, “/STACK:1024000000,1024000000”) 据说是手动加栈的,作为小白的我自然是只好各种查资料。然后牵扯到了很多基础概念,C、C++、GCC、G++、把我搞得晕头转向,都分不清谁是谁了。 经查阅资料: G++和C++都是C++语言的编译器,二者基本相同。 而GCC和C都是C语言编译器,而这差别原创 2016-05-21 03:23:28 · 10748 阅读 · 10 评论 -
NYOJ-35-表达式求值
描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)输入 第一行输入一个整数n,共有n组测试数据(n<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结原创 2016-05-26 19:30:48 · 6142 阅读 · 3 评论 -
Vijos-P1062-迎春舞会之交谊舞
描述: 明显…交谊舞是两个人跳的,而且是一男一女-_-|||…… 由于交谊舞之前的节目安排,所有表演者都要站成一排,这一排人的顺序满足两点。 1⃣️:对于一对舞伴,男生站在女生的左边。 2⃣️:任何一对舞伴之间,要么没有人,要么有若干对舞伴。 排得过于整齐导致那些要表演的人都没办法找到自己的舞伴,怎么办呢? 所幸的是,SDFZ的女生比男生聪明得多,他们知道自己左边有几个男生。现在就请你告原创 2016-04-14 02:54:42 · 1387 阅读 · 0 评论 -
NYOJ-2-括号配对问题
描述 现在,有一行括号序列,请你检查这行括号是否配对。输入 第一行输入一个数N(0 < N <= 100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符输出 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则原创 2016-05-10 04:21:42 · 887 阅读 · 0 评论 -
51Nod-1952-栈
ACM模版描述 题解像这种问题,很明显是单调栈,不过这里的单调栈有些差异,因为栈本身不是正常的栈,出只能尾出,入则可以首尾入,那么维护单调栈时,我们一样无法只从一个方向进行维护,但是可以肯定的是我们只需要维护一个加强版单调栈就好了。这里维护一个单调递增栈,当加入操作是从尾部加入时,我们从单调递增栈的栈顶进行添加,不过添加规则是大于栈顶方可添加;当加入操作是从头部加入时,我们从但带哦递增栈的栈底进行原创 2017-09-13 20:36:15 · 528 阅读 · 0 评论