[CDQ分治] [树状数组] [BZOJ3262] 陌上花开

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 sasb,cacb,mamb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。

输入 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 1N105,1K2×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 1si,ci,miK),表示第 i i i朵花的属性。

输出 Output

包含 N N N行,分别表示评级为 0... N − 1 0...N-1 0...N1的每级花的数量。

样例输入 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

你可能感兴趣的:(CDQ分治,树状数组)