随笔分类 -  数据结构

摘要:要点 括号序列平衡度即树深度 的性质 相当于中序遍历,则两点间最浅的地方即是LCA 的性质 线段树维护$d(a) + d(c) 2 d(lca(a,c))$,一层层剥,思考维护这个量需要什么,结果维护一大堆。 C++ include include include using namespace s 阅读全文
posted @ 2019-07-02 23:31 AlphaWA 阅读(191) 评论(0) 推荐(0)
摘要:方法一 黑白棋盘拥有性质:(r + c) % 2的值决定颜色 因此把某色全部反转,直接求另一色的最大矩形即可,单调栈的经典问题 阅读全文
posted @ 2019-06-10 14:47 AlphaWA 阅读(180) 评论(0) 推荐(0)
摘要:要点 序列是n个不同的数,则新学到的一种策略就是二分这个位置的答案,然后可以上下调。 神奇地只关注大于还是小于mid并赋值0、1,这样m个操作的排序就能用线段树维护了! 阅读全文
posted @ 2019-06-07 15:59 AlphaWA 阅读(228) 评论(0) 推荐(0)
摘要:要点 题目传送 题目本质是每个点必属于两个集合中的一个,伴随的性质是:如果一个人说别人true,则他们一定属于同一阵营;如果说别人fake,一定不属于同一阵营。 每个点拆为$i$和$i + n$分别代表他属于某种阵营(目前还不确定),然后根据上述性质边读入边合并同类。 这样扫一遍,如果某个$i$和$ 阅读全文
posted @ 2019-05-21 18:47 AlphaWA 阅读(169) 评论(0) 推荐(0)
摘要:要点 题意……题意往往是个大坎Orz:输入操作 则在区间$[x_1,x_2]$插入一个三次函数, 则先查询区间$[x_1,x_2]$的函数值的和,然后按题目要求得到新的$x_1$、$x_2$并插入一个三次函数。都是整形。 解决方法:三次函数只有四个部分,栽4棵代表不同次幂函数的线段树即可,这样每次只 阅读全文
posted @ 2019-05-05 18:10 AlphaWA 阅读(141) 评论(0) 推荐(0)
摘要:分治的时候SZ感觉是错的……但是貌似第一次找好重心就够了,之后SZ别太离谱就不会T,重心随一随缘就好…… C++ include include include using namespace std; const int maxn = 1e4 + 5; int n, k, mx, SZ, ans; 阅读全文
posted @ 2019-05-04 00:49 AlphaWA 阅读(168) 评论(0) 推荐(0)
摘要:提交通道 洛谷日报 考虑非$O(n^2)$的预处理。一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索;如果清了,父亲节点又难以收集答案。 解决方法:先让儿子们各顾各的家,算一遍各自的答案(假如能算),check清就清了吧。然后考虑人为优化,即 阅读全文
posted @ 2019-04-30 23:15 AlphaWA 阅读(311) 评论(0) 推荐(0)
摘要:1.题意有坑,实际要求第k小。 2.没学过动态开点也没学过主席树,看一下博主思路然后妄想自己实现的后果就是拿命去调bug。 阅读全文
posted @ 2019-04-29 01:44 AlphaWA 阅读(205) 评论(0) 推荐(0)
摘要:要点 不难想到gcd一下然后枚举每个开头走一圈,并记录一下数值。 最终答案是分情况的:1.能走几圈走几圈然后加上最后剩余的最大子段和;2.也可能是最后一圈后面的拖后腿了,所以最后一圈没走完就停,即长度为一圈长的最大子段和;3.一圈为负数时只考虑一圈内的即可,多走了反而变差。 求环形的、不超过某长度的 阅读全文
posted @ 2019-04-19 22:53 AlphaWA 阅读(256) 评论(0) 推荐(0)
摘要:AC通道 要点 欧拉函数对于素数有一些性质,考虑将输入数据唯一分解后进行素数下的处理。 对于素数$p$有:$\phi(p^k)=p^{k 1} (p 1)=p^k \frac{p 1}{p}$,因此将$a_i$唯一分解后有:$\phi(\prod_{i=l}^ra_i)=\prod_{i=l}^ra 阅读全文
posted @ 2019-04-16 12:54 AlphaWA 阅读(311) 评论(0) 推荐(0)
摘要:要点 显然要滑动修改维护。 像通常的数列next关系一样建边(单调栈预处理),因为贪心所以是树,然后发现增删只会影响 区间内的 子(or父,看你连边方向行事)节点,于是使用dfs序建线段树。 为了正确地修改,会发现必须得用大数向小数连边。一是根据题意,一个大数会有好几个小数儿子但小数只会贪心选一个父 阅读全文
posted @ 2019-04-12 00:29 AlphaWA 阅读(236) 评论(0) 推荐(0)
摘要:bit扫描坐标套路题,注意有重复的点,莽WA了。 C++ const int maxn = 1e5 + 5; struct node { ll B, F, D; bool operator rhs.B; return F 阅读全文
posted @ 2019-04-08 22:23 AlphaWA 阅读(202) 评论(0) 推荐(0)
摘要:题目传送 虽然线段树比较显然但是发现a数组并不好维护。考虑将a转化为好维护的数组b。 方法 这里我将k[1]设为0,对应着$$a[1] + k[1] INF) { C++ include include include include using namespace std; typedef lon 阅读全文
posted @ 2019-04-07 10:50 AlphaWA 阅读(177) 评论(0) 推荐(0)
摘要:最小生成树会多样的情况是:两个或多个边等长且连通同样的两个并查集块。 所以可以跑一遍克鲁斯卡尔,每次把当前等长的边数出来,注意不要边找边并查,因为有一部分边是正常跑生成树我们也不会要他的,这种直接跳了;还有一些,是因为你选择了第一个边,然后并在一起了,这时扫到后面的边时他自然会被抛弃。而这种比较委屈 阅读全文
posted @ 2019-03-29 13:20 AlphaWA 阅读(286) 评论(0) 推荐(0)
摘要:一眼看过去就x排序扫描一下,y是1e9的离散化一下,每层用树状数组维护一下,然后像dp倒着循环似的树状数组就用y倒着插就可行了。 类似题目练习:BZOJ4653、BZOJ1218 阅读全文
posted @ 2019-03-25 23:53 AlphaWA 阅读(378) 评论(0) 推荐(0)
摘要:第一种方法:可以二分最大天数订单的答案然后通过差分求一下是否可行。 第二种方法:无脑插一棵残缺的线段树板子即可: 阅读全文
posted @ 2019-03-23 22:45 AlphaWA 阅读(234) 评论(0) 推荐(0)
摘要:写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除。然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按长度排序的话),那么只要发现当前选取的这些从左到右的区间可以得到m及以上就可以了,没必要特地考虑具体 阅读全文
posted @ 2019-03-23 09:52 AlphaWA 阅读(154) 评论(0) 推荐(0)
摘要:题目传送 学习的这篇题解。 结论: 1.直观感受一下会发现找到LIS,LIS里的东西相对位置是不会变的,其他的移一移总会排序成功的,所以其他的就是最小集合了,第一问的答案就是n-LIS; 2.寻找字典序第k小的集合,相当于是寻找字典序第k大的LIS,然后把这个LIS删去,就是第二问的答案集合。 前置 阅读全文
posted @ 2019-03-19 10:44 AlphaWA 阅读(249) 评论(0) 推荐(0)
摘要:1.扫描线扫描x轴,线段树维护y轴。 2.坐标+1,线段树是从1开始维护。然后让边长--,这样就能包含边上的点了。 3.为了保证点在正方形内:在x轴上利用差分的思想,在x出Add(val),在x+r(已经-1了)处Add(-val);在y轴上利用线段树维护1~5001这个区间,在y~y+r上Add( 阅读全文
posted @ 2019-03-07 18:52 AlphaWA 阅读(364) 评论(0) 推荐(0)
摘要:1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include ... 阅读全文
posted @ 2019-02-26 18:37 AlphaWA 阅读(315) 评论(0) 推荐(0)