标签:esc 子序列 html pen 等于 tom script 模拟 情况下
一般情况下,我们比较一个数大小,就是ai>aj即可,
而在上升子序列中,当i>j并且ai>aj的时候,才可以认为i这位的数大于j这位的数。
这就是一个二维偏序。
类似的,有n个数,每个数m个属性,一个数比另一个数大,当且仅当这个数的所有属性都大于另一个数。
这就是一个m维偏序。
对于三维偏序,可以用cdq分治、排序、树状数组处理。
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