单调栈+贪心维护LIS】的更多相关文章

普通:O(\(N^2\)) 状态:dp[j]表示,以j结尾的最长的上升子序列 转移:dp[j]=dp[i]+1(if a[j]>a[i] ) 初始化:dp[i]=1 优化(nlogn) solution:维护stack[top]表示长度为top的最长子序列结尾最小的是stack[top] 贪心+dp code: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&g…
描述 Given an N-digit number, you should remove K digits and make the new integer as large as possible. 输入 The first line has two integers N and K (1 ≤ K<N≤500000).The next line has a N-digit number with no leading zero. 输出 Output the largest possible…
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 Solution 显然 \(f[1]=1\),考虑所有满足 \(f[x]=1\) 的位置 \(b_1,\dots,b_k\),一定有 \(p_{b_1}>p_{b_2}>\dots >p_{b_k}\) 由于 \(b_1=1\),我们要最小化 \(p_1\),所以填入 \(p_{b_i}=…
Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 548D Appoint description:  Description Mike is the president of country What-The-Fatherland. There are n bears living in thi…
3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1561  Solved: 734[Submit][Status][Discuss] Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N<=500000,S由小写英文字母组成 Source Solution 后缀数组+单调栈…
单调栈: 维护一个单调栈 A Famous City Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1671    Accepted Submission(s): 644 Problem Description After Mr. B arrived in Warsaw, he was shocked by the skyscrap…
Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14883   Accepted: 4940 Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants…
[BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的东西 那么,对于每一个已经固定好的左下角 我们可以通过单调栈来维护答案 既然只有左下角对右上角会产生贡献 那么,按照\(x\)轴排序之后可以\(CDQ\)分治 \(CDQ\)分治怎么搞? 如果在上面的基础上多了几个点.. 那几根棕色的线链接的连是不能贡献答案的 我们来看看: 这些点的\(y\)轴都在…
[BZOJ1007]水平可见直线(单调栈) 题解 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线. Input 第一行为N(0 < N < 50…
Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a specified heig…
Description 原题链接 给你一个长度为\(n\)的排列\(~P\),定义一段子区间是好的,当且仅当这个子区间内的值构成了连续的一段.例如对于排列\(\{1,3,2 \}\),\([1, 1], [2, 2], [3, 3], [2, 3], [1, 3]\)是好的区间. 共\(q\)次询问,每次询问\(L,R\), 求有多少\(L \leq l \leq r \leq R\),满足\([l, r]\)是好的区间.\(1 \leq n, q \leq 1.2 \times 10 ^ 5\…
题目大意 给你接下来每一天的气温,求出对于每一天的气温,下一次出现比它高气温的日期距现在要等多少天 解题思路 利用单调栈,维护一个单调递减的栈 将每一天的下标i入栈,维护一个温度递减的下标 若下一个温度p,比栈顶元素对应的温度p'要高,就出栈,且p就是p'的最近的“高温” 代码实现 from collections import deque class Solution: def dailyTemperatures(self, temperatures): ans = [0]*len(tempe…
原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次数的平方和. $|s|\leq 10^5$ 题解 首先,这一题用 SAM 做就是模板题,比较简单. 但是,本着练一练 SA 的心态,我开始了 SA+单调栈 的苦海. 真毒瘤. 这里讲一讲 SA 的做法,也是经典的做法. SA 闭着眼睛先写了再说. 首先,我们考虑出现次数大于 $1$ 次的子串. 考虑…
题目链接:https://cn.vjudge.net/problem/Gym-100971D 题目大意:给你n个城市的信息,每一个城市的信息包括坐标和人数,然后让你找每一个城市的父亲,作为一个城市的父亲具体满足的条件是:作为父亲的城市的坐标和当前城市的人数最多,,如果有多个满足的城市,则和原来的点相隔最近的作为父亲. 具体思路:首先,题目中说坐标和人数是不会有相同的值,所以我们对于每一个点,按照x轴进行排序之后,找出当前点的左边的第一个人数大于当前点的,然后再找出当前点的右边的第一个人数大于当前…
题目大意:给定一个由 N 个数组成的序列,求以每个序列为基准,向右最大有多少个数字都比它小. 单调栈 单调栈中维护的是数组的下标. 单调栈在每个元素出栈时统计该出栈元素的答案贡献或对应的值. 单调栈主要应用于区间最值的贡献问题. 代码如下 #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn=8e4+10; const int inf=0x…
本来实在做后缀数组的题目的,不巧,碰到了pku3415这题,需要用到单调栈来维护,但是之前又没有学习过单调栈这方面的知识,于是水了几题....... 题意:给你一些连续的小矩形,高宽不定,求最大的矩形面积........ 思路:直接用单调栈,当有一个矩形的高小于等于栈顶元素的高时,出栈,并维护这个即将入栈的元素的向前延伸的宽度范围,维护出栈后的栈顶元素向后延伸的宽度范围....... #include<iostream> #include<stack> #include<st…
题目大意 定义字符串T的子串T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. 给定两个字符串A和B,定义集合S为S = {(i, j, k) | k≥K, A(i, k)=B(j, k)}. 对于给定的字符串A和B,求出满足要求的集合S的大小. 题目分析 就是求A和B中有多少个不同的起始位置A(i),B(j)和长度k的组合,使得子串A(i),A(i+1)....A(i+k-1)和子串B(j),B(j+1)....B(i+k-1)相同.     艾玛..这种奇葩的字符…
这几天的知识学习比较多,因为时间不够了.加油吧,为了梦想. 这里写几条简单的单调栈作为题解记录,因为单调栈的用法很简单,可是想到并转化成用这个需要一些题目的积淀. 相关博客参见:https://blog.csdn.net/wubaizhe/article/details/70136174 POJ 3250 Bad Hair Day 题意与分析 题意是这样的:\(n\)个牛排成一列向右看,牛\(i\)能看到牛\(j\)的头顶,当且仅当牛\(j\)在牛\(i\)的右边并且牛\(i\)与牛\(j\)之…
首先我们可以枚举每个一点,然后向下一直拓展到不能拓展为止,然后向下拓展的同时我们可以算出来向左最多拓展的个数,用单调栈来维护一个上升的序列,这样就类似与悬线法找最大01子矩阵了,但是对于这题01交替来说,好多细节比较麻烦,所以我们可以采用另一种转换方法,对于一个01矩阵来说,一定满足一下两个条件中的一个: 1:矩阵中所有0的点(i,j),i与j的奇偶相同,且对于所有1点(i,j),i与j的奇偶不同. 2:矩阵中所有0的点(i,j),i与j的奇偶不同,且对于所有1点(i,j),i与j的奇偶相同.…
题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之间的连续部分 维护一个单调栈,维护对于当前位置(右下角位置)可取的前面的一系列的左上角位置. 因为向右移动时新加进来一个较低的会将之前高的削低,即会修改之前栈中可行的点的高度,所以本题中仅维护位置是不够的,需要维护位置\(c\)和高度\(h\)两个属性. 注意到,\(c\)显然是单调增的,单调栈维护…
农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都 意识到自己凌乱不堪的发型, FJ 希望统计出能够看到其他牛的头发的牛的数量. 每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成 一排(在我们的图中是向右).因此,第i头牛可以看到她前面的那些牛的头, (即i+1, i+2,等等),只要那些牛的高度严格小于她的高度. 例如这个例子: = = = = = = - = 牛面向右侧 --…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目的意思其实就是要找到一个尽可能大的矩形来完全覆盖这个矩形下的所有柱子,只能覆盖柱子,不能留空. 我们求得的面积其实就是Max{s=(right[i] - left[i] + 1)*height[i];(i>=1&&i<=n)} 每一个柱子都要尽可能向左向右延伸,使得获得最大的面积. 此时我就要用到单调栈 单调栈就是栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作.…
题意: 析:利用单调栈,维护一个单调递增的栈,首先在最低的平台开始,每次向两边进行扩展,寻找两边最低的,然后不断更新宽度. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream>…
Description 我们将矩阵A中位于第i行第j列的元素记作A[i,j].一个矩阵A是酷的仅当它满足下面的条件:       A[1,1]+A[r,s]<=A[1,s]+A[r,1](r,s>1)其中r为矩阵A的行数,s为矩阵A的列数.进一步,如果一个矩阵是非常酷的仅当它的每一个至少包含两行两列子矩阵都是酷的.你的任务是,求出一个矩阵A中的一个非常酷的子矩阵B,使得B包含最多元素. Input 第一行包含两个整数R,S(2<=R,S<=1000),代表矩阵的行数与列数.接下来R…
题意: 给你一个A数列,让你求一个单调递增的B数列(0<=bi<=1),使得sum{(ai-bi)^2}最小. 思路: 很明显,如果A = 0...01...1,那么bi=ai即可. 可以证明,如果 A = 1...10...0,那么所有bi达到同一个值的时候取得最优值. 假设 ai = 1, aj = 0, 那么 i<j ,所以bi<=bj. 若bi != bj,那么增大bi的值,或者减小bj的值都可以得到更优的结果. 所以,bi=bj. 所以,如果A数列里面出现了形如 &quo…
https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 max.最小值为 min.数 字种类数为 cnt,那么这个区间是 continuous interval 当且 仅当 max−min+ 1 = cnt. 考虑从小到大枚举 R,用线段树维护每个 L 的区间 [L,R] 的 max−min−cnt 的值. 由于总有 max−min+1 ≥cnt,那么只需…
题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路清晰,博主就是因为写的时候没有想清楚写了一晚上\(+\)一个早上-- 首先我们对于第\(i\)个位置有如果这个位置可以摆放,那么\(L[s[i]-'a'],R[s[i]-'a'],k\)均减少\(1\),如果不能摆放(条件为:\(\sum\limits_{i=0}^{26}L[i]\leq tot-…
## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形: 左下角和右上角各有一个稻草人: 田地的内部(不包括边界)没有稻草人. 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 简述 求\(n\)个点组成的内部不含其它点的矩形有多少 Solution 为什么要专门记录这个简单的\(CDQ\)分治+单调栈…
C. Report time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Each month Blake gets the report containing main economic indicators of the company "Blake Technologies". There are n commodities…
题目描述 在放完棋子之后,$dirty$又开始了新的游戏. 现在他拥有一个长为$n$的数组$A$,他定义第$i$个位置的分值为$i−k+1$,其中$k$需要满足: 对于任意满足$k\leqslant j\leqslant i$的$j$,有$A[k]\leqslant A[j]\leqslant A[i]$.当对于第$i$个数,有多个$k$满足条件时,取能获得较大分值的$k$. 现在,$dirty$想要知道$A$数组中分值最大的位置对应的分值为多少. 输入格式 第一行一个整数$n$,表示$A$数组…