- 博客(27)
- 收藏
- 关注
转载 数据结构例题2
题目我们开一棵线段树记录某个深度中最大的\(dis\)。同时利用dfs序来让每条长链开一个线段树并且保证不重复。遍历到某个点时,先处理重儿子,然后把自己加入线段树,计算一端为自己另一端在重儿子子树中的答案。然后处理每个轻儿子,暴力计算一端在该轻儿子所在子树中,另一端在该点已遍历过的子树中的答案,然后把该轻儿子子树中的所有线段树合并到该点来。#include<bits/st...
2019-09-21 10:12:00
137
转载 长链剖分
类似于重链剖分,我们将一棵树分成多条重链。对于每个点,其重儿子(也可以称为长儿子)是到叶子节点距离最远的点。然后类似于静态链分治,我们在计算某个点的答案时先计算重儿子,然后直接继承重儿子答案,再暴力合并轻儿子答案。为了实现空间与时间复杂的的降低,我们需要用指针来实现。长链剖分的时间复杂度为\(O(n)\)。考虑每条重链,仅会在其链顶被暴力合并一次、而重链的长度总和为\(O(n...
2019-09-21 08:16:00
176
转载 BZOJ2054 疯狂的馒头
题目并查集维护染色模板题。倒序染色,用并查集维护下一个没有被染色的点。如果用路径压缩+按秩合并可以做到\(O(n\alpha(n))\)。反正复杂度瓶颈在读入上所以基本上都是以某种方式生成数据。#include<bits/stdc++.h>using namespace std;namespace IO{ char ibuf[(1<<21)...
2019-09-20 20:46:00
119
转载 数据结构例题1
题目因为原本就是棵树,所以部分边组成的一定是森林,那么连通块个数等于点数减边数。我们离线操作,把所有询问按\(r\)排序。然后从小到大枚举右端点,当右端点从\(r-1\)扩展到\(r\)时,我们把所有编号大的一端为\(r\)的边的另一个端点加入树状数组。对于右端点为\(r\)的询问,在树状数组中查询大于等于该询问\(l\)的和即可。#include<bits/stdc++...
2019-09-20 19:41:00
161
转载 HDU5709 Claris Loves Painting
题目建两棵动态开点权值线段树。一棵以颜色为下标,维护每种颜色出现的最浅深度。一棵以深度为下标,维护以该深度为最浅深度的颜色有多少种。然后dfs的时候启发式合并线段树即可。#include<bits/stdc++.h>#define mid ((l+r)>>1)#define pb push_backusing namespace std;name...
2019-09-20 16:36:00
137
转载 CF765F Souvenirs
题目先看暴力做法。把询问按右端点升序排序。对于每个\(r\),我们处理出左端点\(l\in[1,r)\)的所有答案\(ans_l\),当\(r\)向右扩展时暴力修改\(ans\)。这样子显然不能过,我们考虑优化。我们可以认为\(ans_l=\min\limits_{i=l}^{r-1}ans_i\),因此显然\(ans\)是单调不减的。如果我们把单点查询改成区间查询最小值,那...
2019-09-18 21:46:00
236
转载 Luogu P2839 [国家集训队]middle
题目首先我们考虑解决中位数一类问题的常用手段:二分\(mid\),将大于等于它的设为\(1\),小于它的设为\(−1\),判断区间和是否\(\ge0\)。对于询问\(a,b,c,d\),二分完\(mid\)后,我们需要判断\([a,b]\)的最大后缀和\(+[c,d]\)的最大前缀和\(+(b,c)\)的和是否\(\ge0\)。因为中位数一定是序列中出现过的数,所以我们可以排序后二...
2019-09-18 17:22:00
92
转载 Luogu P4602 [CTSC2018]混合果汁
题目把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价。每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低总价。#include<bits/stdc++.h>#define LL long longusing namespace std;namespace IO{ ...
2019-09-18 17:03:00
120
转载 Luogu P2154 [SDOI2009]虔诚的墓主人
题目设空地上下左右分别有\(a,b,c,d\)棵常青树,那么其贡献就为\({a\choose k}{b\choose k}{c\choose k}{d\choose k}\)先预处理组合数。将常青树离散化后以\(x\)为第一关键字,\(y\)为第二关键字排序。这样\(x\)坐标相同的常青树就在一个连续区间内,并且这个连续区间内的\(y\)坐标是递增的。对于一个\(x\)坐标相同...
2019-09-18 16:49:00
109
转载 Luogu P1712 [NOI2016]区间
题目很显然的想法,区间越长越有利。我们离散化,按区间长度降序排序。然后用尺取法,一个个的加入区间头,并且当存在某个位置被大于等于\(M\)个区间覆盖时,删掉区间尾。我们需要支持区间加和全局最大值,直接线段树维护即可。代码是很久以前写的了。#include<bits/stdc++.h>using namespace std;namespace IO{ ...
2019-09-18 16:26:00
78
转载 CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(静态链分治)
题目树上启发式合并(静态链分治)模板题。首先一个串能重排形成是回文串当且仅当其字符数量最多有一个为奇数。因此我们只关心路径上某个字符的奇偶性。所以我们对字符集状压,\(0\)表示偶,\(1\)表示奇。记\(dis_u\)为\(1\)到\(u\)的路径上的字符集。那么对于点对\(u,v\),其路径上的字符集为\(dis_u\oplus dis_v\)。一条路径的字符集\(S\...
2019-09-18 15:49:00
185
转载 Luogu P4095 [HEOI2013]Eden的新背包问题
题目求出从前往后的背包\(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_...
2019-09-17 15:44:00
159
转载 Luogu P4147 玉蟾宫
题目就是全0子矩阵。先预处理每个点上面有多少个连续的0(包括自己)。然后我们枚举下边界(1-n)。我们开一个单调栈,记录一个上界递增的矩形集合。如果我们扫到了一个比当前栈顶要矮的矩形,那么我们就把所有比扫到的矩形高的矩形加入答案并且把它们的高度改成和扫到的矩形一样。具体实现画个图结合代码吧,空讲感觉挺虚的。#include<bits/stdc++.h>usin...
2019-09-17 15:42:00
118
转载 Luogu P4585 [FJOI2015]火星商店问题
题目可持久化01Trie+线段树分治。首先用Trie算出所有询问对于特殊商品的答案。然后我们给每一个进货的商品加上一个时间值,每个询问就会有相对应的时间区间。我们开一棵时间的线段树,把每个询问加到线段树上,每个节点用一个vector储存这个节点的询问。显然每个询问最多会在\(log\)个节点上。然后我们把所有进货按商店排序,由线段树自顶向下进行分治,分治的时候还记录一下进货的...
2019-09-16 21:31:00
103
转载 可持久化01Trie
完全等于可持久化动态开点线段树。例题:Luogu P4735 最大异或和建可持久化01Trie。每次建一个新版本把序列的每个前缀和插进去。添加操作亦如此。查询的话就看每个数位取反的一侧在01Trie的这个区间内是否出现过(也就是\(sum\)是否相等),然后跳儿子。这里蕴含了高位贪心的思想。#include<bits/stdc++.h>using namesp...
2019-09-16 19:31:00
518
转载 CF1142B Lynyrd Skynyrd
题目有两种做法:第一种是\(O(nlog\ n)\)的。我们预处理两个数组:\(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\)。\(lst_i\)表示\(a\)中\(a_i\)前一个\(pre_{a_i}\)的位置。(代码中是\(f_0\))那么每个数往前跳几次\(lst\),也就会对应排列\(p\)中的一段连续子串。然后处理往前跳\(lst\)的...
2019-09-16 14:28:00
144
转载 Luogu P1631 序列合并
题目开一个堆,先把所有\(a[i]+b[1]\)压进优先队列。然后每次把最小的取出来,把对应的\(a[i]\)的下一个\(b[j]\)拿出来加进去。#include<bits/stdc++.h>using namespace std;namespace IO{ char ibuf[(1<<21)+1],obuf[(1<<21)+1]...
2019-09-16 10:08:00
84
转载 BZOJ4548 小奇的糖果
题目把\(x\)离散化,\(y\)降序排序,每种颜色开一个set。因为我们需要不包含所有颜色,所以强制某种颜色不被包含即可。对于某一个点,如果选出的矩形以其为下边界(不取到),左边界就是前驱的横坐标,右边界就是后继的横坐标(都取不到)。前驱后继可以使用平衡树set或链表维护,计算一个范围内的点数可以使用树状数组维护。然后我们从上面往下面枚举每一个\(y\)坐标,对于这个\(y\...
2019-09-16 09:53:00
128
转载 CF938G Shortest Path Queries
题目首先我们想想不加边删边怎么做。先随便找一棵生成树,然后枚举每条边,把新生成的环的长度放到线性基里。对于每次询问,把树上路径放到线性基里查询最小值。如果有加边,每次加边就好了。想想对于删边应该如何做。我们把每次询问加一个时间,那么我们每条边都有一个存在时间段。对于每次询问,只有时间段包含这个时间点的边才能产生贡献。那么我们考虑对于时间也就是询问开线段树,把每条边按存在时...
2019-09-15 17:26:00
101
转载 Luogu P5416 [CTSC2016]时空旅行
题目简化题意:你需要维护\(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\...
2019-09-14 16:59:00
154
转载 Luogu P4755 Beautiful Pair
题目预处理\(L[p]\)表示其左边第一个数值大于等于它的数的位置加一,\(R[p]\)表示其右边第一个数值大于等于它的数的位置减一。考虑对于\(p\),最大值为\(p\)的区间为\([L[p],R[p]]\),也就是左端点在\([L[p],p]\),右端点在\([p,R[p]]\)。我们取其中长度小的一段。比如说\([L[p],p]\)这一段比较短,那么\(\forall i\...
2019-09-12 15:51:00
107
转载 LOJ2880「JOISC 2014 Day3」稻草人
题目我们按\(x\)分治。然后分治完合并时归并降序排列\(y\)。然后维护右边的最靠左的从左上到右下的单调栈,左边的最靠右的从右上到左下的单调栈。遍历左边的点, 每次把纵坐标大于它的右边的点加入单调栈。对于一个左边的点,在右边的单调栈上二分找出纵坐标大于这个点上面那个点的第一个点。#include<bits/stdc++.h>#define LL long lo...
2019-09-11 20:50:00
228
转载 博客公告
CJ蒟蒻一名,正在备战NOIP2019CSP2019。希望能进HNOI2019,THUWC。考试和VJ题集的随笔的密码CJ的应该都知道。如果哪里写锅了或者有什么需求可以直接评论。至于个人记录嘛,能猜出来密码的随你看吧。然后码风的话,比较压行和压大小,大括号换行。就以静态区间第k小的主席树为例吧。#include<bits/stdc++.h>#define mid...
2019-09-09 16:25:00
232
转载 $Prufer$序列
\(Prufer\)序列\(Prufer\)序列与树的相互转换:树->\(Prufer\)序列找到一个编号最小的叶子结点,把这个点删掉并且把跟他连着的那个点的编号加入\(Prufer\)序列。\(Prufer\)序列->树设集合\(S={1,\cdots,n}\)找到一个不在\(Prufer\)序列中且在\(S\)中的数,将它与\(Prufer\)序列中的第一个元...
2019-08-31 17:01:00
63
转载 二次剩余
二次剩余定义:若\(x^2\equiv a(mod\ p)\ \ \ (a\in[1,p))\)有解,则称\(a\)为\(p\)的二次剩余。否则称\(a\)为\(p\)的二次非剩余。勒让德符号:定义:\((\frac{a}{p})=\begin{cases}1&(a是p二次剩余)\\-1&(a是p的二次非剩余)\end{cases}\)定理1:\(p\)有\...
2019-08-20 21:09:00
153
转载 斐波那契循环节
斐波那契循环节从一道题引出一个算法:斐波那契数列这道题并没有什么花里胡哨的条件,就是很简单的计算\(F(n)\ mod\ p\)。但是这题的\(n\)达到了\(10^{30000000}\)级别,很显然不能直接用矩阵快速幂做。因此我们要引入一个概念:斐波那契循环节。显而易见的是通过看题解我们知道,斐波那契数列在模一个数时会出现循环,而这个周期的长度就称为斐波那契循环节。所以我...
2019-08-20 20:10:00
2170
转载 杜教筛
前置芝士:莫比乌斯反演略(莫比乌斯反演板子题,请)前置芝士:积性函数积性函数定义:如果已知一个函数为数论函数,且\(f(1)=1\),并且满足\(\forall gcd(p,q)=1,f(p⋅q)=f(p)⋅f(q)\),那么称这个函数为积性函数。常见积性函数:这里就只提到我们需要用的几个了\(\mu(n)\):莫比乌斯函数。学过莫比乌斯反演的应该都知道。\(\phi(n)\...
2018-12-02 19:37:00
115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人