<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ding4440的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ding4440</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ding4440]]></copyright><item><title><![CDATA[数据结构例题2]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250981</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250981</guid><author>ding4440</author><pubDate>Sat, 21 Sep 2019 10:12:00 +0800</pubDate><description><![CDATA[题目
我们开一棵线段树记录某个深度中最大的\(dis\)。
同时利用dfs序来让每条长链开一个线段树并且保证不重复。
遍历到某个点时，先处理重儿子，然后把自己加入线段树，计算一端为自己另一端在重儿子子树中的答案。
然后处理每个轻儿子，暴力计算一端在该轻儿子所在子树中，另一端在该点已遍历过的子树中的答案，然后把该轻儿子子树中的所有线段树合并到该点来。
#include&lt;bits/st...]]></description><category></category></item><item><title><![CDATA[长链剖分]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250978</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250978</guid><author>ding4440</author><pubDate>Sat, 21 Sep 2019 08:16:00 +0800</pubDate><description><![CDATA[类似于重链剖分，我们将一棵树分成多条重链。
对于每个点，其重儿子（也可以称为长儿子）是到叶子节点距离最远的点。
然后类似于静态链分治，我们在计算某个点的答案时先计算重儿子，然后直接继承重儿子答案，再暴力合并轻儿子答案。
为了实现空间与时间复杂的的降低，我们需要用指针来实现。
长链剖分的时间复杂度为\(O(n)\)。
考虑每条重链，仅会在其链顶被暴力合并一次、
而重链的长度总和为\(O(n...]]></description><category></category></item><item><title><![CDATA[BZOJ2054 疯狂的馒头]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250976</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250976</guid><author>ding4440</author><pubDate>Fri, 20 Sep 2019 20:46:00 +0800</pubDate><description><![CDATA[题目
并查集维护染色模板题。
倒序染色，用并查集维护下一个没有被染色的点。
如果用路径压缩+按秩合并可以做到\(O(n\alpha(n))\)。
反正复杂度瓶颈在读入上所以基本上都是以某种方式生成数据。
#include&lt;bits/stdc++.h&gt;
using namespace std;
namespace IO
{
    char ibuf[(1&lt;&lt;21)...]]></description><category></category></item><item><title><![CDATA[数据结构例题1]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250979</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250979</guid><author>ding4440</author><pubDate>Fri, 20 Sep 2019 19:41:00 +0800</pubDate><description><![CDATA[题目
因为原本就是棵树，所以部分边组成的一定是森林，那么连通块个数等于点数减边数。
我们离线操作，把所有询问按\(r\)排序。
然后从小到大枚举右端点，当右端点从\(r-1\)扩展到\(r\)时，我们把所有编号大的一端为\(r\)的边的另一个端点加入树状数组。
对于右端点为\(r\)的询问，在树状数组中查询大于等于该询问\(l\)的和即可。
#include&lt;bits/stdc++...]]></description><category></category></item><item><title><![CDATA[HDU5709 Claris Loves Painting]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250974</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250974</guid><author>ding4440</author><pubDate>Fri, 20 Sep 2019 16:36:00 +0800</pubDate><description><![CDATA[题目
建两棵动态开点权值线段树。
一棵以颜色为下标，维护每种颜色出现的最浅深度。
一棵以深度为下标，维护以该深度为最浅深度的颜色有多少种。
然后dfs的时候启发式合并线段树即可。
#include&lt;bits/stdc++.h&gt;
#define mid ((l+r)&gt;&gt;1)
#define pb push_back
using namespace std;
name...]]></description><category></category></item><item><title><![CDATA[CF765F Souvenirs]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250972</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250972</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 21:46:00 +0800</pubDate><description><![CDATA[题目
先看暴力做法。
把询问按右端点升序排序。
对于每个\(r\)，我们处理出左端点\(l\in[1,r)\)的所有答案\(ans_l\)，当\(r\)向右扩展时暴力修改\(ans\)。
这样子显然不能过，我们考虑优化。
我们可以认为\(ans_l=\min\limits_{i=l}^{r-1}ans_i\)，因此显然\(ans\)是单调不减的。
如果我们把单点查询改成区间查询最小值，那...]]></description><category></category></item><item><title><![CDATA[Luogu P2839 [国家集训队]middle]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250971</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250971</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 17:22:00 +0800</pubDate><description><![CDATA[题目
首先我们考虑解决中位数一类问题的常用手段：二分\(mid\)，将大于等于它的设为\(1\)，小于它的设为\(−1\)，判断区间和是否\(\ge0\)。
对于询问\(a,b,c,d\)，二分完\(mid\)后，我们需要判断\([a,b]\)的最大后缀和\(+[c,d]\)的最大前缀和\(+(b,c)\)的和是否\(\ge0\)。
因为中位数一定是序列中出现过的数，所以我们可以排序后二...]]></description><category></category></item><item><title><![CDATA[Luogu P4602 [CTSC2018]混合果汁]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250977</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250977</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 17:03:00 +0800</pubDate><description><![CDATA[题目
把果汁按美味度降序排序，以单价为下标插入主席树，记录每个节点的\(sum\)果汁升数和\(val\)果汁总价。
每次询问二分最小美味度，查询美味度大于等于\(mid\)的总体积为\(L\)的最低总价。
#include&lt;bits/stdc++.h&gt;
#define LL long long
using namespace std;
namespace IO
{
    ...]]></description><category></category></item><item><title><![CDATA[Luogu P2154 [SDOI2009]虔诚的墓主人]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250969</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250969</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 16:49:00 +0800</pubDate><description><![CDATA[题目
设空地上下左右分别有\(a,b,c,d\)棵常青树，那么其贡献就为\({a\choose k}{b\choose k}{c\choose k}{d\choose k}\)
先预处理组合数。
将常青树离散化后以\(x\)为第一关键字，\(y\)为第二关键字排序。
这样\(x\)坐标相同的常青树就在一个连续区间内，并且这个连续区间内的\(y\)坐标是递增的。
对于一个\(x\)坐标相同...]]></description><category></category></item><item><title><![CDATA[Luogu P1712 [NOI2016]区间]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250975</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250975</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 16:26:00 +0800</pubDate><description><![CDATA[题目
很显然的想法，区间越长越有利。
我们离散化，按区间长度降序排序。
然后用尺取法，一个个的加入区间头，并且当存在某个位置被大于等于\(M\)个区间覆盖时，删掉区间尾。
我们需要支持区间加和全局最大值，直接线段树维护即可。
代码是很久以前写的了。
#include&lt;bits/stdc++.h&gt;
using namespace std;
namespace IO
{
    ...]]></description><category></category></item><item><title><![CDATA[CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths（静态链分治）]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250973</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250973</guid><author>ding4440</author><pubDate>Wed, 18 Sep 2019 15:49:00 +0800</pubDate><description><![CDATA[题目
树上启发式合并（静态链分治）模板题。
首先一个串能重排形成是回文串当且仅当其字符数量最多有一个为奇数。
因此我们只关心路径上某个字符的奇偶性。
所以我们对字符集状压，\(0\)表示偶，\(1\)表示奇。
记\(dis_u\)为\(1\)到\(u\)的路径上的字符集。
那么对于点对\(u,v\)，其路径上的字符集为\(dis_u\oplus dis_v\)。
一条路径的字符集\(S\...]]></description><category></category></item><item><title><![CDATA[Luogu P4095 [HEOI2013]Eden的新背包问题]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250970</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250970</guid><author>ding4440</author><pubDate>Tue, 17 Sep 2019 15:44:00 +0800</pubDate><description><![CDATA[题目
求出从前往后的背包\(f_{i,j}\)和从后往前的背包\(F_{i,j}\)。
那么对于询问\((d,e)\)，答案就是\(\max\limits_{i=0}^e f_{d-1,i}+F_{d+1,e-i}\)。
然后就是单调队列优化多重背包。
记物品有\(c[i]\)个，价值为\(v[i]\)，代价为\(w[i]\)。
多重背包的转移\(f[i][j]=\max\limits_...]]></description><category></category></item><item><title><![CDATA[Luogu P4147 玉蟾宫]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250968</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250968</guid><author>ding4440</author><pubDate>Tue, 17 Sep 2019 15:42:00 +0800</pubDate><description><![CDATA[题目
就是全0子矩阵。
先预处理每个点上面有多少个连续的0（包括自己）。
然后我们枚举下边界（1-n）。
我们开一个单调栈，记录一个上界递增的矩形集合。
如果我们扫到了一个比当前栈顶要矮的矩形，那么我们就把所有比扫到的矩形高的矩形加入答案并且把它们的高度改成和扫到的矩形一样。
具体实现画个图结合代码吧，空讲感觉挺虚的。
#include&lt;bits/stdc++.h&gt;
usin...]]></description><category></category></item><item><title><![CDATA[Luogu P4585 [FJOI2015]火星商店问题]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250967</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250967</guid><author>ding4440</author><pubDate>Mon, 16 Sep 2019 21:31:00 +0800</pubDate><description><![CDATA[题目
可持久化01Trie+线段树分治。
首先用Trie算出所有询问对于特殊商品的答案。
然后我们给每一个进货的商品加上一个时间值，每个询问就会有相对应的时间区间。
我们开一棵时间的线段树，把每个询问加到线段树上，每个节点用一个vector储存这个节点的询问。
显然每个询问最多会在\(log\)个节点上。
然后我们把所有进货按商店排序，由线段树自顶向下进行分治，分治的时候还记录一下进货的...]]></description><category></category></item><item><title><![CDATA[可持久化01Trie]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250964</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250964</guid><author>ding4440</author><pubDate>Mon, 16 Sep 2019 19:31:00 +0800</pubDate><description><![CDATA[完全等于可持久化动态开点线段树。
例题：Luogu P4735 最大异或和
建可持久化01Trie。
每次建一个新版本把序列的每个前缀和插进去。
添加操作亦如此。
查询的话就看每个数位取反的一侧在01Trie的这个区间内是否出现过（也就是\(sum\)是否相等），然后跳儿子。
这里蕴含了高位贪心的思想。
#include&lt;bits/stdc++.h&gt;
using namesp...]]></description><category></category></item><item><title><![CDATA[CF1142B Lynyrd Skynyrd]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250965</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250965</guid><author>ding4440</author><pubDate>Mon, 16 Sep 2019 14:28:00 +0800</pubDate><description><![CDATA[题目
有两种做法：
第一种是\(O(nlog\ n)\)的。
我们预处理两个数组：
\(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\)。
\(lst_i\)表示\(a\)中\(a_i\)前一个\(pre_{a_i}\)的位置。（代码中是\(f_0\)）
那么每个数往前跳几次\(lst\)，也就会对应排列\(p\)中的一段连续子串。
然后处理往前跳\(lst\)的...]]></description><category></category></item><item><title><![CDATA[Luogu P1631 序列合并]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250962</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250962</guid><author>ding4440</author><pubDate>Mon, 16 Sep 2019 10:08:00 +0800</pubDate><description><![CDATA[题目
开一个堆，先把所有\(a[i]+b[1]\)压进优先队列。
然后每次把最小的取出来，把对应的\(a[i]\)的下一个\(b[j]\)拿出来加进去。
#include&lt;bits/stdc++.h&gt;
using namespace std;
namespace IO
{
    char ibuf[(1&lt;&lt;21)+1],obuf[(1&lt;&lt;21)+1]...]]></description><category></category></item><item><title><![CDATA[BZOJ4548 小奇的糖果]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250963</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250963</guid><author>ding4440</author><pubDate>Mon, 16 Sep 2019 09:53:00 +0800</pubDate><description><![CDATA[题目
把\(x\)离散化，\(y\)降序排序，每种颜色开一个set。
因为我们需要不包含所有颜色，所以强制某种颜色不被包含即可。
对于某一个点，如果选出的矩形以其为下边界（不取到），左边界就是前驱的横坐标，右边界就是后继的横坐标（都取不到）。
前驱后继可以使用平衡树set或链表维护，计算一个范围内的点数可以使用树状数组维护。
然后我们从上面往下面枚举每一个\(y\)坐标，对于这个\(y\...]]></description><category></category></item><item><title><![CDATA[CF938G Shortest Path Queries]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250966</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250966</guid><author>ding4440</author><pubDate>Sun, 15 Sep 2019 17:26:00 +0800</pubDate><description><![CDATA[题目
首先我们想想不加边删边怎么做。
先随便找一棵生成树，然后枚举每条边，把新生成的环的长度放到线性基里。
对于每次询问，把树上路径放到线性基里查询最小值。
如果有加边，每次加边就好了。
想想对于删边应该如何做。
我们把每次询问加一个时间，那么我们每条边都有一个存在时间段。
对于每次询问，只有时间段包含这个时间点的边才能产生贡献。
那么我们考虑对于时间也就是询问开线段树，把每条边按存在时...]]></description><category></category></item><item><title><![CDATA[Luogu P5416 [CTSC2016]时空旅行]]></title><link>https://blog.youkuaiyun.com/ding4440/article/details/101250961</link><guid>https://blog.youkuaiyun.com/ding4440/article/details/101250961</guid><author>ding4440</author><pubDate>Sat, 14 Sep 2019 16:59:00 +0800</pubDate><description><![CDATA[题目
简化题意：你需要维护\(n\)个集合，集合元素为二元组\((x,v)\)。集合\(i\)的产生方式是以某个原有集合\(p_i\)为样本，扩展或删除一个元素后得到新集合。有\(q\)次询问，每次给出\(y\)并指定一个集合\(i\)，要求从集合\(i\)中找出一个元素，最小化\((x−y)^2+v\)。
先拆式子\((x-y)^2+v=x^2-2xy+y^2+v\)，令其等于\(k\...]]></description><category></category></item></channel></rss>