数据结构与分治算法
文章平均质量分 53
本专栏主要分享本蒟蒻对各种奇妙的数据结构和分治算法的心得与体会
SC.ldxcaicai
我很菜=_=
展开
-
bzoj5371: [Pkusc2018]星际穿越(主席树)
传送门题意简述:给一个序列,对于第iii个位置,它跟[limi,i−1][lim_i,i-1][limi,i−1]这些位置都存在一条长度为111的无向边。称dist(u,v)dist(u,v)dist(u,v)表示(u,v)(u,v)(u,v)间最短路长度。qqq次询问,每次给出l,r,xl,r,xl,r,x,求∑i=lrdist(i,x)\sum_{i=l}^rdist(i,x)∑i=...原创 2019-03-09 15:37:14 · 157 阅读 · 0 评论 -
bzoj4999: This Problem Is Too Simple!(树链剖分+线段树动态开点)
传送门题意:给一颗树,每个节点有个初始值,要求支持将i节点的值改为x或询问i节点到j节点的路径上有多少个值为x的节点。思路:考虑对每种颜色动态开点,然后用树剖+线段树维护就完了。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ...原创 2019-03-09 11:01:59 · 212 阅读 · 0 评论 -
2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串。思路:注意要求的是子串而不是子序列!!!然后直接用线段树维护最大子段和的方式合并一下就完了。注意要维护当前区间最靠左/右的数是什么。代码:#include<bits/stdc++.h>#define ri register intusing namespac...原创 2019-03-09 10:59:04 · 149 阅读 · 0 评论 -
codeforces620E. New Year Tree(线段树+状态压缩)
传送门题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060。思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ans=0; char...原创 2019-03-09 10:56:14 · 226 阅读 · 0 评论 -
codeforces833B. The Bakery(线段树优化dp)
传送门线段树优化dpdpdp入门题。要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值。n≤35000,k≤50n\le35000,k\le50n≤35000,k≤50先考虑直接暴力dpdpdp,fj,if_{j,i}fj,i表示把前iii个分成jjj组的最优值。显然fj,i=maxj−1≤k≤i−1{fj−1,k+W(k+1,i)}f_{j,i}...原创 2019-03-09 10:51:51 · 443 阅读 · 0 评论 -
bzoj4311: 向量(线段树分治+凸包)
传送门题意:支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值。思路:考虑线段树分治。先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两个已有的向量(u1,v1)(u_1,v_1)(u1,v1)和(u2,v2)(u_2,v_2)(u2,v2),假设给出的向量为(x0,y0)(x_0,y_0)(x0,y0)u1&g...原创 2019-02-26 21:07:42 · 237 阅读 · 0 评论 -
bzoj2739: 最远点(决策单调性+分治)
传送门题意简述:给一个N个点的凸多边形,求离每一个点最远的点。思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可。才不是因为博主懒得写二分+栈优化呢代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ans=0;...原创 2019-02-21 21:43:24 · 225 阅读 · 0 评论 -
spoj Query on a tree VII(链分治)
传送门跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值。于是我们对每条链开一个heapheapheap维护一下即可。MDMDMD终于1A1A1A链分治了。代码:#include<bits/stdc++.h>#define ri register int#define fi first#define se secondusing namespace ...原创 2019-02-17 14:28:30 · 313 阅读 · 0 评论 -
spoj Query on a tree V(链分治)
传送门题意简述:给你一棵nnn个黑白点的树,初始全是黑点。现在支持给一个点换颜色或者求整颗树中离某个点最近的白点跟这个点的距离。思路:考虑链分治维护答案,每个链顶用一个堆来维护答案,然后对于每条重链开一棵线段树维护子树里所有白点到线段树最左/右端点的最短距离。然后瞎更新查询即可。代码:#include<bits/stdc++.h>#define ri registe...原创 2019-02-17 10:35:38 · 248 阅读 · 0 评论 -
spoj Query on a tree IV(链分治)
传送门题意简述:捉迷藏强化版(带有边权,可以为负数)思路:好吧这次我们不用点分树,我们用听起来更屌的链分治。直接把树剖成若干条重链,这样保证从任意一个点跳到根节点是不会跳超过logloglog条重链的。然后用上链分治的常规套路:分是否在链上面的信息讨论,并将整条链的值全部统计在链顶,这样修改的时候沿着链往上跳修改logloglog次即可。那么针对这道题可以怎么瞎搞维护呢?考虑对每个...原创 2019-02-16 17:13:32 · 205 阅读 · 0 评论 -
bzoj5210: 最大连通子块和(链分治+ddp)
传送门题意:支持单点修改,维护子树里的最大连通子块和。思路:扯皮:bzojbzojbzoj卡常差评。网上的题解大多用了跟什么最大子段和一样的转移方法。但是我们实际上是可以用矩阵转移的传统ddpddpddp写法来做这道题的。由于我推出来矩阵是3∗33*33∗3的因此常数巨大gggggg了,因此蒟蒻博主只能提供思路和一份TLETLETLE的代码。正题:一道考虑链分治+dpdpdp套...原创 2019-02-15 18:51:07 · 440 阅读 · 0 评论 -
codechef Chef at the Food Fair(线段树+泰勒展开)
传送门题意:现在有nnn个位置,每个位置上有一个值aia_iai.要求支持如下两种操作:区间乘vvv求区间的(1−ai)(1-a_i)(1−ai)之积思路:考虑转换式子:Ans=∏i=lr(1−ai)=e∑i=lrln(1−ai)Ans=\prod_{i=l}^r(1-a_i)=e^{\sum_{i=l}^rln(1-a_i)}Ans=∏i=lr(1−ai)=e∑i=l...原创 2019-02-14 18:13:23 · 302 阅读 · 0 评论 -
bzoj5294: [Bjoi2018]二进制(线段树)
传送门题意简述:给出一个长度为nnn的二进制串。你需要支持如下操作:修改每个位置:1变0,0变1询问对于一个区间的子二进制串有多少满足重排之后转回十进制值为333的倍数(允许前导000)。思路:考虑一个xxx位的包含有yyy个111的二进制串,它是333的倍数当如下任意一个条件成立:yyy是偶数。yyy是大于111的奇数且x−y&gt;=2x-y&gt;=...原创 2019-02-12 17:13:15 · 401 阅读 · 0 评论 -
bzoj1568: [JSOI2008]Blue Mary开公司(线段树)
传送门题意简述:维护整体加一条线段,求单点极值。思路:直接上李超线段树维护即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;typedef long long ll;typedef double db;const int N=1e5+5;const db eps=1e-...原创 2019-02-11 20:21:55 · 170 阅读 · 0 评论 -
bzoj3165: [Heoi2013]Segment(线段树)
传送门题意简述:要求支持两种操作:插入一条线段。询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号。思路:直接上李超线段树即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;typedef long long ll;typedef double db;...原创 2019-02-11 19:44:09 · 235 阅读 · 1 评论 -
51nod 1203 JZPLCM(线段树+链表)
传送门一道很有意思的题。题意简述:给一个数列,多次询问区间的lcmlcmlcm,答案对1e9+71e9+71e9+7取模。思路:首先考虑到一个区间的lcmlcmlcm就是其中所有出现过的素数的最大幂的乘积。因此想到分开维护每一个素数。然后由于pap^apa对答案原本是有pap^apa自己那么多贡献的,现在考虑将它拆分成p,p2,p3,...,pap,p^2,p^3,...,p^ap,p...原创 2019-01-22 21:26:06 · 306 阅读 · 0 评论 -
bzoj3333: 排队计划(逆序对+线段树)
传送门题意简述:给出一个序列,支持把ppp~nnn中所有小于等于apa_pap的‘扯出来排序之后再放回去,要求动态维护全局逆序对。思路:我们令fif_ifi表示第iii个位置之后比它大的数的个数,考虑到一个数在排一次序之后fif_ifi就变成了000,因此等价于每个位置最多修改一次,我们用树状数组先求出fif_ifi,然后上线段树来暴力修改即可。代码:#include<bi...原创 2019-01-22 19:45:51 · 237 阅读 · 0 评论 -
hdu5195 DZY Loves Topological Sorting(贪心+线段树)
传送门题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少。思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可。注意要在选点的时候更新后继的入度代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inl...原创 2019-01-22 18:54:44 · 206 阅读 · 0 评论 -
bzoj2874: 训练士兵(主席树)
传送门题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线。思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空然后心态爆炸,居然不能直接树套树233.然后想起了一个叫做二维前缀和+差分的东西(二维树状数组的时候用过),貌似维护二维差分数组的前缀和就完了,这东西不是可以离散化+主席数吗?上网一搜发现是正...原创 2019-01-22 11:48:31 · 466 阅读 · 4 评论 -
uoj#14. 【UER #1】DZY Loves Graph(并查集)
传送门题意简述:要求支持以下操作:在a与b之间连一条长度为i的边(i是操作编号);删除当前图中边权最大的k条边;表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作。要求在每次操作后输出当前图的最小生成树边权和。思路:由于边权为当前操作编号因此相当于边是单调加入的,也就是说我们可以直接上kruskalkruskalkruskal的合并方法。关键在于怎么维护这几个操作。加边...原创 2019-01-22 00:36:13 · 202 阅读 · 0 评论 -
洛谷P3919 【模板】可持久化数组(主席树)
传送门题意简述:支持在某个历史版本上修改某一个位置上的值,访问某个历史版本上的某一位置的值。思路:用主席树直接维护历史版本即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ans=0,w=1; char ch=getchar(...原创 2019-01-21 21:58:30 · 208 阅读 · 0 评论 -
bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性。思路:我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩。可以考虑另外一种优化方式:按秩合并貌似直接瞎合并也能过于是主席树再额外维护一个该节点的秩即可。代码:#include<bits/stdc++.h>#define ri register int...原创 2019-01-21 21:44:23 · 265 阅读 · 0 评论 -
NOIP训练 可持久化序列【模板】(可持久化treap)
传送门题意简述:支持在把某个数插入到某版本的第k个位置,删除某版本第k个数,询问第k个数。思路:用可持久化treaptreaptreap维护区间第kkk个位置的数是啥就可以了。代码...原创 2019-01-21 21:40:48 · 275 阅读 · 0 评论 -
bzoj2989: 数列(二进制分组+主席树)
传送门二进制分组入门题。主席树写错调题2h+2h+2h+体验极差。题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk。思路:题目要求的是对于一个斜着的正方形的查询。我们考虑转切比雪夫距离转成正常的正方形。然后就变成了一个动态的二维数点问题。这个时候已经可以上cdqcdqcdq分治+扫描线或者树套树切题啦。然而还有一种叫做二进制...原创 2019-01-21 18:56:00 · 431 阅读 · 0 评论 -
bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)
传送门长链剖分好题。题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值。思路:用脚指头想都知道要01分数规划。考虑怎么checkcheckcheck。发现就是求在转化成真·边权之后有没有长度在[L,R][L,R][L,R]之间的路径权值是大于0的。然后可以设计状态fi,jf_{i,j}fi,j表示iii开头长度为jjj的路径最大值,这个可...原创 2019-01-21 13:03:51 · 335 阅读 · 0 评论 -
bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门数据结构优化计数菜题。题意简述:给nnn个点问有多少个www型。www型的定义:由5个不同的点组成,满足x1&amp;lt;x2&amp;lt;x3&amp;lt;x4&amp;lt;x5,x3&amp;gt;x1&amp;gt;x2,x3&amp;gt;x5&amp;gt;x4x_1&amp;lt;x_2&amp;lt;x_3&原创 2019-01-21 12:12:37 · 408 阅读 · 1 评论 -
NOIP训练 ak树(点分治)
传送门题意简述:给一棵带权树,问在上面随机选两个点距离是4的倍数的概率。思路:由于总方案数为定值n2n^2n2,所以只用求总方案数。这个跟聪聪可可差不多,可以用类似树形dpdpdp的方法边点分治边更新答案。代码...原创 2019-01-21 00:27:21 · 220 阅读 · 0 评论 -
bzoj2238: Mst(kruskal+树链剖分)
传送门树链剖分菜题。题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树。思路:先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链剖了。然后考虑如果没有删掉树边答案不变,如果删掉一条能够接上的就只有覆盖了这条边的路径,因此对于每条非树边都用来更新一次树边的信息,O(1)O(1)O(1)处理询问即可。注意要转边为点代码:...原创 2019-01-20 23:16:27 · 203 阅读 · 0 评论 -
bzoj3784: 树上的路径(二分答案+点分治)
传送门点分治好题。题意简述:给一棵带边权的树,问所有路径中前mmm大的。m≤300000m\le300000m≤300000思路:网上有题解写了可以通过什么点分治序转化成超级钢琴那道题的做法蒟蒻吓得瑟瑟发抖。然后由于我比较菜想了一个二分答案的方法。我们二分第mmm大的值,每次用点分治检验合法性。二分完了之后我们再跑一次点分统计答案。然后第一个二分的时候直接做是logn3log^3...原创 2019-01-20 21:05:33 · 523 阅读 · 6 评论 -
bzoj3999: [TJOI2015]旅游(树链剖分)
传送门树链剖分菜题。题意不清差评。题意简述(保证清晰):给一棵带权的树,每次从aaa走到bbb,在走过的路径上任意找两个点,求后访问的点与先访问的点点权差的最大值。思路:考虑暴力:维护路径的前缀最小值和后缀最大值然后更新答案。然后可以用线段树优化这个过程。对于当前的线段树节点,它的答案=max(左儿子答案,右儿子答案,右儿子最大值−左儿子最小值)max(左儿子答案,右儿子答案,右儿...原创 2019-01-20 14:35:13 · 160 阅读 · 0 评论 -
bzoj2388: 旅行规划(分块+凸包)
传送门分块好题。题意:维护区间加,维护区间前缀和的最大值(前缀和指从1开始的)。思路:考虑分块维护答案。我们把每个点看成(i,sumi)(i,sum_i)(i,sumi)答案一定会在凸包上,于是我们每个块维护一个凸包。然后发现 每次前缀和可以分区域修改,在区域内的相当于给所有点的连线加一个斜率,对于区域外的相当于打一个addaddadd标记,于是给每个块维护整体加标记,斜率增加的...原创 2019-01-20 17:15:53 · 214 阅读 · 0 评论 -
bzoj3653: 谈笑风生(长链剖分优化dp)
传送门长链剖分优化dpdpdp水题。题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数。a,b是c的祖先a,b的距离不超过k思路:考虑单独处理每一个询问怎么做。显然a,ba,ba,b的位置关系有两种。bbb是aaa的祖先,此时ccc一定在aaa子树中,这种情况的三元组个数是(sizea...原创 2019-01-19 17:08:28 · 398 阅读 · 0 评论 -
bzoj3252: 攻略(长链剖分+贪心)
传送门长链剖分好题。题意:给一棵带点权的树,可以从根节点到任一叶节点走kkk次,走过的点只能计算一次,问kkk次走过的点点权值和最大值。思路:考虑将整棵树带权长链剖分,这样链与链之间是不会重复选择的。然后每条链都对应一种方案,我们贪心选择前kkk大即可。代码:#include<bits/stdc++.h>#define ri register intusing na...原创 2019-01-19 16:27:22 · 274 阅读 · 0 评论 -
bzoj5457: 城市(线段树合并)
传送门线段树合并菜题。题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人。思路:直接上线段树合并,边合并边维护答案即可。为了代码方便可以用pairpairpair来维护答案。代码:#include<bits/stdc++.h>#define ri register int#define lc (...原创 2019-01-19 15:54:52 · 368 阅读 · 0 评论 -
codeforces 893F.Subtree Minimum Query(线段树合并)
传送门线段树合并菜题。题意简述:给一棵带点权的有根树,多次询问某个点ppp子树内距离ppp不超过kkk的点的点权最小值,强制在线。思路:当然可以用dfsdfsdfs序+主席树水过去。然而线段树合并也是一个不错&&好写的思路我们按照深度为下标建立权值线段树然后线段树合并预处理一波。查询就转化成区间查询了。注意因为要保存下每一个子树的信息所以合并的时候要新建节点来储存...原创 2019-01-19 15:19:37 · 251 阅读 · 0 评论 -
洛谷P2787 语文1(chin1)- 理理思维(ODT)
传送门ODTODTODT水题。题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序。思路:可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉。如果用ODTODTODT排序操作可以直接上桶排感觉快到飞起。不会ODTODTODT的点这儿代码:#include<bits/stdc++.h>#define ri register i...原创 2019-01-19 14:33:59 · 337 阅读 · 0 评论 -
bzoj4592: [Shoi2015]脑洞治疗仪(ODT)
传送门ODT水题。支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数。思路:区间填补操作感觉不是很好弄,写线段树的神仙可以套一个二分来写。而对于写odtodtodt的朋友们来说就很easyeasyeasy了,直接从左往右遍历到第kkk个1所在区间覆盖一波即可(详见代码)。不会ODTODTODT的点这里代码:#in...原创 2019-01-19 14:30:14 · 248 阅读 · 0 评论 -
codeforces343D.Water Tree(树剖+ODT)
传送门ODTODTODT板子题。支持子树01覆盖,路径01覆盖,询问一个点的值。思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去。注意修改路径时每次跳重链都要修改。不会ODTODTODT的点这里代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inl...原创 2019-01-19 14:25:18 · 382 阅读 · 0 评论 -
codeforces915E.Physical Education Lessons(ODT)
传送门ODT水题(当然可以上线段树)支持区间01覆盖,询问全局1的个数。思路:直接上ODTODTODT。不会的点这里代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ans=0; char ch=getchar();...原创 2019-01-19 14:21:14 · 351 阅读 · 1 评论 -
codeforces896C.Willem, Chtholly and Seniorious(ODT)
传送门ODTODTODT出处(万恶之源)题目简述:区间赋值区间加区间所有数k次方和区间第k小–思路:直接上ODTODTODT。不会的点这里代码:#include&amp;lt;bits/stdc++.h&amp;gt;#define ri register intusing namespace std;inline int read(){ int ans=0; ch...原创 2019-01-19 14:17:36 · 392 阅读 · 0 评论