随笔分类 - 单调队列/栈
1
摘要:B(贪心、fft) 将两数列排序后按照正负分离,最大值与最小值类似 考虑求最大值,对于两数列中同号的部分,显然按照绝对值顺序依次相乘;对于异号部分,需要令绝对值乘积尽可能小,简单列式子后可以得到该部分贡献为倒序卷积,按照不同情况翻转其中一个数列 最小值同理,只需先将其中一个数列翻转,后续步骤类似。
阅读全文
摘要:2019 NWERC(最短路+凸包、线段树二分、智慧题) D. Disposable Switches 显然最终的答案只与经过的边数和经过的最短路径长度和有关 令$dis[x][k]$表示到$x$点经过$k$条边的最短路(因为记录了边数,这个东西可以直接$n^2$预处理 完全不可能的点不容易求,考虑
阅读全文
摘要:A 圆方树 咕 B 显然开盒子的顺序应按照$w$升序,而$hint$若选择使用应该在一开始就使用 在使用$hint$的情况下,因为知道$01$的总数,每种情况应当在最后一段连续的$0/1$前终止 即$100\cdots 0$此类情况,在$0$处截止,其花费为$sum_i$即到$0$处$w$的前缀和
阅读全文
摘要:A 签到题,显然只有当所有系数都$C=0$才能收敛,判一下即可 #include<bits/stdc++.h> #define inf 2139062143 #define ll long long #define db double #define ld long double #define u
阅读全文
摘要:A 签到题,显然可以取到所有$<\lceil\frac{n}{2}\rceil$的所有数,则答案就是$n-1$的最高位$2^x-1$ #include<bits/stdc++.h> #define inf 2139062143 #define ll long long #define db doub
阅读全文
摘要:A 记$b_i=|a_i-a_{i+1}|\(对于一段区间\)[l,r]$,若这一段内的数构成等差数列,则需$max{a_l,\dots ,a_r}-min{a_l,\dots ,a_r}=gcd(b_l,\dots ,b_{r-1})\cdot (r-l)$ 当无法构成等差数列时,显然有$max-
阅读全文
摘要:T1 bzoj 2806 题目大意: 给出$n$个字符串表示模式串,$m$次询问,每次给出一个串 对于一个模式串的子串,我们可以将其称为一个好的串 对于一个给出的串,需要将这个串划分为若干段,使得这些段中好的串的总长度不少于总长的$85%$ 现在要使这个划分方案中最短的好的串的长度最大,输出这个满足
阅读全文
摘要:bzoj 2152 聪聪可可 题目大意: 求树上边权和为3的倍数的路径的条数 思路: 点分治练习题 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm>
阅读全文
摘要:非常的菜 被初中踩成了弱智 T1 game 题目大意: n轮游戏 在第$i$轮已经获胜$j$轮继续获胜的概率为 p i j 每一轮可以选择放弃(即100%失败) 求最优策略下 获胜场数的期望 思路: 可以发现并不需要放弃 直接dp即可 1 #include<iostream> 2 #include<
阅读全文
摘要:T1 note 数组开小 菜的真实 60分 题目大意: 一个字符串 分成若干段 使每段内都没有重复的字符 求最少的段数 思路: 可以贪心 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #
阅读全文
摘要:题目大意: 网格上有些点 找出一些点对使这两个点围成的矩形内没有点 思路: 我们先用cdq降低复杂度 然后对于分治的两边 左右两端分别按照y排序 然后我们对于右边的点 只需要统计出以它为右上角顶点的矩形即可 我们直接通过对于左右两边分别维护两个单调栈 左边x单减 右边x单增 然后每次在右边插入点的时
阅读全文
摘要:题目大意: 一个数列,求一段长度不少于k的数 使平均值最大 思路: 把所有数列里的数,转换为(i,sum i)的点 然后求一个下凸包,在这个过程中对于长度特殊处理一下,使栈内至少有一段长度大于等于k 下凸包的最后一段即为所求 1 #include<iostream> 2 #include<cstdi
阅读全文
摘要:题目大意: 一个数列,它左边第一个比它高的人和右边第一个比它高的人要加上它的权值 思路: 单调栈维护一个单调递减的栈 正反各维护一遍 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #
阅读全文
摘要:题目大意: 有一些直线若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的 思路: 可以看出来最后图形应该为一个下凸包 对于下凸包上的每个点,斜率都应该递增,而且横坐标递增 因此我们先对每条线的斜率进行排序 然后使用单调栈维护即可 1 #include<iostr
阅读全文
摘要:题目大意: 一个数列,取出一些数使得它们的总和最大且没有k个连续 思路: 首先我们可以找到一个nk的dp dp方程:dp[i]=dp[j-1]+sum[i]-sum[j] (sum[j]尽量小) 然后我们可以使用单调队列(单减)优化掉k即简化掉求最小值的一步 1 #include<iostream>
阅读全文
摘要:题目大意: 一个01串,求一段长度至少为L的区间使这个区间的平均值最大 思路: 因为是一个01串,所以我们可以把串内的点都当做点来处理 每个点的横坐标为它的位置,而纵坐标则为它的前缀和 这样这个串就变为了一个阶梯式的图像 如果点p在线段AB或BC上,取点i 如果点p在点C上方,取点k 所以点j并没有
阅读全文
摘要:题目大意: 一个数列,求对于每个ai右边有几个比它小的数,且这些比他小的数到ai之间没有比ai大的数。 思路: 问题可以很容易地转换为求右边第一个大于等于它的数的位置 然后就可以想到单调栈 有两种做法: 一: 从后向前走,栈内为单调递减,栈内元素需要记录一下它的值和位置,然后每个元素进来的时候弹出直
阅读全文
摘要:题目大意: 有一个矩阵 有些点可以取有些不能 求以每个点为右下角的子矩阵(里面点都可以取)的周长最大值 最后统计出每个周长对应矩阵的个数 思路: 单调栈 先预处理出每个点向上最多能延伸多长记为h(i,j) 然后对于每行维护一个单调栈记录每行最远可以达到的左端点和该矩形的高 该单调栈满足高单调递增 每
阅读全文
摘要:题目大意: 一个空队列,两种操作 1.查询数列内末尾l个数的最大值 2.每次在数列末尾插入一个数,该数为输入的数和上一次查询的值之和对固定常数取模 思路: 很明显线段树 维护一个就好了 中间写错好多次 还需多练 1 #include<iostream> 2 #include<cstdio> 3 #i
阅读全文
摘要:题目大意:有一个a*b的矩阵,求所有矩阵内n*n的子矩阵内最大值与最小值之差的最小值 思路: 根据可以看出这是一道裸的单调队列。 具体来说,就是用单调队列先维护出每行每个点左侧n个点以内的最大值,记为 t 数组。外层循环为a,内层为b 然后再用单调队列维护每个点上方n个点以内的 t 数组的最大值,这
阅读全文
1

浙公网安备 33010602011771号