Blue:贪心,单调队列】的更多相关文章

怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. 首先这道题和经典的汽车加油问题差不多,那道题可以用单调队列做,然而这道题也是可以的. 此题唯一的难点在于存储费用m,也…
题意:给定一个序列,让你构造出一个序列,满足条件,且最大.条件是 选取一个ai <= max{a[b[j], j]-j} 析:贪心,贪心策略就是先尽量产生大的,所以就是对于B序列尽量从头开始,由于数据比较大,采用桶排序,然后维护一个单调队列,使得最头上最大. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #i…
地址 注意思路!多看几遍! 很巧妙的一道题.不再是决策点以dp值中一部分含j项为维护对象,而是通过维护条件来获取决策. 首先有个贪心策略,让底层的宽度尽可能小,才能让高度尽可能高.所以应该倒着dp,表示堆$i$~$n$的最高高度$f[i]$,同时这种最值应来源于之后的j,要在设一个$g[i]$表示以i为底层,最窄的宽度.这个的话真的只可意会啊.注意$g[i]$没人告诉你是单调的,$g[i]$之后一个不合法的决策都可能有$g[j]>g[i]$,所以单调性问题还当谨慎考虑. 所以dp方程就能出来了…
https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是Wi,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先送来的若干包干草,堆在地上作为第一层,然后再把紧接着送来的几包干草包放在第二层,再铺建第三层……重复这个过程,一直到所有的干草全部用完.每层的干草包必须紧靠在一起,不出现缝隙,而且为了建筑稳定,…
题意:有一个N位整数,要求输出删除其中D个数字之后的最大整数. 解法:贪心.(P.S.要小心,我WA了2次...)由于规定了整数的位数,那么我们要尽量让高位的数字大一些,也就是要尽量删去前面小的数字.于是我们得到的数字前面是有一串下降的单调队列的,所以最开始就要维护这个.但是要注意--我们不是立马得到了这 n-d 位的整数,而是经过维护单调队列调整后的.因此我下面代码的那句break出循环是错的. 1 #include<cstdio> 2 #include<cstdlib> 3 #…
A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) make_pair(a,b) #define pb push_back ][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }}; using namespace std; typedef long long ll; inline v…
题意:给一个数字(开头非0),拿掉其中的d个数字,使剩下的数字最大(前后顺序不能变). 析:拿掉d个数字,还剩下n-d个数字.相当于从n个数字中按先后顺序选出n-d个数字使组成的数字最大,当然采用窗口滑动优先选取大的. 也就是说,当然第一位最大,这个数就最大了,所以这是一个贪心算法.我开始并不知道有这个算法, 所以开始我是暴力的,700ms,要是数据量再大一点,就TLE了.所以我想肯定有高效率的算法,查了查,原来还有这个. 先说我想法,首先在前d个数字中选最大的,然后在从这个数字到d+1个中选最…
Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要…
Description 给你一个单调不下降的长度为n的序列,请你找出一个最长的子序列,满足找出的子序列中,\(A_i<=A_{i-1}~\times~2\),其中i为下标,A为找出的子序列.对于一个长度为\(p\)的子序列,\(i~\in~[1,p-1]\). Input 两行,第一行是原序列的长度\(n\) 第二行是\(n\)个数,代表原序列中的\(n\)个数. Output 一行一个数,代表最长的长度 Sample Input 10 1 2 5 6 7 10 21 23 24 49 Samp…
首先kmp求出每个子串能放在哪些位置.接下来的两部分贪心和状压都可以,各取比较方便的. 最大值考虑贪心.考虑枚举子串的左端点出现顺序,在此基础上每个子串的位置肯定都应该尽量靠前,有是否与上个子串有交两种选择,如果有交一定会使交集最小,于是枚举第一个子串出现位置并暴力枚举4!*23种情况. 最小值考虑状压.首先把被包含的子串去掉方便处理.将线段排序,设f[i][S]为当前覆盖到的最右位置为i已出现的子串集合为S时的最小覆盖长度,转移时考虑上条线段是否与其有交,单调队列优化转移(因为懒写了线段树).…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题解: 方法一:贪心. 在草稿纸上试多几次可以知道,删除数字中从左到右最后一位递增(可以等于)的数字,可以得到最小值,在这个基础下,又继续删除最后一位递增的数字,得到的依然是最小值.这就表明当前这步的贪心不仅是当前最优,而且对于下一步贪心来说也是最优的.所以每次删除最后递增项就可以了. 初期代码(每次循环找最后递增项): Accepted 3183 46MS 1408K 1259 B G++…
[POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 524  Solved: 251[Submit][Status][Discuss] Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数: 2:最后账户上还有¥q.你有2种操作: 1:对某一位取反,耗时x: 2:把最后一位移到…
bzoj4368 IOI2015 boxes纪念品盒 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368 数据范围:略. 题解: 如果在一个最优方案中,一个点$i$是这个人拿东西从左侧走过来的,我们就说这个点是蓝的. 如果是右侧的,就说这个点是红. 我们发现,并不存在三个可以不连续的点,满足红蓝红. 即,一定存在一个点$i$,满足$1\sim i$的点是蓝的,$i + 1\sim n$是红的. 接着我们维护一个$dp$状态:$f_i$,表…
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7034    Accepted Submission(s): 2589 Problem Description Given a circle sequence A[1],A[2],A[3]......A[n]. Circle se…
题目链接:hdu 5945 Fxx and game 题意: 让你从x走到1的位置,问你最小的步数,给你两种走的方式,1.如果k整除x,那么你可以从x走一步到k.2.你可以从x走到j,j+t<=x 题解: 看这个数据规模,多半要用O(N)的做法,比赛的时候我当时用的贪心,但这肯定是错的,最终FST了,当时不会单调队列. 我们设dp[i],表示走到i的最小步数,那么就有dp[i]=min{dp[i/k](k|i),dp[j]+1(j+t<=x)}. 对于第一项,我们直接判断一下就行了,对于第二项…
题目链接:hdu_5884_Sort 题意: 有n个数,每个数有个值,现在你可以选择每次K个数合并,合并的消耗为这K个数的权值和,问在合并为只有1个数的时候,总消耗不超过T的情况下,最小的K是多少 题解: 首先要选满足条件的最小K,肯定会想到二分. 然后是如何来写这个check函数的问题 我们要贪心做到使消耗最小,首先我们将所有的数排序 然后对于每次的check的mid都取最小的mid个数来合并,然后把新产生的数扔进优先队列,直到最后只剩一个数. 不过这样的做法是n*(logn)2 ,常数写的小…
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] 第一行两个整数 n,k,如题目描述接下来一行n 个数,表示这个序列 [输出格式] 输出一行一个数,表示最大的和 [输入样例] 5 21 2 3 4 5 [输出样例] 12 [数据范围与约定] 对于20%的数据,保证1 <=n <=10. 对于40%的数据,保证1 <=n <=200.…
https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号)依靠传送带连续的传输进牛棚来.第i包干草有一个 宽度W_i(1<=w_i<=10000).所有的干草包的厚度和高度都为1. Bessie必须利用所有N包干草来建立起干草堆,…
树的直径 定义:树中最远的两个节点之间的距离被称为树的直径.  怎么求呢?有两种官方的算法(不要问官方指谁我也不晓得): 1.两次搜索.首先任选一个点,从它开始搜索,找到离它最远的节点x.然后从x开始搜索,找到离x最远的点y,那 么E(x, y)的长度就是树的直径.时间复杂度为O(n). 2.树形dp.这种其实更好写.我们可以对于某个节点x,分别求出经过它的最长链的长度.怎么求呢?首先,枚举x 所连接的k个节点yi(i ∈[1,k]),都求出以yi为根的子树最大深度d[yi].那么,经过x的最长…
题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实实DP. 设\(f[i]\)为到\(i\)划分出的最长长度(不用想什么奇奇怪怪的状态啊→_→),则\(f[i]=\max\{f[i-1],\ f[j]+i-j\}\) (\(s[i\sim j]\)是\(n\)个串中某串的子串,且\(i-j\geq L\)). 求以某位置结尾的子串是否匹配,可以对\…
ummm,,,都是单调系列就都一起学了算了思想应该都差不多呢qwq 其实感觉这俩没有什么可说的鸭QAQ就是维护一个单调的东西,区别在于单调栈是一段进一段出然后单调队列是一段进另一段出?没了 好趴辣重点港下适用范围qwq 1)直方图最大矩形(单调栈[X] rt,给个直方图求最大矩形面积 例 换一个表达,给一个序列,求一个子序列使得这个子序列中的min*序列长度max,一样的意思嗷注意一下? 例 昂首先想如果高度单调递增怎么搞,显然是贪心地把每个高度算出它延伸到右边界的面积取max 那如果右边这个比…
题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) 的情况. 有两种情况分别对应 \(r\) 作为最大和最小值. \(r\) 作为最大值:枚举 \(a_r-r*mid\),查询 \(min\{a_l-l*mid\}\)并减去. \(r\) 作为最小值:枚举 \(a_l+l*mid\),查询 \(min\{a_r+r*mid\}\)并减去. 单调队列…
P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing a game similar to human hopscotch. Their hopscotch game features a line of N (3 <= N <= 250,000) squares conveniently labeled 1..N that are chalked o…
传送门 Description 给出数轴上的n个线段,保留最多k条线段,问这些被保留下来的线段的并集长度为最多为多少. Input 第一行两个数n和k 接下来n行,每行两个数,表示一条线段的左右端点.(0<=每个数<109) Output 一个数表示答案. Sample Input Sample Output Hint 对于30%的数据,1<=n<=20 对于60%的数据,1<=n<=300 对于100%的数据,1<=n<=100000,,1<=k&l…
题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 \[f[i] = min\{f[j]\} \quad [sum[j - 1] - sum[i - 1] \ge f[j]]\] 变形一下 \[sum[i - 1] \le sum[j - 1] - f[j]\] 我们知道\(j\)越小一定不比\(j\)更大的劣 所以我们只需要在满足该式条件下尽量往…
[BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来表示. Sample Input 5 3 4 3 1 2 4 5 Sample Output 7/2 HINT 1≤L≤R≤n≤10^5,0≤ai≤10^9,保证问题有解,数据随机生成 题解:直接二分答案,然后每个糖果的权值都变成a[i]-mid,我们需…
Cut the Sequence \(solution:\) 这道题出的真的很好,奈何数据水啊! 这道题当时看得一脸懵逼,说二分也不像二分,说贪心也不像贪心,说搜索吧这题数据范围怎么这么大?而且这题看起来也实在不好DP,当时是真的满头雾水.只能说是各个都尝试一下.最后还是选了DP来做第一步突破,因为这道题可以用最优子结构来推出最优答案,也符合常规DP套路即设 \(F[i][j]\) 表示将前面 $ i $ 个数分成 $ j $ 份,但是这一道题没有说具体的份数,而且数据范围很大,所以我们直接设…
题目大意:给定一个由+1和−1构成的长度为n的序列,提供两种操作: 1.将某一位取反,花销为x 2.将最后一位移动到前一位.花销为y 要求终于p+sumn=q.且p+sumi≥0(1≤i≤n),求最小花销 枚举终于的序列以哪个点開始.那么从这个点往后的最小前缀和能够用单调队列预处理出来 然后贪心地把左边的−1改成+1.右边的+1改成−1直到满足要求就可以 #include <cstdio> #include <cstring> #include <iostream> #…
Photo bzoj-3126 题目大意:给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问最多能有多少个点. 注释:$1\le n \le 2\cdot 10^5$,$1\le m\le10^5$. 想法:开始和GXZlegend在那里贪心.贪了挺久发现几乎所有的贪心策略都会被卡,此题被当做毒瘤题.然后上bz上找题解发现了新大陆?? 这题是一个dp. 状态:dp[i]表示第i个位置必须放点,最多能在前i个位置放多少点. 转移:我们记录几个事儿.首先,R[i]表示所有区间中包含i且左端…
P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top of the first one, there is a little bird who would like to fly over to the top of the last tree. Being in fact very little, the bird might lack the s…