[JZOJ5131][SDOI省队集训2017]距离

题目描述点分治询问拆成四条到根的询问。 bfs一遍,处理出可持久化点分树。 查询直接查。#include #include #include #define fo(i,a,b) for(i=a;i=b;i--) using namespace std; typedef l...
阅读(41) 评论(0)

[bzoj4860]树的难题

题目大意点分治点剖。 每颗子树按最上面那条边的颜色排序。 顺序扫,同颜色的用一颗线段树,其他也用一颗线段树。 每扫过一个颜色合并一下两颗线段树。 这个方法比单调队列不知道低到哪里去了。#include #include #define max(a,b) (a>b?a:b) #define fo(i,a,b) for(i=a;i<=b;i++) using...
阅读(259) 评论(2)

采蘑菇

题目描述A君住在魔法森林里,魔法森林可以看做一棵n个结点的树,结点从1~n编号。树中的每个结点上都生长着蘑菇。蘑菇有许多不同的种类,但同一个结点上的蘑菇都是同一种类,更具体地,i号结点上生长着种类为c[i]的蘑菇。 现在A君打算出去采蘑菇,但他并不知道哪里的蘑菇更好,因此他选定起点s后会等概率随机选择树中的某个结点t作为终点,之后从s沿着(s,t)间的最短路径走到t.并且A君会采摘途中所经过的所有...
阅读(48) 评论(0)

树上路径

题目描述给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值。 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数。 注意:单点算作一个路径;u ≠ v时,(u,v)和(v,u)只算一次。题解随便点分治 同一个分治中心按到根最大值排序,然后维护桶 裸题#include #include<alg...
阅读(47) 评论(0)

颜色树

题目大意树上每个节点均有颜色。 求有多少条路径包含了所有k种颜色。k<=10点分治点分治后处理到根的二进制状态表示包含的颜色。 问题转化成插入若干个二进制数,查询包含某个二进制数的二进制数有多少个。 可以插入O(1)查询O(2^k) 考虑综合插入和查询的复杂度。 设f[A,B]表示有多少二进制数前一半为A后一半包含B。 插入时A是确定的,枚举包含的B,O(2^(k/2)) 查询时B是确...
阅读(84) 评论(0)

[bzoj3451]Tyvj1953 Normal

题目大意点分治过程中每次随机选择分治中心。 求期望复杂度。期望的线性性容易知道可以单独考虑每个点的贡献。 对于x和y,我们考虑y能否给x带来1的贡献,即y是否是x在点分树上的祖先。 那么Y必须是x到y上第一个被选择为分治中心的点。 一条路径上每个点成为第一个被选择的点概率均等,因此贡献为1dis(i,j)\frac{1}{dis(i,j)} 答案就是∑ni=1∑nj=11dis(i,j)\...
阅读(118) 评论(0)

[hackerrank]Self-Driving Bus

题目大意一颗n个节点的树,现在问有多少对[l,r]满足保留编号[l,r]的点在树上是联通块。 n<=1e5点剖点分治一波 一个联通块要么包含分治中心,要么不包括,后者递归分治处理。 假设分治中心编号为x。用fa表示在树上的父亲(以x为根) 我们找到极大区间[l,r]包含x使得编号[l,r]都出现了。 把合法的左端和右端都提取出来(合法的左端i即[i,x]没有fa会连到i左边,合法右端i即[...
阅读(79) 评论(0)

第K大

题目描述一棵具有n个节点的树,每条边(u,v)有一个边权w(u,v)。定义d(i,j)表示离点i第j近的点的距离,且d(i,1)=0。对于每个点i,给你一个Ki,要对每个点求出d(i,Ki)。点分治二分转为判定性问题。 提前预处理点分治树方便询问即可。#include #include #define fo(i,a,b) for(i=a;i<=b;i++) u...
阅读(131) 评论(0)

[bzoj4182]Shopping

题目大意有一颗树,每个节点相当于是一种物品,有三个因素价值、价格、个数。 在树上选一个联通块,然后做多重背包,要求每种物品必须选。 求最大价值。点分治我们进行点分治。 对于分治中心,要么在联通块中,要么不在。 不在的情况就是递归继续处理。 在的话,以分治中心为根造一颗树,然后做依赖多重背包。 具体做法是,在dfs序上弄,对于i,选i+1就到i+1,不选直接到i+size[i+1] 现在...
阅读(185) 评论(0)

异或树

题目大意给出一颗树。 求∑n−1i=1∑nj=i+1(a[i] xor a[j])∗dis(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^n(a[i]\ xor\ a[j])*dis(i,j) dis(i,j)表示i到j的最短路。点剖这不用说了,拆位,然后点剖。 因为是有序对其实我们可以搞成无序对然后答案除以2。#include #include<algor...
阅读(377) 评论(0)

染色

题目大意给定一颗树,每个点默认白色,有两种操作。 把一个点染黑(不保证此时该点为白色) 询问一个点与所有黑点的距离和树剖先把原树转化为有根树。 然后询问一个点u,就是枚举每一个黑点v 然后贡献为d[u]+d[v]-2*d[lca(u,v)] 记录黑点的总个数和深度和,前两项很容易求和,最后一项呢? 我们尝试枚举u到root路径上的每一点w,设size[w]表示w是多少个黑点的祖先。 那...
阅读(298) 评论(0)

[bzoj3784]树上的路径

题目大意给出一颗树,边有边权,输出点对距离前K大。点剖我们先思考如果不是树是序列该怎么做。 显然先按照权值从大到小排序,然后扔进堆中n个点对(i,1),对于点对(i,j)其权值是i到j的距离。 每次从堆中取一个,然后把第二维加1再丢进去(当然要求丢进去的点对合法) 那么这道题点剖以后,对于每一个分治中心得到的序列也从小到大排序,然后丢点对进去。 一个点对的合法性指: 1、点对(i,j)满足...
阅读(458) 评论(0)

树中点对距离

题目大意在一颗N个结点的树上,统计有多少点对最短距离<=m。(点对不存在顺序性)N<=10000点分治我们选取一个点x作根,那么任何点对都分成两种类型 1、经过x 2、不经过x 我们对经过x的进行统计,对于不经过x的继续在x的子树中分治下去。这就是点分治。 我们处理出每个点的深度,排序后就很容易统计经过x的个数。 不过有可能出现一对点对的lca是y而不是x,然后他们被统计进去了,要在往下分...
阅读(342) 评论(0)

阴阳

题目大意给定一颗有n个结点的树,每条边的权值为1或-1。问有多少点对(i,j)(注意点对不存在顺序性),满足i到j的最短路径上能找到一个点k,使得i到k的最短路径权值和为0,k到j的最短路径权值和为0。 n<=100000。点分治我们进行点分治。 对于当前的根x,我们统计有多少对经过了x的满足题目要求。 我们可以处理出d[i]表示i到x的权值和,b[i]=1表示i到x路径上可以找到异与i与x的...
阅读(181) 评论(0)
    个人资料
    • 访问:164334次
    • 积分:8279
    • 等级:
    • 排名:第2235名
    • 原创:645篇
    • 转载:5篇
    • 译文:0篇
    • 评论:159条
    公告
    幻梦终醒,本无不散之宴,却不悔付此华年。
    最新评论
    文章分类