【题意】三维偏序,给定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: 陌上花开的更多相关文章

  1. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  2. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

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

  3. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  4. BZOJ 3262 陌上花开 ——CDQ分治

    [题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...

  5. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...

  6. BZOJ 3262 陌上花开 CDQ分治

    = =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...

  7. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

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

  8. 【刷题】BZOJ 3262 陌上花开

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

  9. BZOJ 3262: 陌上花开 CDQ

    这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...

  10. bzoj 3262 陌上花开 【CDQ分治】

    三维偏序 首先把所有花按 x一序,y二序,z三序 排序,然后去重,con记录同样的花的个数,然后进行cdq 现在假设有[l.r]区间,其中[l,mid] [mid+1,r],已经递归处理完毕.我们把区 ...

随机推荐

  1. emacs编译整个emacs.d目录

    $emacs 在emacs查看里面,输入: C-u M-x byte-recompile-directory 然后输入 ~/.emacs.d 即可.

  2. IT行业所面临的问题

    在阅读了“2015 IT行业大学生就业分析报告”和“2014年十大最热门行业和职业排行榜 IT行业最吃香_联展新闻”两则新闻后,我决定用一篇和老师对话的形式来表达我的感受. dym:人潮汹涌的招聘市场 ...

  3. IT行业大学生就业分析报告感想

    现如今的高校毕业生每年都在增长,就业压力只增不减,人才市场挤满了人 学生们普遍的表现出就业难的情况,并且适合自己的工作也难找 从报告中也容易看出IT行业很吸引人,也是人数最多的,因此机会也就变少了 在 ...

  4. CDN问题

    名称解释:正反向解析 主辅服务器 domain zone 记录:SOA.NS.A.CNAME.PRT.MX DNS配置文件中各字段作用,如TTL DNS端口号? TCP53和UDP53使用场合 Lin ...

  5. (四)Jmeter之逻辑控制器(Logic Controller)

    Jmeter之逻辑控制器(Logic Controller) 前言: 1. Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in w ...

  6. zookeeper学习之集群环境搭建

    一.安装环境 zookeeper:3.4.6 JDK:1.8 linux:centos6.5  64位 主机: server0:192.168.0.224server1:192.168.0.225se ...

  7. 怎么用JavaScript实现tab切换

    先看一下代码实现后的最终效果: 用JavaScript实现思路很简单,就是先把所有的内容隐藏,点击标题对应的内容显示, css代码如下: <style type="text/css&q ...

  8. jquery实现可编辑的下拉框( input + select )

    HTML: <input id="inputModel" /> <select name="EngineModel" size="1 ...

  9. Catalan数,括号序列和栈

    全是入门的一些东西.基本全是从别处抄的. 栈: 支持单端插入删除的线性容器. 也就是说,仅允许在其一端加入一个新元素或删除一个元素. 允许操作的一端也叫栈顶,不允许操作的一端也叫栈底. 数个箱子相叠就 ...

  10. 【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP

    题目描述 给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和. $n\le 12,m\le 10^9$ 题解 DFS+KMP 对 ...