摘要:"BZOJ原题链接" "洛谷原题链接" STL 本题可以直接使用$\mathtt{STL\ multiset}$水过去。 因为本题插入数的操作实际上就是将原数列分为$n$段,在每一段的末尾插入数,所以我们只需维护每一段的开头和末尾两个数,这样更新相邻差值时只需考虑插入数与原末尾和下一段的开头两个数的
阅读全文
摘要:"原题链接" 将$a[1] + b[1 \to n]$扔到小根堆里,然后每次取堆顶并输出,再将堆顶的下一个和$a[2] + b[x]$扔入堆,这样依次操作下去即可。 cpp include include using namespace std; const int N = 1e5 + 10; st
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造。 这样很容易想到用并查集来维护连通块,问题也变的很简单了。 建原图,先遍历一遍所有边,若某条边的两端点未被摧毁,那么合并两个点,再倒着去枚举被摧毁的点,对于一个点遍历它的边,若是未摧毁的点,那么就用
阅读全文
摘要:"原题链接" 每个点开一个权值线段树,然后用树上差分的方法修改,最后自底向上暴力线段树合并即可。 不过空间较大,会$MLE$,写个内存池就可以了。 cpp include include using namespace std; const int N = 1e5 + 10; const int M
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 线段树合并裸题。 因为交换子树只会对子树内部的逆序对产生影响,所以我们计算交换前的逆序对个数和交换后的个数,取$\min$即可。 对每个叶子节点建一棵动态开点线段树,然后向上合并并更新答案。 而逆序对可以在线段树合并的过程中算出来,因为是权值线段树,根据$mi
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 又是扫描线,题解可看 "大佬的博客" (太懒了不想打) cpp include include using namespace std; const int N = 1e5 + 10; const long long mod = 2147483648LL; s
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 很容易想到二维前缀和。 设$S[i][j]$表示矩阵$(0, 0)(i, j)$内树木的棵数,则询问的矩形为$(x, y)(xx, yy)$时,答案为$S[xx][yy] S[x 1][yy] S[xx][y 1] + S[x 1][y 1]$。 但这题坐标极
阅读全文
摘要:"原题链接" 神仙$DP$啊。。。 题解请移步隔壁 "大佬的博客" $QAQ$
阅读全文
摘要:"原题链接" 和 "ZJOI2007]棋盘制作([题解" )基本一样。 这里是用单调栈来做的,悬线法可参考我在棋盘制作所用的。 初始化出矩阵中每一列连续的$F$的最大长度。 于是,我们就可以对每一行都跑一遍单调栈,对答案不断取$\max$即可。 简单说下单调栈,这里要维护的是一个递增的单调栈。 1.
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 显然可以用数据结构或$ST$表或单调队列来维护最值。 这里采用单调队列来维护。 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度。 再用单调队列维护 之前维护出的每行最值数组 的每一列的最大值和最小值,区间同上。 最后维护出的数组其实就是以每个点为左
阅读全文
摘要:"原题链接" 太菜了,只会$O(n^3)$暴力$DP$,最后看大佬的博客看了好久也是一知半解。。 "大佬博客传送门" cpp include include using namespace std; const int N = 1010; struct dd{ int l, r, v[N], id[
阅读全文
摘要:"原题链接" 二维树状数组模板题。 对每一种颜色开一棵二维树状数组统计即可。 cpp include using namespace std; const int N = 310; const int M = 110; int C[M][N][N], a[N][N], n, m; inline in
阅读全文
摘要:树状数组 "原题链接" 先说一个结(cai)论(xiang),当两个相同的元素之间有$x$个元素是成单的,那么一定要交换$x$次。 ~~然而我并不会证(举例子算吗)~~ 然后我们就可以考虑用树状数组来维护两个相同元素之间有多少元素成单。 我们可以直接一个指针扫过去,当遇到一个第一次出现的元素$x$时
阅读全文
摘要:一道单调队列优化$DP$ "BZOJ原题链接" "洛谷原题链接" 朴素的$DP$方程并不难想。 定义$f[i][j]$表示到第$i$天,手上持有$j$股时的最大收益。 转移方程可以分成四个部分。 1. 第$i$天为空手时买股票 $\qquad\qquad f[i][j]= AP_i\times j$
阅读全文
摘要:一道单调队列优化$DP$ "原题链接" 首先想到的应该是$O(n^3)$的朴素$DP$。 定义$f[i][j]$表示第$j\sim i$块干草堆作为顶层时的最大高度。 $\qquad\qquad f[i][j]=\max\limits_{k=1}^{j 1}\{f[j 1][k]\}+1,(sum[
阅读全文
摘要:一道需要用堆初始化的$DP$ "原题链接" 显然对于每一个部分,当$b[i]$为$a$对于部分的中位数时,差错最小。设$S(x,y)$表示$x\sim y$这一部分的差错。 $DP$的转移方程应该并不难推。 定义$f[i][j]$表示前$i$个数字分成$j$组导致的差错的最小值。 $\qquad\q
阅读全文
摘要:一道单调队列优化$DP$。 "原题链接" 设$f[i][j]$表示前$i$个工匠粉刷前$j$块木板(可以有不刷的木板)能获得的最大报酬。 1. 第$i$个工匠可以不刷第$j$块木板,此时$f[i][j]=f[i 1][j]$。 2. 第$j$块木板可以不刷,此时$f[i][j]=f[i][j 1]$
阅读全文