码迷,mamicode.com
首页 > 其他好文 > 详细

多维偏序

时间:2018-08-05 20:31:32      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:esc   子序列   html   pen   等于   tom   script   模拟   情况下   

一般情况下,我们比较一个数大小,就是ai>aj即可,

而在上升子序列中,当i>j并且ai>aj的时候,才可以认为i这位的数大于j这位的数。

这就是一个二维偏序。

 

类似的,有n个数,每个数m个属性,一个数比另一个数大,当且仅当这个数的所有属性都大于另一个数。

这就是一个m维偏序。

 

对于三维偏序,可以用cdq分治、排序、树状数组处理。

luogu P3810

Description:

有 n 个元素,第 i 个元素有 ai? 、bi? 、ci? 三个属性,设 f(i) 表示满足 aj?ai? 且bj?bi? 且cj?ci? 的 j 的数量。

对于d[0,n) ,求 f(i) = d的数量

Solution:

三维偏序的模板题。

我们先按照a从小到大排序,

然后cdq分治。

先递归到两边,

回溯到这一层之后,把左儿子的所有的数按照b排序,右儿子的所有数也按照b排序。

这样,左儿子的数之间虽然a不一定递增,但是因为开始按照a排序,所以左边所有的数的a一定都小于右边的数。

b排好序之后,

两个指针j,i分别从1~mid,mid+1~r 即左右儿子区间的起止点开始走,,

对于右边的一个数i,当j的数的b值不大于i的b值时,不断向后走j,并且把这些数的c值放进一个树状数组里,

当j的b值大于i之后,当前所有左儿子里面,b小于i这个数的数的c属性都放进树状数组里了。

只有放进去的这些数才可能来更新f值。

在i向后走之前,f[a[i].ans]+=query(a[i].z),满足第三个条件的数也找到了。

就把所有当前这个层里面,符合条件的数都找出来了。

 

由于cdq分治,会把i之前的所有的数都分成logn个区间,更新完f[i]了。

大家可以手动画图,或者模拟一下。

 

复杂度:nlogn^2

那么,这个

 

注意因为是小于等于号,所以我们先

 

多维偏序

标签:esc   子序列   html   pen   等于   tom   script   模拟   情况下   

原文地址:https://www.cnblogs.com/Miracevin/p/9426812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!