关于CDQ,是大神陈丹琦写出来的算法,具体的看这个连接

https://www.cnblogs.com/lck-lck/p/9657753.html

https://blog.csdn.net/wu_tongtong/article/details/78785836

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

Hint

Source黑暗爆炸3262

好的那么这就是个三维的偏序问题,要注意一下会有重复的(属性相同的花),要去重,然后自己不能比自己更美丽,这个三维的要用树状数组搞一下,当然线段树也可以,但是时间常数太大,然后每次的sort是nlogn的有点慢,可以用拆分的优化成n

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
struct node{int x,y,z,ans,nub;//三个维度在这道题里面就是花的三个性质,ans表示该花优于多少朵花,nub表示和这个花相同属性的花有多少朵
}a[maxn];
int siz,hight,treearray[maxn<<2],cnt,ans[maxn];//tree树状数组,cnt是去重之后的元素个数
inline int cmp2(struct node a,struct node b){if(a.y!=b.y)return a.y<b.y;elsereturn a.z<b.z;
}
inline int cmp1(struct node a,struct node b){if(a.x!=b.x)return a.x<b.x;else return cmp2(a,b);
}
inline void add(int locate,int nub){//树状数组 while(locate<=hight){treearray[locate]+=nub;locate+=locate&(-locate);}return;
}
inline int quary(int locate){//树状数组 int ans=0;while(locate>0){ans+=treearray[locate];locate-=locate&(-locate);}return ans;
}
void cdq(int l,int r){if(l==r)return ;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);sort(a+l,a+mid+1,cmp2);//按照y,z的顺序排序 sort(a+mid+1,a+r+1,cmp2);int pl=l,pr=mid+1;for(;pr<=r;pr++){while(pl<=mid&&a[pl].y<=a[pr].y){//若第二维的左子区间的a[pl].y对右子区间产生了贡献add(a[pl].z,a[pl].nub);//就把第三维的a[pl].z扔进树状数组,这里左子区间的元素最多会被仍进去一次 pl++;}a[pr].ans+=quary(a[pr].z);} for(int i=l;i<=mid&&a[i].y<=a[r].y;i++)//这里每次结束的时候或者在cdq开始的时候要清空树状数组,但是如果用memset会超时,所以这里对于每个被扔进去的在把他减掉 add(a[i].z,-a[i].nub);return;
}
int main(){scanf("%d%d",&siz,&hight);for(int i=1;i<=siz;i++){scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);}sort(a+1,a+siz+1,cmp1);//先按照x,y,z的优先去排序,消除x的影响 for(int i=1;i<=siz;i++){if(a[i].x!=a[cnt].x||a[i].y!=a[cnt].y||a[i].z!=a[cnt].z)//去重 a[++cnt]=a[i];a[cnt].nub++;}cdq(1,cnt);//CDQ分治 for(int i=1;i<=cnt;i++){ans[a[i].ans+a[i].nub-1]+=a[i].nub;//把去重的过程还原回来并计算ans数组 }for(int i=0;i<siz;i++){printf("%d\n",ans[i]);}return 0;
}

2021.9.22

CDQ分治[陌上花开 ]相关推荐

  1. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1439  Solved: 648 [Submit][Status][Discu ...

  2. 陌上花开 HYSBZ - 3262 (CDQ分治)

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

  3. bzoj 3262: 陌上花开(cdq分治)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2433  Solved: 1087 [Submit][Status][Disc ...

  4. BZOJ3262: 陌上花开(cdq分治)

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 3627  Solved: 1705 [Submit][Status][Discuss] Descri ...

  5. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

  6. 【教程】简易CDQ分治教程学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  7. CDQ 分治算法模板

    CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...

  8. Wannafly模拟赛2: A. Contest(Cdq分治)

    题目描述 n支队伍一共参加了三场比赛. 一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高. 求有多少组(x,y),使得x自己觉得比y强,y自己也觉得比x强. (x, y), ( ...

  9. cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)

    CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...

最新文章

  1. 二维字符数组按长度排序_字符串长度 字符数组长度
  2. 【数据结构与算法】之深入解析“解码方法”的求解思路与算法示例
  3. unc0ver 发布新版本支持 iOS 13.3 越狱
  4. select 移动端 第一个无法选中_总结在移动端碰到的坑
  5. extjs string类型转date_extjs 处理Object格式的Date对象
  6. cpu要和gpu搭配吗_搞懂GPU为什么比CPU“快”
  7. 数据结构 统计二叉树中度为0,1和2的结点个数
  8. Linux操作系统 (二)下载以及安装
  9. 腾讯产品经理能力模型
  10. 在Vue中使用Aliplayer,做视频播放或者视频监控
  11. 基因组数据质控中:先进行SNP缺失质控还是样本缺失质控?
  12. python发送邮件 退回_用python发邮件给gmail用户,被gmail当成spam退回
  13. c语言对数函数log的使用
  14. hdmi tv 的edid_HDMI之EDID分析
  15. 技术分享 | 排序(filesort)详细解析(8000 字长文)
  16. 计算机三级 计算机三级网络技术 如何两天内通过考试
  17. A040_SpringMVC进阶_JSON
  18. 7-20 表达式转换 (25 分)
  19. 一个大神的twitter
  20. uploadify上传控件

热门文章

  1. 教女友学会python+yolov3调用笔记本摄像头——实时进行识别
  2. 2021年电工(初级)考试内容及电工(初级)答案解析
  3. python 导入magenta失败,报AttributeError错误解决办法
  4. winForm安装ReportViewer
  5. 什么是OADM光分插复用器
  6. linux打印服务叹号,linux中如何通过echo输出!(叹号)? -bash: !: event not found
  7. 一个vue组件完成的音乐播放器
  8. Operating Systems:Three-Easy-Pieces
  9. PIC 脉冲调控PWM模块
  10. Flask 的替代品 aiohttp 和 Quart