CDQ%%%
题目描述 Description
有n朵花,每朵花有三个属性:花形( s s s)、颜色( c c c)、气味( m m m),用三个整数表示。现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。定义一朵花A比另一朵花B要美丽,当且仅当 s a ≥ s b , c a ≥ c b , m a ≥ m b s_a\ge s_b,c_a\ge c_b,m_a\ge m_b sa≥sb,ca≥cb,ma≥mb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。
输入 Input
第一行为 N , K N,K N,K ( 1 ≤ N ≤ 1 0 5 , 1 ≤ K ≤ 2 × 1 0 5 1\le N\le 10^5, 1\le K\le 2\times 10^5 1≤N≤105,1≤K≤2×105), 分别表示花的数量和最大属性值。
以下 N N N行,每行三个整数 s i , c i , m i s_i, c_i, m_i si,ci,mi( 1 ≤ s i , c i , m i ≤ K 1\le s_i, c_i, m_i\le K 1≤si,ci,mi≤K),表示第 i i i朵花的属性。
输出 Output
包含 N N N行,分别表示评级为 0... N − 1 0...N-1 0...N−1的每级花的数量。
样例输入 Sample Input
10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
样例输出 Sample Output
3
1
3
0
1
0
1
0
0
1
考虑CDQ分治,将所有属性都相同的花缩成一个,记录相同的个数。第一维可以排序搞定,三维的问题就变成了在二维平面上插入一点
(
c
i
,
m
i
)
(c_i,m_i)
(ci,mi)问有多少点在它的左下方。
好了,我们可以用CDQ了。因为
s
s
s已经是递增的了,下面处理
c
c
c。
先递归左右两侧,现在左侧和右侧都是有序的,合并时,如果左侧的点出现在右侧点的左下方,就将它的影响插入树状数组,如果不是这样,说明右侧的点应该被加到左侧,答案加这个点的
m
m
m的影响。
最后统计答案时将相同的次数加上作为最终答案统计。
时间
O
(
n
log
2
2
n
)
O(n\log_2^2n)
O(nlog22n)但这并不严谨
实际上是
T
(
n
)
=
2
T
(
n
2
)
+
n
log
2
k
T(n)=2T(\frac{n} {2})+n\log_2 k
T(n)=2T(2n)+nlog2k的一个东西…
数列求和玩好不送
Code