- 博客(228)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 倍增LCA(最近公共祖先)算法详解
算是详解吧算法策略: 比如求x和y的最近公共祖先。 先让深度较大(离根较远)的节点跳到与另一节点相同深度的位置(并不一定是同一个点)。 然后两个节点一起往上跳,跳到他们最近公共祖先的孩子停止。 然后返回结果的父亲节点即可。倍增需要用到ST表算法(差不多吧)。 没学过ST表看这里用f[i][j]表示i往上2^j的节点。 比如f[i][0]表示i的父亲,f[i][1]表示i的爷爷…… 有了
2017-09-02 10:33:38
5358
4
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 bzoj1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
题目大意: 给出一棵树,初始每个节点为黑色。 C操作改变一个节点的颜色。 A操作询问树上最远的两个黑色节点的距离。这道题我也是学了好久。解法: 我用到的是动态点分治,当然大牛们打LCT也是可以的(万能的LCT!!) 先普及一下树的重心(相信很多人都知道) 相对于上面这棵树,用f[i]表示删除i之后剩下的最大的子树的节点数(第一次听可能有点懵逼) 拿节点4来说,将4删除后剩...
2017-08-26 18:52:53
1065
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 ST表算法详解
ST表算法详解(算是吧)ST表就是一个用来解决rmq(区间最值)问题的算法。 ST表不支持在线修改。 预处理时间复杂度O(nlogn),查询时间O(1)。 ST表算法详解(求最小值): 用mn[i][j]表示从j到j+2^i-1的最小值(长度显然为2^i)。 任意一段的最小值显然等于min(前半段最小值,后半段最小值)。 那么mn[i][j]如何用其他状态来继承呢? j到j+2^i-1
2017-08-25 08:21:55
23273
13
原创 bzoj4240: 有趣的家庭菜园(树状数组)
题目传送门 。解法: 原数组下标为1~n。 打乱后交换次数就为逆序对个数。 因为交换一次就会产生一个逆序对。。 要求逆序对个数尽量少。求的是一个山峰? 就是中间高两边递减的东西。 那么按高度排序。 看下插在左边还是右边产生的逆序对较少。 贪心嘛代码实现:#include<cstdio>#include<cstring>#includ...
2018-04-22 19:34:05
764
1
原创 bzoj4465: [Jsoi2013]游戏中的学问(Dp)
题目传送门 。解法: f[i][j]表示i个人分成j个圈的方案。 那么每进来一个人。他可以不自成圈。他插进别人的圈。 他也可以自成圈。从前面的人中选出两个人跟他成圈即可。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#i...
2018-04-22 19:28:41
463
原创 bzoj4260: Codechef REBXOR(01Trie)
题目传送门 。解法: 01Trie。 听名字大概就知道怎么回事了。 自己yy了下也不知道对不对。。 问题大概就是: 很多个数,求他们异或某一个数的最大值。 我的建法是这样的: 每个数转化成二进制的01序列。 从最高位开始建01trie。跟普通trie差不多。只是一个点只有两个儿子的区别。 这里的最高位不是指数本身的最高位。而是最大数的最高位。 那么此题中范围为int。我把...
2018-04-22 19:25:56
384
原创 bzoj1222: [HNOI2001]产品加工(Dp)
题目传送门 。解法: f[i]表示A机器加工i时间B机器用最少的时间。 转移很好写代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>...
2018-04-22 19:15:15
326
原创 bzoj3124: [Sdoi2013]直径
题目传送门 。解法: 两个傻逼结论: 首先肯定在同一条直径上。因为每条直径都要经过这一段。 肯定是连续的一段。 因为如果你有两段的话。那么敢问这两段之间的路径你是怎么走过去的(树上两点路径唯一!)这样的话就很好做了。 随便找条直径。 在这条直径上确定一条路径。使得这条路径上: 任意一点都不可能从别的分支扩展出直径。 懒得画图直接文字描述。 假设求出了一条直径是1->...
2018-04-22 19:13:15
345
原创 bzoj4444: [Scoi2015]国旗计划
题目传送门 好题解法: 因为区间互不包含。 那么左端点在区间内最右边的的区间一定是当前区间能扩展到最远的区间。 这句话有点绕。举个例子。假设当前区间为1~5。 那么我们往右扩展。 找到左端点最右且小于等于5的区间。 这个区间一定是最优解。 因为区间互不包含啊。如果这个区间不是最优解的话那么就被别的包含了。。因为题目是环。需要转化成链。 所以把环复制一份放在后面就变成了...
2018-04-22 16:45:23
299
原创 bzoj3173: [Tjoi2013]最长上升子序列(树状数组)
题目传送门 。解法: 因为他是从小到大插。 那么新插入一个值对于前面插入的点的影响是没有的。。 所以树状数组直接求解答案。关键是插入的序列不知道啊。 感觉这题难在这。。 想了半天想了个O(n)求序列。 结果wa美滋滋。发现错误后重新想。 发现O(n)还求不了了。。一般位置都是满足二分性的。。 如果很多权值插在同一位置。 那么后面插入的位置是要在前面的。 所以从后往...
2018-04-22 16:38:12
545
原创 bzoj3289: Mato的文件管理(莫队+树状数组)
题目传送门 。解法: 刚才看到Gty的妹子序列。各种不会。。 看到这道题。。 不强制在线? 莫队啊。 进来的点树状数组求下逆序对就好了呀。以为复杂度很高会跑很慢谁知5s就过去了。。。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostr...
2018-04-22 16:31:57
230
原创 bzoj2730: [HNOI2012]矿场搭建(tarjan)
题目传送门 。解法: 第一次写求割点。 全程%。#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<queue>usi
2018-04-22 16:29:42
235
原创 bzoj3531: [Sdoi2014]旅行(树链剖分+线段树)
题目传送门 。解法: 据说叫动态开点。 需要用的点才建线段树。 那么最多只有二十万种不同的信息。。 跟主席树一样嘛。 YY就好了代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm...
2018-04-22 16:27:30
252
原创 bzoj3670: [Noi2014]动物园(kmp)
题目传送门 。解法: 感觉上是kmp。 然后码了个kmp。 然后看成了num[i]是前缀后缀不相交的最长长度。 然后样例出来个144。 发现并没有什么问题。 然后发现看错题了。。然后我就在此基础上继续做。 s[i]表示前缀等于后缀且可以相交有多少个串。 那么求出最长不相交长度。这个的s就是num[i]了。代码实现:#include<cstdio>...
2018-04-18 19:03:31
180
原创 bzoj5301: [Cqoi2018]异或序列(莫队)
题目传送门 。解法: 莫队。 怎么O(1)转移呢。 那么假设i到j的异或和是k。 sum[i]表示1到i的异或和。 那么sum[i-1]^k=sum[j]。 这样统计每个前缀和在区间内出现的次数。 那你就可以O(1)转移了代码实现:#include<cstdio>#include<cstring>#include<cstdlib&g...
2018-04-18 16:17:23
421
原创 bzoj5178: [Jsoi2011]棒棒糖(主席树)
题目传送门 。解法: 主席树求区间超过区间长度一半次数的数。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<...
2018-04-18 10:18:11
288
原创 bzoj3439: Kpm的MC密码(主席树+DFS序+字典树)
题目传送门 做这题有人跟我说用链表。处理相同的串。 网上都说要。。 其实不用吧。。记录每个串的结尾是在字典树上哪个点就行啊。 然后一个一个插啊。解法: 因为是后缀所以到这建字典树。 然后kpm串肯定是子树的所有串。 那么用主席树维护子树第k小。 要求编号连续就套个dfs序就行了。代码实现:#include<cstdio>#include<cstrin...
2018-04-18 10:12:56
258
原创 bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore(floyd)
题目传送门 。解法: 有向边判连通性。 floyd代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<que...
2018-04-18 08:08:58
279
原创 bzoj5194: [Usaco2018 Feb]Snow Boots(线段树)
题目传送门 。解法: 线段树维护一个01序列。 0表示不可以跳。1表示可以跳。 那么每次只需要求最长一段连续的0的长度就行。 如果可以跳过去那么其他也可以跳过去。 如果跳不过去那就不行。 然后那这样每次询问都插岂不是会爆。 那离线一下咯。 询问排下序。 从小到大插。代码实现:#include<cstdio>#include<cstring&g...
2018-04-18 08:07:23
453
原创 bzoj5293: [Bjoi2018]求和(Lca)
题目传送门 。解法: k<=50 暴力算每个点到根的每个次方和。 然后求出lca差分减一下代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<c...
2018-04-18 07:52:05
433
原创 bzoj5168&5029: [HAOI2014]贴海报(线段树)
题目传送门 5029一样解法: 离散化。 覆盖段。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<queue>#include<cma...
2018-04-17 19:14:42
433
原创 bzoj3123: [Sdoi2013]森林(主席树+Lca+启发式合并)
题目传送门 。解法: 因为是森林。那么lca是必须求的。 但是你连接两个点的话指向父亲的方向是会变的。 比如说x原来的父亲fa。现在x要连向y了。那么fa的父亲变成了x。那我们合并两个块的时候。 将点数小的往大的合并。这样的话总复杂度不会超过nlogn。 据说这是启发式合并。维护就用主席树。 x维护x到根的信息。 合并的时候,由于方向会边。那么要先删除原来的主席树。 ...
2018-04-17 19:12:03
242
原创 bzoj4448: [Scoi2015]情报传递(主席树+Lca)
题目传送门 严重吐槽这题数据!! 花了一下午一直在调一个AC代码。 提交莫名WA。因为我建的是单向边。 题目说明规定了父亲。那不就是单向边吗。。 然后本机栈不够大RE了半天。 然后肉老师告诉我一个本地扩栈的方法然后我过了。。 然后又WA了。 然后%题解。发现建的都是双向边。 这题不是规定了父亲吗??? 然后建了双向才过了。。。 数据跟题意不符啊。解法: 当前第i天有个询...
2018-04-17 19:07:32
231
原创 bzoj2733: [HNOI2012]永无乡(并查集+主席树)
题目传送门 。解法: 跟3545解法差不多。 https://blog.csdn.net/hanks_o/article/details/79903342 这道题还没了边权。 直接连通。那么并查集。 据说要启发式。 小的向大的合并。 然后就没了?代码实现:#include<cstdio>#include<cstring>#includ...
2018-04-16 17:04:06
285
原创 bzoj1529: [POI2005]ska Piggy banks(并查集)
题目传送门 。解法: 据说叫什么外向树。 https://wenku.baidu.com/view/820697649b89680202d82527.html代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include&...
2018-04-16 16:25:27
199
原创 bzoj1858: [Scoi2010]序列操作(线段树)
题目传送门 。解法: 线段树。 因为01要交换。 所以0和1的信息都要维护。 维护最长连续一段,总数,从左端点连续,从右端点连续。 然后打上覆盖和翻转标记。 不允许两种标记同时存在。如果要打覆盖标记,那么翻转标记就没用了。 如果打翻转标记,那么覆盖标记取反就行。代码实现:#include<cstdio>#include<cstring>#...
2018-04-16 13:13:07
320
原创 bzoj2958&3269: 序列染色(Dp)
题目传送门 玄学真的不会。解法: f[i][j][k]表示第i位,k=0填B,k=1填W。 j=0表示一段长为K连续的B都没有。 j=1表示有一段长为K连续的B。 j=2表示有一段长为K连续的W。 因为要先有B是连续的才要W连续。 那么j=2肯定从j=1转移 保证连续的B后面一定有一个W,连续的W后有一个B,答案就是f[n+1][2][0] 假设这一位选B显然有 ...
2018-04-16 13:09:56
297
原创 bzoj5196: [Usaco2018 Feb]Taming the Herd(Dp)
题目传送门 。解法: f[i][j]表示前i天有j次出逃的最优方案。 随便搞。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#...
2018-04-16 13:01:59
312
原创 bzoj3296: [USACO2011 Open] Learning Languages(并查集)
题目传送门 。解法: 并查集。 一头牛连向他能说的语言。 然后可以通过翻译的话就相当于双向边咯。 意思就是牛可以去找语言,语言也可以找牛。 最后记录有多少个不同的集合-1即可代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>...
2018-04-16 13:00:51
276
原创 bzoj4887: [Tjoi2017]可乐(矩阵乘法+快速幂)
题目传送门 。解法: 这种题都是矩阵乘法吧。 f[i][t]表示第t秒在i的方案。 那么f[i][t]可以转移f[i][t+1]和能够与i相连的边。那么这个转移可以看作一个转移矩阵。 首先矩阵的(i,i)都为1表示每一秒都可以停留在原地。 如果x和y有边那么(x,y)和(y,x)都为1因为是双向边。然后每乘一次都要记录答案。 因为每种方案都可以自爆。 所以矩阵多一个元素...
2018-04-16 12:58:54
279
原创 bzoj1007: [HNOI2008]水平可见直线(单调栈)
题目传送门 做完这题推荐3190。升级版解法: 单调栈维护下凸包 先按直线的k来排序 当前直线为i,栈顶为x,栈顶下一个为y。 如果i和x的交点在x和y的交点的左边的话。 那么x是看不到的。踢掉。最后剩下的就是答案。代码实现:#include<cstdio>#include<iostream>#include<algorithm&g...
2018-04-16 12:55:19
238
原创 bzoj3190: [JLOI2013]赛车(单调栈)
题目传送门 。解法: 跟水平可见直线很像啊。只不过这道题是从y轴开始的射线。 思路其实差不多。单调栈维护下凸包。 先按照直线的k排序。 那么进来之后t其他直线。当前直线为i。栈顶直线为x。 如果i和x的交点在y轴左侧。 那么说明在起点之前x才能超过i。 那么这是不合法的,所以把x踢掉。然后剩下的就是水平可见直线了。 栈顶下一个元素为y。 如果i和x的交点在x和y...
2018-04-16 12:53:08
253
原创 bzoj1112: [POI2008]砖块Klo(主席树)
题目传送门 。解法: 比赛的时候不知道怎么就一直在想主席树(可能最近做主席树有点多) 然后什么线段树啊树状数组都没想过。 然后就被师兄强行40M卡空间全爆了。。 大视野还是有良心的啊162M。。就用主席树求出中位数,然后没了。代码实现:#include<cstdio>#include<iostream>#include<algorit...
2018-04-16 12:48:50
420
原创 bzoj4690: Never Wait for Weights(带权并查集)
题目传送门 。解法: 我就写过一次带权并查集。 还好他不难想。。 看到这道题我就觉得是带权并查集。。。fa[i]表示祖先。 sum[i]表示跟祖先的差值。 xx表示x的祖先,yy表示y的祖先。 那么每次x和y差w的时候 推式子? x-xx=sum[x] – xx-x=-sum[x] y-yy=sum[y] y-x=w;xx-yy? 将xx合并到yy。 x...
2018-04-12 19:38:36
255
原创 bzoj4477: [Jsoi2015]字符串树(主席树+Hash+Lca)
题目传送门 。解法: 长度小于等于10? hash+主席树啊!!! 然后我就苦逼了的码了一个钟。 然后跑的贼慢倒数第三。。 网上的据说全是可持久化字典树?? 什么鬼我不会。。 只能用主席树了。建10棵主席树来维护长度不同的前缀。 然后树上主席树求一下就好了?代码实现:#include<cstdio>#include<cstring>...
2018-04-12 16:39:39
214
原创 bzoj4247: 挂饰(Dp)
题目传送门 。解法: 先挂钩子多的。 因为假设你最后选出来五个挂饰。 那么肯定是找钩子多的先挂。 那么按照钩子数排个序。 然后Dp一下就行 f[i][j]表示前i个挂完(不一定每个都要选)之后还剩j个钩子。 f[i][j]=max(f[i-1][j],f[i-1][j-a[i].a+1]+a[i].b)代码实现:#include<cstdio>#inc...
2018-04-12 15:20:16
195
原创 bzoj3280: 小R的烦恼(费用流)
题目传送门 。解法: 一开始yy了个建图。 完全没毛病。 结果不知道怎么判impossible了。。 很尴尬。每天分成两个点。 一个点x表示今天收到多少个活人。。 一个点y表示多少个濒死的人。今天雇的人一定会用。所以变成死人。大学连y,容量无限费用q[i] 每天最多a[i]个死人。st连y容量a[i]费用0 每天最多a[i]个活人。x连ed容量a[i]费用0 死人救...
2018-04-12 13:30:24
351
原创 bzoj3613: [Heoi2014]南园满地堆轻絮(二分+贪心)
题目传送门 。解法: 二分答案。 因为后面的元素要大于等于前面的元素。 那么我们使得前面的元素在满足答案的情况下尽量的小就行。 这样后面的元素选择的余地就更大。贪心一下咯。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>...
2018-04-12 11:44:17
197
原创 bzoj2743: [HEOI2012]采花(树状数组)
题目传送门 。解法: 想了蛮久。首先这道题肯定不能用前缀和相减什么的。 那么只能用区间1~l来表示答案。 因为1~r就没有了l的限制。记录每个点上一个出现的位置。 last[i]表示i上一个出现的位置。 能采到i这个位置上的花是从last[last[i]]+1这个位置开始的。 然后last[i]+1开始就采不了这朵花了。树状数组维护下代码实现:#inclu...
2018-04-12 08:42:07
246
原创 bzoj3545: [ONTAK2010]Peaks(主席树+最小生成树)
题目传送门 。解法: 好题啊。 只会不强制在线的。 强制在线的表示不会。离线。 首先x可以到达的点其实都可以互相到达。 那么我们可以看作是一个联通块。 要求边权尽量小其实就是最小生成树啊。离线首先按每次询问的x排序。 然后依次建小于等于x的最小生成树。 那么当前v所在的联通块的第k大实际上就是答案。 并查集压缩路径的时候合并一下主席树即可。吐槽: 时限太少了。...
2018-04-11 21:23:53
379
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人