【BZOJ】3262: 陌上花开
【题意】三维偏序,给定n个点(x,y,z),求每个点和(0,0,0)组成空间中的点数,有重点。1<=x,y,z<=2*10^5,1<=n<=10^5。
【算法】CDQ分治+树状数组
【题解】CDQ算法知识
三维偏序,一维排序扫描线(x),一维树状数组前缀和(y),一维CDQ分治(z作为时间维)。
1.将重复的点统一为一个并附加数量的属性。
2.将z作为时间维,按照z-x-y排序后对z重编号为1~n(时间维不允许重复数字,否则无法分治),再按x-y-z排序(时间维依然要作为第三关键字排序)。
3.CDQ分治,最后得到的a[]数组自然变成了按照z-x-y排序的结果。
4.统计答案,d[ans[i]+a[i].w-1]+=a[i].w。
- #include<cstdio>
- #include<cstring>
- #include<cctype>
- #include<algorithm>
- #define lowbit(x) (x&-x)
- using namespace std;
- int read(){
- char c;int s=,t=;
- while(!isdigit(c=getchar()))if(c=='-')t=-;
- do{s=s*+c-'';}while(isdigit(c=getchar()));
- return s*t;
- }
- const int maxn=;
- struct cyc{int t,x,y,w;}a[maxn],b[maxn];
- int n,m,c[maxn],d[maxn],ans[maxn];
- bool cmp(cyc a,cyc b){return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.t<b.t);}
- bool cmp2(cyc a,cyc b){return a.t<b.t||(a.t==b.t&&a.x<b.x)||(a.t==b.t&&a.x==b.x&&a.y<b.y);}
- void modify(int x,int k){for(int i=x;i<=m;i+=lowbit(i))c[i]+=k;}
- int find(int x){int as=;for(int i=x;i>=;i-=lowbit(i))as+=c[i];return as;}
- void CDQ(int l,int r){
- if(l==r)return;
- int mid=(l+r)>>;
- for(int i=l;i<=r;i++)if(a[i].t<=mid)modify(a[i].y,a[i].w);else ans[a[i].t]+=find(a[i].y);
- for(int i=l;i<=r;i++)if(a[i].t<=mid)modify(a[i].y,-a[i].w);
- int x1=l-,x2=mid;
- for(int i=l;i<=r;i++)if(a[i].t<=mid)b[++x1]=a[i];else b[++x2]=a[i];
- for(int i=l;i<=r;i++)a[i]=b[i];
- CDQ(l,mid);CDQ(mid+,r);
- }
- int main(){
- n=read();m=read();int N=n;
- for(int i=;i<=n;i++)a[i].t=read(),a[i].x=read(),a[i].y=read();
- sort(a+,a+n+,cmp2);
- int tot=,num=;
- for(int i=;i<=n;i++){
- num++;
- if(a[i].t!=a[i+].t||a[i].x!=a[i+].x||a[i].y!=a[i+].y){
- b[++tot]=a[i];b[tot].w=num;
- num=;
- }
- }
- n=tot;
- for(int i=;i<=n;i++)a[i]=b[i],a[i].t=i;
- sort(a+,a+n+,cmp);
- CDQ(,n);
- for(int i=;i<=n;i++)d[ans[i]+a[i].w-]+=a[i].w;
- for(int i=;i<N;i++)printf("%d\n",d[i]);
- return ;
- }
【BZOJ】3262: 陌上花开的更多相关文章
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)
题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...
- BZOJ 3262 陌上花开 ——CDQ分治
[题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...
- bzoj 3262 陌上花开
本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...
- BZOJ 3262 陌上花开 CDQ分治
= =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 【刷题】BZOJ 3262 陌上花开
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- BZOJ 3262: 陌上花开 CDQ
这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...
- bzoj 3262 陌上花开 【CDQ分治】
三维偏序 首先把所有花按 x一序,y二序,z三序 排序,然后去重,con记录同样的花的个数,然后进行cdq 现在假设有[l.r]区间,其中[l,mid] [mid+1,r],已经递归处理完毕.我们把区 ...
随机推荐
- 跨域写cookie
假设a站想往b站写cookie,那么目前有两种方案,参考如下: 第一种(使用jsonp): a站js代码如下: $.ajax({ url: 'http://www.b.com/jsonp.jsp?do ...
- EF 联合查询
EF 文章表和标签表联合查询标签id在dis中的文章,还不知道性能如何 var query = tagRepo.Entities.Include("Tags").Where(t = ...
- Java实现的词频统计——单元测试
前言:本次测试过程中发现了几个未知字符,这里将其转化为十六进制码对其加以区分. 1)保存统计结果的Result文件中显示如图: 2)将其复制到eclipse环境下的切分方法StringTokenize ...
- Cmder命令行工具在Windows系统中的配置
一.Cmder简介 Cmder:一款用于Windows系统中,可增强传统cmd命令行工具的控制台模拟器(类似于Linux系统中的终端控制窗口) 特点: 无需安装,解压即用 可使用较多Linux命令,如 ...
- Win2019 显示 SMBV1 协议不安全的处理
1. 登录有问题. 报错 [Window Title] \\10.100.1.163 [Content] \\10.100.1.163 因为文件共享不安全,所以你不能连接到文件共享.此共享需要过时的 ...
- linux下c/c++的文件操作
opendir,readdir,closedir, stat()查询文件状态 open(), O_TRUNC这个Flag会把打开的文件清零... 文件锁:fcntl, F_GETLK , F_SETL ...
- 利用书签功能对TDBGrid控件中多个记录的处理
DELPHI 的TDBGrid 控 件 主 要 用 来 处 理 数 据 表, 它 的 属 性 中 有 一 个dgMultiSelect, 若 此 属 性 设 定 为TRUE, 则 可 以 选 中 多 ...
- 分页---Vue+.net+bootstrap实现
通过学习Vue,的确觉的Vue的双向绑定使用起来十分方便,因此研究了一下列表显示时分页的实现,这里我使用了bootstrap的样式,所以在页面中引用bootstrap的样式文件,后台提数据源使用.ne ...
- Vue.js 判断对象属性是否存,不存在添加
Vue.set是可以对对象添加属性的,这里item对象添加一个checked属性 //if(typeof item.checked=='undefined'){if(!this.item.checke ...
- LBP纹理特征[转自]
LBP方法(Local binary patterns)是一个计算机视觉中用于图像特征分类的一个方法.LBP方法在1994年首先由T. Ojala, M.Pietikäinen, 和 D. Harwo ...