【洛谷P3810】陌上花开
题目大意:给定一个三维空间点的坐标,求对于任意一个点三维均小于等于这个点的点个数。
题解:学会了简单的 cdq 分治。
首先,先将第一维从小到大排序,再用类似归并排序的操作对第二维进行排序,在第二维合并的过程中,用树状数组维护第三维,统计左半部分对右半部分答案的贡献。
需要注意的几点问题,如下:
- 如果有几个点的三个维度完全相同的话,需要做去重处理,因为每个点在归并的时候只会将在这个点左边的点计入该点的答案贡献,但是实际上对于这些相同的点来说,其他所有相同的点对任意一个点都有相同的答案贡献。
- 在 cdq 分治进行的过程中,原本有序的第一维会变得无序,但是仍然满足左半部分的 x 小于右半部分的 x,而统计答案贡献也只是统计左半部分对右半部分的贡献,因此不会出现答案错误的问题。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct opt{
int x,y,z,cnt,num;
bool operator<(const opt &rhs)const{
return this->x==rhs.x?(this->y==rhs.y?this->z<rhs.z:this->y<rhs.y):this->x<rhs.x;
}
}a[maxn],d[maxn],tmp[maxn];
int n,m,tot,ans[maxn];
void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(a[i].x!=a[i-1].x||a[i].y!=a[i-1].y||a[i].z!=a[i-1].z)d[++tot]=a[i];
++d[tot].cnt;
}
}
int bit[maxn<<1];
inline void modify(int pos,int val){for(int i=pos;i<=m;i+=i&-i)bit[i]+=val;}
inline int query(int pos){int res=0;for(int i=pos;i;i-=i&-i)res+=bit[i];return res;}
void cdq(int l,int r){
if(l==r)return;
int mid=l+r>>1;
cdq(l,mid),cdq(mid+1,r);
int x=l,y=mid+1;
for(int i=l;i<=r;i++){
if(y>r||(x<=mid&&d[x].y<=d[y].y))tmp[i]=d[x++],modify(tmp[i].z,tmp[i].cnt);
else tmp[i]=d[y++],tmp[i].num+=query(tmp[i].z);
}
for(int i=l;i<=mid;i++)modify(d[i].z,-d[i].cnt);
for(int i=l;i<=r;i++)d[i]=tmp[i];
}
void solve(){
cdq(1,tot);
for(int i=1;i<=tot;i++)ans[d[i].num+d[i].cnt-1]+=d[i].cnt;
for(int i=0;i<n;i++)printf("%d\n",ans[i]);
}
int main(){
read_and_parse();
solve();
return 0;
}
【洛谷P3810】陌上花开的更多相关文章
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- 洛谷P3810 陌上花开 (cdq)
最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题) 这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可. 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献, ...
- 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)
在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...
- [洛谷P3810]【模板】三维偏序(陌上花开)
题目大意:有$n$个元素,第$i$个元素有三个属性$a_i,b_i,c_i$,设$f(i)=\sum\limits_{i\not = j}[a_j\leqslant a_i,b_j\leqslant ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- 【算法学习】【洛谷】cdq分治 & P3810 三维偏序
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
随机推荐
- 基于vue-cli,sass,vant的移动端项目
项目架构 开始 vue init webpack 项目名称 //新建项目,cd进入新项目 npm install axios //先安装! ...
- clone内容包含select2
如果克隆的内容包含select2,克隆之后要先删除select之后自动生成的span,再对select2进行初始化,生成新的元素.
- js对字符串的一些操作方法
1.charCodeAt(index); 返回一个整数,代表下标位置上字符的Unicode的编码. 2.fromCharCode(code1,code2,code3,...); code1代表Unic ...
- 图解Python的直接赋值与浅拷贝和深度拷贝三者区别
直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ...
- python之路--JavaScript
一. JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,希望这门语言能成为国际化标准,于是决定将Jav ...
- python之路--进程内容补充
一. 进程的其他方法 进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号 import time import os from multipr ...
- 将WCF寄宿在托管的Windows服务中
在我之前的一篇博客中我介绍了如何发布WCF服务并将该服务寄宿于IIS上,今天我再来介绍一种方式,就是将WCF服务寄宿在Windows服务中,这样做有什么好处呢?当然可以省去部署IIS等一系列的问题,能 ...
- Java中的super()使用注意
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的 ...
- qtp 自动化测试--点滴 自定义显示工具菜单 trzedit
tools-customize-toolbars-勾选后关闭 2 trzedit 使用winobject 方法取值 Window("驷惠WIN系列[汽车4S连锁管理软件] 6.") ...
- 深度学习+CRF解决NER问题
参考https://github.com/shiyybua/NER 1.开发环境:python3.5+tensorflow1.5+pycharm 2.从https://github.com/shiyy ...