题目传送门


题目描述

有$n$朵花,每朵花有三个属性:花形$(s)$、颜色$(c)$、气味$(m)$,用三个整数表示。
现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。
定义一朵花$A$比另一朵花$B$要美丽,当且仅$S_a\geqslant S_b,C_a\geqslant C_b,M_a\geqslant M_b$。
显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。


输入格式

第一行为$N,K$,分别表示花的数量和最大属性值。
以下$N$行,每行三个整数$s_i,c_i,m_i$,表示第$i$朵花的属性。


输出格式

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


样例

样例输入

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

样例输出

3
1
3
0
1
0
1
0
0
1


数据范围与提示

$1\leqslant N\leqslant 100,000$。

$1\leqslant K\leqslant 200,000$。

$1\leqslant s_i,c_i,m_i\leqslant K$。


题解

这道题好像可以用$bitset$,$CDQ$分治,$K-Dtree$解决。

$bitset$好像跑不过,我也不清楚……

最尴尬的是$K-Dtree$我不会……

那么我就来讲讲$CDQ$分治。

假设我们不考虑$m_i$,那么我们就变成了二元组排序,可以先将$s_i$排序,然后问题就转化成了:在一个数列里,找在$i$之前有几个数小于$c_i$。

很显然要使用树状数组维护即可在$\Theta (n\log n)$时间内求出答案。

那么现在又加了一维,怎么办呢?

首先,将这个三元组排序并去重,那么权值$a$已经随下标有序。

然后我们就需要引入$CDQ$分治,假设当前处理的区间为$[L,R]$其中点为$M$,那么我们在处理当前区间的时候已经保证了$[L,M]$和$[M+1,R]$的有序,因为$[L,M]$中的$s_i$一定小于等于$[M+1,R]$中的$s_i$,所以我们只需要维护一个单调指针,按照$[L,M]$中的$c_i$的大小从小到大将其放入树状数组,并在其中查询前缀和即可。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{
int s;
int c;
int m;
int x;
int id;
}e[2000001];
int n,k;
int tr[8000001];
int ans[2000001],q[2000001],b[2000001];
bool cmp1(rec a,rec b){return a.s<b.s||(a.s==b.s&&a.c<b.c)||(a.s==b.s&&a.c==b.c&&a.m<b.m);}
bool cmp2(rec a,rec b){return a.c<b.c||(a.c==b.c&&a.m<b.m)||(a.c==b.c&&a.m==b.m&&a.x<b.x);}
int lowbit(int x){return x&-x;}
void add(int x,int y)
{
while(x<=k)
{
tr[x]+=y;
x+=lowbit(x);
}
}
int query(int x)
{
int res=0;
while(x)
{
res+=tr[x];
x-=lowbit(x);
}
return res;
}
void cdq(int l,int r)//cdq分治
{
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);
cdq(mid+1,r);
sort(e+l,e+r+1,cmp2);
for(int i=l;i<=r;i++)
if(e[i].x<=mid)add(e[i].m,1);
else q[e[i].id]+=query(e[i].m);
for(int i=l;i<=r;i++)
if(e[i].x<=mid)add(e[i].m,-1);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&e[i].s,&e[i].c,&e[i].m);
e[i].id=i;
}
sort(e+1,e+n+1,cmp1);
for(int i=1;i<=n;)//手动去重
{
int flag=i+1;
while(flag<=n&&e[i].s==e[flag].s&&e[i].c==e[flag].c&&e[i].m==e[flag].m)flag++;
flag--;
while(i<=flag)
{
b[e[i].id]=e[flag].id;
i++;
}
}
for(int i=1;i<=n;i++)e[i].x=i;
cdq(1,n);
for(int i=1;i<=n;i++)
ans[q[b[e[i].id]]]++;
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}

rp++

[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分治)

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

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

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

  9. P3810 陌上花开 CDQ分治

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

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

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

随机推荐

  1. uva-796.critical links(连通图的桥)

    本题大意:求出一个无向图的桥的个数并且按照顺序输出所有桥. 本题思路:注意判重就行了,就是一个桥的裸题. 判重思路目前知道的有两种,第一种是哈希判重,第二种和邻接矩阵的优化一样,就是只存图的上半角或者 ...

  2. 56 道高频 JavaScript 与 ES6+ 的面试题及答案

    56 道高频 JavaScript 与 ES6+ 的面试题及答案 :https://segmentfault.com/a/1190000020082089?utm_source=weekly& ...

  3. faker数据填充详解

    安装 在laravel中已经自动集成,无需手动安装.如需在其他地方使用,可使用以下命令进行安装. composer require fzaninotto/faker 为Faker指定中文支持 可通过在 ...

  4. 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  5. FFmpeg SDK开发模型之中的一个:解码器

    简单介绍 本例解说了怎样使用ffmpeg SDK解码媒体文件: 參考源代码是ffmpeg 自带的apiexample.c 一.源代码#include <stdlib.h>#include ...

  6. Centos克隆虚拟机后配置网络

    修改网卡相关信息,复制第二个网卡的mac地址. vim /etc/udev/rules.d/70-persistent-net.rules 修改网卡的信息 vim /etc/sysconfig/net ...

  7. Vue实现二级菜单的显示与隐藏

    <html> <head> <title>Vue实现二级菜单的显示与隐藏</title> <script src="vue.js&quo ...

  8. 七、latex中的插图

  9. Tomcat启动慢的原因及解决方法

    Tomcat启动慢的原因及解决方法 在CentOS启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID ...

  10. Spring基础06——依赖注入的一些细节

    1.字面值 可用字符串表示的值,可以通过<value>元素标签或value属性进行注入.基本数据类型及其封装类,String类等类型都可以采取字面值注入的方式.若字面值包含特殊字符,可以使 ...