题目大意

给定n朵花,每个花有三个属性,定义\(f[i]\)为满足\(a_j \le a_i\)且\(b_j \le b_i\)且\(c_j \le c_i\)的j的数量,

求\(d \in [0,n)\),\(f[i]=d\)的数量

这题是一道CDQ的入门题

CDQ其实本质上是一个分治的过程,需要将询问离线,然后进行分治

一般都是:

if (l==r) return;
cdq(l,mid);
cdq(mid+1,r);
处理左半区间对右半区间的影响

对于这个题,有三维,首先对于第一维进行排序去重,然后进行CDQ,递归到一层,分别对\([l,mid]\)和\([mid+1,r]\)分别进行第二维的排序,然后用树状数组统计左边区间对右边区间影响(就是求满足\(b_i<b_j\)的顺序对个数)

具体实现就是两个指针,一个从l开始跳,一个从mid+1开始循环,因为要统计左半区间对右边的影响,所以二者的循环上界也是要有限制的

具体可以看一下代码

    int pos = l;
for (int i=mid+1;i<=r;i++)
{
while (b[pos].b<=b[i].b && pos<=mid) modify(b[pos].c,b[pos].cnt),pos++;
b[i].ans+=query(b[i].c);
}
for (int i=l;i<pos;i++) modify(b[i].c,-b[i].cnt);

最后统计的答案的时候注意:

for (int i=1;i<=tot;i++) ans[b[i].ans+b[i].cnt-1]+=b[i].cnt;

这里加\(b[i].cnt-1\),是因为要统计 \(\le\) 而不是 \(<\)

上总的代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector> using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
} const int maxn = 2e5+1e2; struct Node{
int a,b,c,cnt,ans;
};
Node a[maxn];
Node b[maxn];
int ans[maxn];
int c[maxn];
int n,maxval;
int tot;
int lowbit(int x){return x&(-x);}
void modify(int x,int p){for (int i=x;i<=maxval;i+=lowbit(i)) c[i]+=p;}
int query(int x){int ans=0; for (int i=x;i;i-=lowbit(i)) ans+=c[i]; return ans;}
bool cmp1(Node a,Node b)
{
if (a.a==b.a){
if (a.b==b.b) return a.c<b.c;else return a.b<b.b;
}return a.a<b.a;
}
bool cmp2(Node a,Node b){
if (a.b==b.b){return a.c<b.c;}
return a.b<b.b;
}
void cdq(int l,int r)
{
if (l==r) return;
int mid = (l+r) >> 1;
cdq(l,mid);cdq(mid+1,r);
sort(b+l,b+mid+1,cmp2);
sort(b+mid+1,b+r+1,cmp2);
int pos = l;
for (int i=mid+1;i<=r;i++)
{
while (b[pos].b<=b[i].b && pos<=mid) modify(b[pos].c,b[pos].cnt),pos++;
b[i].ans+=query(b[i].c);
}
for (int i=l;i<pos;i++) modify(b[i].c,-b[i].cnt);
}
int main()
{
scanf("%d%d",&n,&maxval);
for (int i=1;i<=n;i++) scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
sort(a+1,a+1+n,cmp1);
for (int i=1;i<=n;i++)
{
if (a[i].a==a[i-1].a && a[i].b==a[i-1].b && a[i].c==a[i-1].c) b[tot].cnt++;
else b[++tot]=a[i],b[tot].cnt=1;
}
cdq(1,tot);
for (int i=1;i<=tot;i++) ans[b[i].ans+b[i].cnt-1]+=b[i].cnt;
for (int i=0;i<n;i++) printf("%d\n",ans[i]);
return 0;
}

bzoj3262陌上花开 (CDQ,BIT)的更多相关文章

  1. bzoj3262 陌上花开 cdq+树状数组

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

  2. bzoj3262陌上花开 cdq分治

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

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

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

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

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

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

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

  6. BZOJ3262:陌上花开(CDQ分治)

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

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

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

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

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

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

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

  10. [BZOJ3262]陌上花开

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

随机推荐

  1. Golang slice作为函数参数

    slice底层其实是一个结构体,len.cap.array分别表示长度.容量.底层数组的地址,当slice作为函数的参数传递的时候,跟普通结构体的传递是没有区别的:如果直接传slice,实参slice ...

  2. ES6扩展——函数扩展之剩余函数

    1.结合扩展运算符 //剩余参数是做聚合的,扩展运算符是做展开的 function sum(...args){ console.log(arguments); console.log(argument ...

  3. redhat9 linux 网卡无法激活排障

    先查看自己的系统版本! [root@localhost root]# uname -a Linux localhost 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 ...

  4. centos7 postgresql安装配置

    2021-07-15 1.添加用户 # 添加用户 postgres useradd postgres # 给用户 postgres 设置密码 passwd postgres 2.切换到该用户,下载 p ...

  5. 微服务架构及raft协议

    微服务架构全景图 服务注册和发现 Client side implement 调用需要维护所有调用服务的地址 有一定的技术难度,需要rpc框架支持 Server side implement 架构简单 ...

  6. Kafka详细教程加面试题

    一.部署kafka集群 启动zookeeper服务: zkServer.sh start 修改配置文件config/server.properties #broker 的全局唯一编号,不能重复 bro ...

  7. 如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)

    亲测有效的更改RHEL7或CentOS 7的网卡名称的方法, 按照以下4步来操作就可以实现! Step 1 :网卡配置文件名称重命名为eth0[root@localhost ~]# ifconfige ...

  8. RTSP H264/HEVC 流 Wasm 播放

    本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放.涉及 WebSocket 代理发送流数据, Wasm 前端解码等. 代码: https://github.com/ikuokuo/rt ...

  9. NumPy的基本操作

    1 简介 NumPy 是用于处理数组的 python 库,部分用 Python 编写,但是大多数需要快速计算的部分都是用 C 或 C ++ 编写的.它还拥有在线性代数.傅立叶变换和矩阵领域中工作的函数 ...

  10. 20210821 打表,蛇,购物,ants

    考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...