Description

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

Input

第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值。
以下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

Solution

正好借这个题的题解总结一下我对CDQ的理解
顺便借这个题学了一下一直没碰过的树状数组……
首先对于三维偏序$(a,b,c)$,我们可以以a为关键字进行sort,
这样数组中的a就是有序的,每次分治当前区间我们只考虑左半边对右半边的贡献,这样就可以消除a的影响QAQ
再观察一下现在要解决的问题,统计$b_{j}<=b_{i}$且$c_{j}<=c[i]$
如果我们把b当做数组下标,c当数组下标里的值的话,可以想到什么?逆序对!不过这里是个顺序对就是了
所以就是第一维使其sort有序,第二维分治的时候归并排序使其有序,第三维用树状数组进行统计
注意要去重,否则如果A=B,那么(A,B)(B,A)本来都是可以的,但分治的时候不去重我们只能考虑进去一种

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N (200000+1000)
using namespace std; int n,k,emm,top,c[N],ans[N]; int lowbit(int x){return x&-x;}
int add(int x,int delta){for (; x<=k; x+=lowbit(x)) c[x]+=delta;}
int sum(int x){int sum=; for (; x; x-=lowbit(x)) sum+=c[x]; return sum;} struct Node
{
int a,b,c,size,ans;
bool operator < (const Node &A) const
{
if (a==A.a && b==A.b) return c<A.c;
if (a==A.a) return b<A.b;
return a<A.a;
}
}a[N],t[N]; void CDQ(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>;
CDQ(l,mid); CDQ(mid+,r);
int i=l,j=mid+,p=l;
while (i<=mid || j<=r)
{
if (j>r || i<=mid && a[i].b<=a[j].b) add(a[i].c,a[i].size),t[p++]=a[i++];
else a[j].ans+=sum(a[j].c),t[p++]=a[j++];
}
for (int i=l; i<=mid; ++i) add(a[i].c,-a[i].size);
for (int i=l; i<=r; ++i) a[i]=t[i];
} int main()
{
scanf("%d%d",&n,&k); emm=n;
for (int i=; i<=n; ++i)
scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c),a[i].size=;
sort(a+,a+n+);
top=;
for (int i=; i<=n; ++i)
{
if (a[i].a==a[top].a && a[i].b==a[top].b && a[i].c==a[top].c)
a[top].size++;
else a[++top]=a[i];
}
n=top;
CDQ(,n);
for (int i=; i<=n; ++i) ans[a[i].ans+a[i].size-]+=a[i].size;
for (int i=; i<emm; ++i) printf("%d\n",ans[i]);
}

BZOJ3262:陌上花开(CDQ分治)的更多相关文章

  1. bzoj3262陌上花开 cdq分治

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2794  Solved: 1250[Submit][Status][Discus ...

  2. bzoj3262陌上花开 cdq分治入门题

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  3. bzoj3262: 陌上花开(cdq分治+树状数组)

    3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...

  4. bzoj3262 陌上花开 cdq分治(入门)

    题目传送门 思路:cdq分治处理偏序关系的模板题,主要就是学cdq分治吧,还在入门中. 代码其实也很好理解,记得树状数组操作的上限是 z的最大值,不是n的最大值,这个细节wa了好久. #include ...

  5. bzoj3262 陌上花开——CDQ分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 第一道CDQ分治题! 看博客:https://www.cnblogs.com/Narh ...

  6. 【学术篇】bzoj3262 陌上花开. cdq分治入门

    花儿们已经很累了-- 无论是花形.颜色.还是气味, 都不是为了给人们摆出来欣赏的, 更不是为了当做出题的素材的, 她们并不想自己这些属性被没有生命的数字量化, 并不想和其它的花攀比, 并无意分出个三六 ...

  7. [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)

    题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...

  8. P3810 陌上花开 CDQ分治

    陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...

  9. 【BZOJ3262】陌上花开 cdq分治

    [BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

随机推荐

  1. .reverse ,join,split区分

    * 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组. * 2:arrayObject.join() * 注意:join() 方法用于把数组中的所 ...

  2. nodejs初探(一)nodejs开发环境搭建

    简介 JavaScript是一种运行在浏览器的脚本.Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件 ...

  3. 023-将表单序列化为json对象

    使用jQuery将表单序列化为json对象,其中serializeJson方法的名字任意,serializeArray()这个jQuery提供的方法.this指的就是谁调用了这个方法. $.fn.se ...

  4. TOJ 2641 Gene

    描述 How can millions of different and complex structures be built using only a few simple building bl ...

  5. laravel框架的rabbitmq使用示例[多队列封装]

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...

  6. python中时间对象生成及时间格式的转换

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" 将其转换为时间数组 import time timeArray = time.strpt ...

  7. 用ping命令简单的测试 延时、抖动、丢包率

    在DOS命令状态下输入 :ping 202.105.135.211 -t (连续的对该IP地址执行Ping命令,直到被用户以Ctrl+C中断)就会得到下面的结果:Pinging 202.105.135 ...

  8. 初学Hadoop之计算TF-IDF值

    1.词频 TF(term frequency)词频,就是该分词在该文档中出现的频率,算法是:(该分词在该文档出现的次数)/(该文档分词的总数),这个值越大表示这个词越重要,即权重就越大. 例如:一篇文 ...

  9. 使用Spring的AOP实现切面日志

    AOP切面日志的使用方式 @Aspect @Component public class HttpAspect { private static final Logger logger = Logge ...

  10. angular2-响应式表单

    响应式表单是同步的.模板驱动表单是异步的.这个不同点很重要 使用响应式表单,我们会在代码中创建整个表单控件树. 我们可以立即更新一个值或者深入到表单中的任意节点,因为所有的控件都始终是可用的. 模板驱 ...