数据结构
Aaplloo
天天都想摆
展开
-
树上启发式合并(DSU on Tree) Study
前言话说很多树上启发式合并的题都可以用线段树合并来实现。然而对于一些题目还是得用树上启发式合并做,所以要学习一下的。讲解对于一个节点做树dp,我们先跑完轻儿子,然后跑重儿子后,父节点就可以承载这个重儿子,所以每次都只用重新跑轻儿子即可。那么时间复杂度就是O(nlogn)O(nlogn)O(nlogn)的。...原创 2020-06-04 16:52:55 · 188 阅读 · 0 评论 -
[CF208E] Blood Cousins (线段树合并)
题意题目输入一个森林。mmm 个询问 xxx 点的 ppp 代近亲。思路维护每个点的线段树,树上维护的是 xxx 子树区间深度节点个数,父节点合并上子节点的即可。void Dfs(LL x,LL Fa){ Dep[x] = Dep[Fa] + 1; int l = G[x].size(); for (Int i = 0; i < l; ++ i) Dfs(G[x][i], x);}inline void Build(){ for (Int i = 1; i <=原创 2020-06-02 21:09:22 · 148 阅读 · 0 评论 -
[HNOI2009]梦幻布丁(线段树合并)
题意洛谷题目大意为:每个位置有一个颜色,有两种操作。操作一是将所有 xxx 颜色都修改为 yyy 颜色,操作二是统计序列里有多少颜色段。思路思路其实很明显。我们可以用链表储存信息,用启发式合并保证操作二的时间复杂度即可。然而我用的是线段树合并,思路很简单:就用 nnn 棵线段树维护每种颜色区间位置和答案即可,因为不同颜色之间是没有影响的。使用动态开点线段树然后进行线段树合并即可。Code:LL Ans, Root[MAXN * 10], Son[MAXN * 18][2], SonQ[MAXN原创 2020-06-02 15:39:04 · 212 阅读 · 0 评论 -
[CTSC2016]时空旅行 (线段树分治)
前言昨天学习了线段树分治,算法比较抽象,没有学得太具体,今天做一道例题练练手——自闭前题面上洛谷题意维护若干个集合,每个集合都是由一个编号比它小的集合加入一个二元组(x,c)(x,c)(x,c)或者删去一个元素拓展而来的。如此,集合的拓展关系之间构成一个树形结构。给出mmm次询问,给出一个kkk和XXX,询问第kkk个集合中(x−X)2+c(x-X)^2+c(x−X)2+c的最小值。n,m<=5e5n,m<=5e5n,m<=5e5思路首先,如果XXX值是固定的,可以用主席树原创 2020-05-19 15:36:25 · 243 阅读 · 0 评论 -
[SDOI2011] 拦截导弹 (咕咕咕)
题目思路有两个子任务——最多拦截的导弹个数和每个导弹被拦截的概率。对于子任务一:首先,我们可以定义一个dp[i]dp[i]dp[i]为拦截了第iii个导弹的最大拦截数。易得到:dp[i]=Max(dp[j]+1) (j<i,h[j]>h[i],v[j]>v[i])dp[i]=Max(dp[j]+1)\ (j<i,h[j]>h[i],v[j]>...原创 2020-05-18 14:50:08 · 190 阅读 · 0 评论 -
树状数组
前言话说以前学竞赛真没学好啊……好多算法都学得模模糊糊的。这篇博客主要是复习。直接开始吧。树状数组树状数组,即用数组达到树形结构的作用。树状数组时间复杂度和线段树类似,但是常数会小很多,而且写起来更快。缺点是一些复杂的区间问题不能用树状数组。讲解上面是一棵二叉树。也是传统线段树的结构。树状数组的结构和其类似,但是省去了一些节点以达到用数组建树。如下示例:若称拓展数组为CCC,...原创 2020-05-18 14:48:43 · 102 阅读 · 0 评论 -
线段树分治
线段树分治首先,这里的线段树是狭义的线段树。而线段树分治是一种维护时间区间的数据结构,利用线段树的分治性使时间复杂度为logloglog级别。维护时间区间的数据结构有CDQ分治、KD-Tree,那么线段树分治和它们的区别在哪里呢?其实,它就是用回退操作来实现可持久化,或者说是维护了操作会影响的时间区间。我们考虑如何得到这个操作影响的时间区间。假设一个操作会影响的时间区间为[L,R][L,R][L,R],转移分散到线段树上是logloglog段。当回退一个操作,在线段树上找到这个询问所在的时间点。把树原创 2020-05-15 20:55:22 · 330 阅读 · 0 评论 -
[BZOJ4184] shallot (线段树分治+线性基)
题目小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0。Input第一行一个正整数nnn表示总时间;第二行nnn个整数a1,a2...ana1,原创 2020-05-15 11:57:06 · 202 阅读 · 0 评论 -
[线性基]Duff as a Queen
题目——洛谷利用差分维护差分数组线性基即可。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 200005#define LL int#define Int register intusing namespace std;inline void read(LL &x){ x = 0; LL f = 1;原创 2020-05-14 16:06:08 · 129 阅读 · 0 评论 -
后缀数组
先上一道模板题题目要求我们做的事大致是:把字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置首先我们可以想到暴力:O(n)地得到所有后缀,然后使用快排,O(nlog(n))地排好序,就可以了。对于这道题 n = 1e6,似乎绰绰有余了。But,别忘了,我们进行排序的元素是字符串啊!而字符串的比较是O(n)的,因此,原本快排的时间复杂度还要乘上一个n,总的时...原创 2020-02-29 18:40:16 · 168 阅读 · 0 评论