随笔分类 -  数据结构

摘要:题目描述 题解: 很考验读题能力的一道题…… 首先我们知道要求的是一个类似逆序对的东西,统计时要加上两端权值。 考虑先把初始$ans$求出来,后续操作只会改变$[l,r]$内部关系,这里分块处理。 对于$ans$有影响的有:与端点有关的逆序对形成/破坏次数,已经中间节点与两端关系。 块内用树状数组维 阅读全文
posted @ 2019-04-17 22:55 LiGuanlin 阅读(332) 评论(0) 推荐(0)
摘要:题目描述 题解: 坑题搞了三天。 莫队+线段树。 还有一些和斐波那契数列有关的性质。 首先答案是$a_1f_1+a_2f_2+…+a_nf_n$, 考虑插进去一个元素对答案产生的影响。 比如插进去一个$a_0$,插进去之后会排到第$k$位。 那么答案是$a_1f_1+a_2f_2+…+a_0f_k+ 阅读全文
posted @ 2019-04-15 20:29 LiGuanlin 阅读(301) 评论(0) 推荐(0)
摘要:题目描述 题解: 大意是$0$为源,所有叶子节点为汇,求费用在$m$以内的最大流。 直接跑网络流会$T$。 考虑树形$dp$,发现自己不会。 考虑贪心,每次找一个路径总费用最小的叶子结点(每条边费用为$0$或$1$或$inf$),然后求出路径最大容量, 整条树链都减掉最大容量。 输入时每条边有$(a 阅读全文
posted @ 2019-02-22 10:07 LiGuanlin 阅读(292) 评论(0) 推荐(1)
摘要:题目描述 题解: 考虑到经过一系列变化后小数不可能比大数大,我们可以用线段树维护区间修改。 重点是,每个节点都可以通过$a[i]=a[i]*t1+a0[i]*t2+t3$这个函数来表示,我们就可以把三个标记一起维护。 代码: 阅读全文
posted @ 2019-02-04 13:33 LiGuanlin 阅读(373) 评论(0) 推荐(1)
摘要:题目描述: $zhx$有一个棵$n$个点的树,每条边有个权值。 定义一个连通块为一个点集与使这些点连通的所有边(这些点必须连通)。 定义一个连通块的权值为这个连通块的边权和(如果一个连通块只包含一个点,那么它的权值为$0$)。 $zhx$想找一个包含$1$号点的连通块送给他的妹子,所以他希望你求出包 阅读全文
posted @ 2019-01-20 16:23 LiGuanlin 阅读(428) 评论(0) 推荐(0)
摘要:题目描述 题解: 明显的$k$短路问题,这里提供两种方法。 1.$A$*算法 $A$*可以解决一般的$k$短路问题,但是并不如可持久化可并堆优秀。 $A$*的本质是$f+g$,而估价函数可以用终止节点到终点的最短路表示。 所以先反向建图$dij$,然后小根堆跑$A$*即可。 优化一下,总代价/起点终 阅读全文
posted @ 2019-01-20 16:08 LiGuanlin 阅读(248) 评论(0) 推荐(0)
摘要:题目描述 题解: 可并堆优化$dp$。 由于$ans$只由$l$与派遣人数决定,我们可以贪心选取总和$<=m$的人。 有两种选择,一种是维护小根堆,一直$pop$到弹出的总和$>m$; 另一种是维护大根堆,一直$pop$到剩下总和$<=m$; 这两种比较一定是维护大根堆更优,因为每次$pop$后剩下 阅读全文
posted @ 2019-01-20 15:03 LiGuanlin 阅读(104) 评论(0) 推荐(0)
摘要:题目描述 题解:(模板放上即可) 代码: 阅读全文
posted @ 2019-01-20 14:55 LiGuanlin 阅读(116) 评论(0) 推荐(0)
摘要:题目描述 题解: 将所有骑士放在$ci$上,然后树上$dfs$。 每个节点维护一个小根堆,一直$pop$直到$top>=hi$。 然后放加法、乘法标记,将剩下的骑士回溯带回父节点。 代码: 阅读全文
posted @ 2019-01-20 14:54 LiGuanlin 阅读(117) 评论(0) 推荐(0)
摘要:题目描述 题解: 左偏树,一棵向左倾斜的二叉树。 板子: $upd:$ 之前版本被$luogu$数据卡掉了,$get_top$操作是$O(n)$的。(0_0) 更新路径压缩的做法。 首先合并两棵树就并一下,删除操作要求删除堆顶元素。 肯定是不能直接删的。 怎么做呢,合并儿子后将自己的指针指向新的堆顶 阅读全文
posted @ 2019-01-20 14:48 LiGuanlin 阅读(171) 评论(0) 推荐(0)
摘要:题目描述 题解: 好像和皮皮鼠那题一模一样。 代码: 阅读全文
posted @ 2018-12-28 14:44 LiGuanlin 阅读(183) 评论(0) 推荐(0)
摘要:题目描述 题解: 动态 点分治。 点分治可以帮助我们将树上的点分层,如果我们把这些点按生成顺序建树的话,我们会得到一棵点分树。 点分树有一个特别好的性质,就是不管原来的树长什么样,建出来的点分树的深度都大约是$logn$。 而且若在点分树中a有一个儿子b,那么在原树中a的管辖子树(即找a作重心的子树 阅读全文
posted @ 2018-12-28 14:42 LiGuanlin 阅读(145) 评论(0) 推荐(0)
摘要:题目描述 题解: 这是一道LCT+期望。 先来看看这道题让求的E是啥。 我们可以发现,将树链压成序列后,第i项对总和产生的贡献为$i*(n-i+1)*ai$。 我们要维护这个东西。 考虑合并两个区间,那么先有$as[x]=as[ls]+as[rs]$; 然后考虑中间那个点,有$as[x]+=a[x] 阅读全文
posted @ 2018-12-24 15:50 LiGuanlin 阅读(137) 评论(0) 推荐(0)
摘要:题目描述 题解: 这是一道数学题。 看一眼会发现暴力跑链会超时。 所以我们需要一些神奇的东西。 泰勒展开: 最后那个东西可以当作无穷小。 所以我们可以提一下: 所以我们用LCT维护树链的$f(x0)$前k阶导数就好了。 还有,这道题卡精,一定要将单点值放在函数里面。 代码: 阅读全文
posted @ 2018-12-24 13:11 LiGuanlin 阅读(182) 评论(0) 推荐(0)
摘要:题目描述 题解: 貌似是LCT的套路题? 就是建主席树,然后每次形成环时将环中的第一条边送给新边作标记。 维护这种恶心东西当然用LCT了。 这道题还不同于裸一点的LCT题。本题要对于每条边新建一个节点(类似圆方树),然后将时间信息放到新建节点上。 最后每次查询只需要查标记小于l的边就行了。 因为标记 阅读全文
posted @ 2018-12-23 18:58 LiGuanlin 阅读(141) 评论(0) 推荐(0)
摘要:题目描述 题解: SDOI SD题。 LCT维护线段树, 线段树维护dfs序。 由于每次修改只是从根到x,我们可以将它理解为LCT的access操作。 然后轻重链信息发生变化时,在线段树上改一下就好了。 LCTaccess板子敲错导致自己做自己爷爷。 代码: 阅读全文
posted @ 2018-12-23 13:36 LiGuanlin 阅读(144) 评论(0) 推荐(0)
摘要:题目描述: 题解: 一道非常裸的splay。 代码: 阅读全文
posted @ 2018-12-22 19:30 LiGuanlin 阅读(191) 评论(0) 推荐(0)
摘要:题目描述 题解: splay维护区间最大最小值,以及相邻两项的最小差。 因为向集合中加入元素不能缩小极差。 还有,要换行。 PE2次。 代码: 阅读全文
posted @ 2018-12-22 18:33 LiGuanlin 阅读(190) 评论(0) 推荐(0)
摘要:题目描述 题解: 首先,任意一个括号序列消去成对括号后一定是‘)))……)(……(((’的形式。 如果我们能求出当前子序列消去后剩下的东西长什么样,我们就能O(1)出解。 比如前面有a个')',后面有b个‘(’。 那么$ans = (a+1)/2 + (b+1)/2$. 建议自己画一画。 现在的问题 阅读全文
posted @ 2018-12-22 11:49 LiGuanlin 阅读(216) 评论(0) 推荐(0)
摘要:这个是题目描述: 题解: 啊啊啊啊啊…… 垃圾分数规划。 垃圾树链剖分。 垃圾斜率优化。 垃圾darkbzoj。 这里才是题解: 我们设那个分数的值=k,那么有 $(yi-k*xi)+(qj-k*pj)=0$ 我们要做的是让k最大。 那么很明显开两颗线段树,每个节点存一个凸包。 鉴于我们要让b值最大 阅读全文
posted @ 2018-12-21 13:38 LiGuanlin 阅读(214) 评论(0) 推荐(0)