随笔分类 - 树论——主席树&线段树合并
摘要:【传送门:BZOJ3307】 简要题意: 给出一棵n个点的树,有m个操作 每个操作输入x,y,z,表示x到y的路径上的所有点都放一个编号为z的物品 最后输出每个点存放最多的物品是哪个(如果有存放数量相同的物品,输出编号小的) 题解: 对于每种操作相当于区间增值,那就树上差分,而因为物品不同,所以每个
阅读全文
摘要:【传送门:BZOJ5178】 简要题意: 给出n个数,给出m个询问,每个询问输入l,r,求出是否存在有一个数在l到r中出现的次数超过总数/2次,如果存在则输出这个数,否则输出0 题解: 主席树例题,直接将n个数一个个插入主席树,然后判断是否存在一棵子树的数的数量超过总数/2次,然后继续向下找就可以了
阅读全文
摘要:【传送门:BZOJ3439】 简要题意: 给出n个字符串,给出ki,求出以每个字符串为后缀的字符串中的编号为ki的字符串,如果没有则输出-1 题解: 倒着把字符串插进字典树里,这样子就可以保证一个点是它的子树的所有点的后缀(字典树里一个点代表一个字符串) 然后跑一遍dfs,求dfs序,然后用主席树求
阅读全文
摘要:【传送门:BZOJ2733】 简要题意: 有n个点,每个点都有点权,m条边,给出q个操作,两种操作: B x y将x连向y Q x k求出所有与x相连通(包括x)的点中第k小的点的编号 题解: 主席树+并查集 将所有连通的点都并在一起,然后每次并查集合并的时候,合并能够代表这两个连通块的两棵主席树
阅读全文
摘要:【传送门:BZOJ1112】 简要题意: 给出n个数,每一次操作可以使得一个数增加1或者减少1 求出能得到连续k个相等的数的最少操作次数 题解: 师兄模拟赛的题 主席树求中位数就好了,求的时候顺便求次数就可以了 然而,赛中,师兄,卡空间!!! 才给我们开40M的空间,结果我的代码是44M。。。 光荣
阅读全文
摘要:【传送门:BZOJ1803】 简要题意: 给出一棵有根有点权的n个点的树,有m个询问,每个询问输入x,k,输出以x为根的子树内的第k小值 题解: 树上主席树裸题 求一遍DFS序,然后因为每棵子树的序号是连续的,所以只要记录以x为根的子树的序号区间就可以了 然后利用前缀和思想求第k小值就行了 参考代码
阅读全文
摘要:【传送门:BZOJ2588】 简要题意: 给出n个节点的树,每个点有权值,有m个询问,每个询问输入x,y,k,求出x到y的路径上第k小的值 题解: 树上主席树,将根往下合并主席树 如果要得到x到y的主席树,就将rt[x]+rt[y]-rt[lca]-rt[fa[lca]]就能得到x到y的路径的信息了
阅读全文
摘要:【传送门:BZOJ1901】 简要题意: 给出一个长度为n的序列,有两种操作,m个操作: Q l r k求出l到r第k小的值 C x c将第x个数变成c 题解: 带修主席树例题,用树状数组来维护修改 参考代码:
阅读全文
摘要:【传送门:BZOJ3932】 简要题意: 给出n个任务,每个任务给出开始时间和结束时间还有这个任务的优先度 有m个询问,每个询问给出x和k,求第x秒的时候,优先度从小到大k个任务的优先度的和 强制在线 题解: 主席树好题 设c为这个子树有多少个任务,sum为这个子树里的权值和 先把优先度离散化,然后
阅读全文
摘要:【传送门:BZOJ3524】 简要题意: 给出n个数,m个询问,每个询问输入l,r,请判断区间[l,r]是否存在一个数出现的次数大于(r-l+1)/2,如果存在则输出这个数,否则输出0 题解: 主席树例题,直接在找值的时候判断是否存在左子树或者右子树出现的值>(r-l+1)/2就行了 参考代码:
阅读全文
摘要:【传送门:caioj1442】 简要题意: 给出n个点,每个点都有一个权值,m个操作,操作有两种:第一种是询问l到r的第k小的值,然后输出这个值,第二种是将第x个点的值改为k 题解: 又是一道主席树的例题,不过简直比前两题(caioj1441,caioj1443)难不止一点点 看到第一种操作,我们可
阅读全文
摘要:【传送门:caioj1443】 简要题意: 给出一颗n个点的树,给出每个点的权值,再给出n-1条边,有m个询问,每个询问输入x,y,k,输出第x节点到第y节点的路径上第k大的点 题解: 这是一道主席树的例题,感觉很想用树链剖分,但是会超时吧...... 做法就是将每个点到树的根所形成的链建立线段树,
阅读全文
摘要:【传送门:caioj1441】 简要题意: 给出一个n个数的序列,m个询问,每个询问输入l,r,k,输出第l个数到第r个数第k小的数 题解: 首先想到线段树,但是做不到询问区间的第几小,只能做到最大或最小或和 所以我们用权值线段树——主席树来解决这道题 参考代码:
阅读全文