随笔分类 -  数据结构

摘要:复习笔记就离谱好吧 用途 大概是给你一个序列, 然后插入一条线段, 然后查询某一个位置上与所有线段交点的纵坐标的的最大值或者最小值。 然后就没了。 实现 定义一个区间的"优势线段"为在这个区间里面有超过一半的点在这个线段上取到最值。 考虑维护一个线段树, 每个节点上保存了一条线段, 初始的时候没有保 阅读全文
posted @ 2020-11-20 10:53 HN-wrp 阅读(121) 评论(0) 推荐(0)
摘要:#define ls(x) ch[x][0] #define rs(x) ch[x][1] int fa[N], ch[N][2], sum[N], val[N], rev[N]; inline void update(int x) { sum[x] = sum[ls(x)] ^ sum[rs(x) 阅读全文
posted @ 2020-06-16 10:16 HN-wrp 阅读(143) 评论(0) 推荐(0)
摘要://#include<bits/stdc++.h> #include<iostream> #include<iomanip> #include<cstring> #include<stack> #include<string> #include<map> #include<cstdlib> #inc 阅读全文
posted @ 2020-06-09 18:18 HN-wrp 阅读(207) 评论(0) 推荐(0)
摘要:"「JOISC 2016 Day 3」回转寿司" 这题我无力吐槽了... ~~强烈谴责出题人用脚造数据~~ 解法 其实这题主要还是部分分启发正解吧。看到有个$s_i = 1, t_i= n$的做法就是维护一个堆就可以了,所以扩展下就是分块,然后每个块维护一个堆。散块暴力,大块直接查。但是有个很坑爹的 阅读全文
posted @ 2020-05-18 20:51 HN-wrp 阅读(229) 评论(0) 推荐(0)
摘要:这题妙啊。 学会了一个新$trick$。 题解 $$|x_1 x_2|+|y_1 y_2| = \\ max (x_1 x_2+y_1 y_2,x_1 x_2 y_1+y_2, x_1+x_2+y_1 y2, x_1+x_2 y_1+y_2) = \\max((x_1+y_1) (x_2+y_2), 阅读全文
posted @ 2020-05-16 17:20 HN-wrp 阅读(270) 评论(0) 推荐(0)
摘要:$CDQ$分治的妙题。 考虑按视野从大到小排序,那右边的可以看见左边的话左边一定看得见右边的,直接$CDQ$就行了。对于这种$[x K,x+K]$的区间维护可以在统计的时候差分也可以直接在更新的时候差分。本代码使用后者。 阅读全文
posted @ 2020-05-15 17:47 HN-wrp 阅读(133) 评论(0) 推荐(0)
摘要:一个很妙的操作,求出每个点通过一条边可以向右边覆盖的最远距离,然后倍增。 阅读全文
posted @ 2020-05-15 17:39 HN-wrp 阅读(94) 评论(0) 推荐(0)
摘要:"Luogu P3703 [SDOI2017]树点涂色" 用LCT中每一个Splay维护颜色相同的点集,则从一个点到根节点的轻边的条数就是这个点的到根的权值。至于路径查询的搞个差分就好,用树剖实现。 至于为什么可以直接这样查,是因为LCT里面涉及子树的权值变化只有access函数。在splay中的子 阅读全文
posted @ 2020-05-13 17:29 HN-wrp 阅读(168) 评论(0) 推荐(0)
摘要:"题目链接 BZOJ2568 比特集合" 思路 + 首先考虑不带区间加的情况,显然容易想到对每个数的每一个二进制位维护一个树状数组。设一个树状数组维护的是二进制的第$k$位,那就每次往里面存$num$的时候在这个树状数组的第$num\ mod \ 2^k$这个位置$+1$,那么我们最后查询的时候,只 阅读全文
posted @ 2020-05-08 22:54 HN-wrp 阅读(139) 评论(0) 推荐(0)
摘要:前言 由于这篇题解思路并没有什么区别,所以这篇题解的意义在于稍稍更细致地讲下思路和卡常方法。~~估计也只有我常数这么大了~~ 思路 第一感 由于题目要查询到一个点距离为$k$以内的所有点的权值和,一个显然的想法就是对每个点开一个线段树维护权值和,下标维护距离,然后暴力查询。显然这是$MLE+TLE$ 阅读全文
posted @ 2020-05-06 19:11 HN-wrp 阅读(346) 评论(0) 推荐(0)
摘要:"这题正常的题面请看这里" ~~由大佬之言可知,看见网格图想分治~~ 所以这题考虑分治。 考虑把棋盘分成两半,那所有点就会有两种情况: + 在完整的一半以内 + 跨越两半 考虑在我们分成两半的那条中线的所有点跑最短路来更新所有点的答案。然后对于跨越了两半的点就直接保存答案,在同一块的点就类似整体二分 阅读全文
posted @ 2020-05-06 13:33 HN-wrp 阅读(204) 评论(0) 推荐(0)
摘要:显然,一棵树的带权重心最多只有两个,最少会有一个,而且在这两个点的答案一定相等。(都是带权重心当然相等)鉴于点分治的写法貌似并不太需要这样的分析,就不说了。~~我不会~~ 首先建出一颗点分树,然后考虑在点分树上跳儿子来保证复杂度,于是我们就需要快速算出所有点到这个重心的带权距离和。~~由于这题是点分 阅读全文
posted @ 2020-05-05 21:25 HN-wrp 阅读(285) 评论(0) 推荐(0)
摘要:动态点分治 先建出一颗点分树,然后维护。 对于每一个点维护两个堆,一个堆维护子树内所有点到分治父节点的距离最大值,一个堆维护一个点所有子树的第一个堆的最大值,再全局维护一个堆取所有分治重心的答案的最大值即可。 代码细节感人。。。 一个比较有用的trick就是用两个大根堆实现可删除的堆~~但是要开O2 阅读全文
posted @ 2020-05-04 23:04 HN-wrp 阅读(265) 评论(0) 推荐(0)
摘要:看到异或最值,显然想到线性基。 用树上倍增的方法,维护当前点$x$到倍增父节点$fa[x][i]$这条路径上的线性基,在倍增的时候暴力合并即可。 注意这个线性基的倍增数组是没有包括最后一个点的信息的,需要特殊处理。然后就搞完了。 时间复杂度$O(n log_n log_v+q log_n log_v 阅读全文
posted @ 2020-05-03 09:23 HN-wrp 阅读(279) 评论(0) 推荐(0)
摘要:"原题传送门" 看见异或最值,估计线性基跑不了了。 考虑先随便提出一条从$1$到$n$的路径,这显然不一定是最优的,但是可以让它变强。比如可以让它中间插入一个环来让它变优。比如说有一条路径: $1 A B C N$ 可以补成: $1 A B E F G E B C N$ 注意到权值的变化其实就是多异 阅读全文
posted @ 2020-05-02 17:11 HN-wrp 阅读(311) 评论(0) 推荐(0)
摘要:用处 没用我学这东西干嘛 快速查询一个数是否可以被一堆数异或出来 快速查询一堆数可以异或出来的最大/最小值 快速查询一堆数可以异或出来的第k大值 这么点? 还有点性质在下面 可能有点用 性质 原数列里的任何一个数都可以通过线性基里的数异或表示出来 线性基里任意一个子集的异或和都不为$0$ 一个数列可 阅读全文
posted @ 2020-05-01 11:45 HN-wrp 阅读(656) 评论(8) 推荐(0)
摘要:线性基板子题,注意特判$0$,开$long~long$就好。 阅读全文
posted @ 2020-05-01 11:44 HN-wrp 阅读(392) 评论(0) 推荐(1)
摘要:题目很显然就是要求序号的线性基。我们希望线性基里的权值最大,就按权值从大到小插入就行了。 为什么是对的呢?插入线性基的一个矿石只会和另一些矿石在一个位置上冲突,而那些矿石也只能插入这一位,同时它们价值不如当前的矿石,所以这是最优的。 阅读全文
posted @ 2020-05-01 11:41 HN-wrp 阅读(257) 评论(0) 推荐(0)
摘要:Nim游戏的结论就是先手异或和不为0的时候必胜,所以就排个序,留下线性基就行了。 阅读全文
posted @ 2020-05-01 11:34 HN-wrp 阅读(320) 评论(0) 推荐(0)
摘要:把每个对应的序列看成二进制数,能控制就把这一位设为$1$,那么每异或出来一个新的数就对应一种情况。 根据线性基的性质,任意一个子集异或和都不一样,所以直接线性基即可。 阅读全文
posted @ 2020-05-01 11:30 HN-wrp 阅读(212) 评论(0) 推荐(0)