OceanEye's Blog

很多人即使只见过一面,已经算见过了最后一面。

@OceanEye7年前

05/20
15:36
OI

BZOJ3932

裸的主席树

前k个可能是一个优先级的一部分

看代码吧:-D

 

BZOJ3932

@OceanEye7年前

04/12
23:33
OI

BZOJ4299 CodeChef FRBSUM

很强的题目= =超级烦

想来想去想不懂怎么写

一个很朴素的想法就是排序然后一个一个加进去

假设当前已经满足可以取[0,P]之间的取值

新进来一个数q

如果q在[0,P+1]之间的话就可以拓展 P -> P+q

否则停止拓展,因为显然后面那一堆都不满足要求

然后我就不会了= =跑去翻了翻题解  [传送门]

发现可以连着处理一段的sum,时间复杂度大致是单次log方的。

真神奇

 

BZOJ4299 CodeChef FRBSUM

@OceanEye7年前

04/8
18:43
OI

51nod 1681 主席树

这题主席树的处理还是有点神的,,
maya我直接抄题解就好了,,反正我方法的和题解是一样的。
但是我比好多人都慢啊QAQ不服气

首先转化问题。两棵树的公共祖先,很扯淡。计算出每两个点的两棵树上的公共祖先我用的复杂度是n^2·logn
妈呀根本不能接受,妥妥的TLE
那么我们计算祖先的贡献怎么样?
首先假设某个点有x个公共儿子,那么他对总的亲密度的贡献是x*(x-1)/2【自己脑补组合数】
但是看一眼数据范围,首先O(n)应该是不可能的了。那么我们能不能在nlogn的时间内瞎搞出所有节点的公共儿子呢qwq
平衡树?搞毛,,线段树?搞毛,,树剖?不好意思不会,,主席树?于是又神奇的想到了转化问题

他的标号是混乱的,这很不清真,,换成DFS序怎么样?
第二棵树呢?还是混乱的,,

混乱又怎么样,,再标一次就好了。这个时候我们要的就是完成两个集合求交集的工作。
那么主席树出场了!

第一棵树的节点先按照dfs序重新编号,记节点A的子节点为l到r
然后第二棵树也这么做,,记节点A的子节点为L到R
这个时候,会惊奇发现他们的公共儿子【交集】不就是求[L,R]中有多少个元素属于[l,r]的么,,
由于这个东西目测满足区间加法,所以主席树应该是可行的。
那么就主席树瞎搞一下,,A掉。
爽!

51nod 1681 主席树