您的位置:首页 > 其它

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

2017-03-18 22:00 218 查看
CDQ%%%

题目描述 Description

有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。定义一朵花A比另一朵花B要美丽,当且仅当sa≥sb,ca≥cb,ma≥mb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。

输入 Input

第一行为N,K (1≤N≤105,1≤K≤2×105), 分别表示花的数量和最大属性值。

以下N行,每行三个整数si,ci,mi(1≤si,ci,mi≤K),表示第i朵花的属性。

输出 Output

包含N行,分别表示评级为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分治,将所有属性都相同的花缩成一个,记录相同的个数。第一维可以排序搞定,三维的问题就变成了在二维平面上插入一点(ci,mi)问有多少点在它的左下方。

好了,我们可以用CDQ了。因为s已经是递增的了,下面处理c。

先递归左右两侧,现在左侧和右侧都是有序的,合并时,如果左侧的点出现在右侧点的左下方,就将它的影响插入树状数组,如果不是这样,说明右侧的点应该被加到左侧,答案加这个点的m的影响。

最后统计答案时将相同的次数加上作为最终答案统计。

时间O(nlog22n)但这并不严谨

实际上是T(n)=2T(n2)+nlog2k的一个东西……

数列求和玩好不送

Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: