原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html

题目传送门 - BZOJ3262

题目传送门 - 洛谷P3810

题意

  有$n$个元素,第$i$个元素有$a_i$、$b_i$、$c_i$三个属性,设$f(i)$表示满足$a_j\leq a_i$且$b_j\leq b_i$且$c_j\leq c_i$的$j$的数量。对于$d\in [0,n)$,求$f(i)=d$的数量。

  $n\leq 100000,max\{a_i,b_i,c_i|i\in[1,n]\}<=200000$

题解

  三维偏序模版题。

  CDQ分治一波。树套树也可以。

  CDQ分治思路:

    一维偏序:直接排序。

    二维偏序:树状数组。

    三维偏序:第3维套CDQ分治。

  对于第一维和第二维我们还是按照原样处理。

  对于第三维,我们考虑分治。

  首先显然要排序。

  对于一个区间$[L,R]$,首先求得$mid=\left\lfloor\frac{L+R}{2}\right\rfloor$。

  然后考虑先分治$[L,mid]$和$[mid+1,R]$。

  然后通过树状数组的做法,用左区间来更新右区间。注意树状数组的还原。

  总体来说,对于第3维,是在开始的时候保存了rank。对于第2维,是在递归的过程中归并得到了有序排列。对于第1维,由于一开始排序的时候作为了第3关键字,而归并排序具有稳定性,所以,对于第二维相同的,第三维是有序的。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=100005;
struct Node{
int x,y,z,rank,res;
void get(){
scanf("%d%d%d",&x,&y,&z),res=0;
}
}a[N],b[N];
int n,k,tree[N*2],tot[N];
bool cmp(Node a,Node b){
if (a.x!=b.x)
return a.x<b.x;
if (a.y!=b.y)
return a.y<b.y;
return a.z<b.z;
}
bool issame(Node a,Node b){
return a.x==b.x&&a.y==b.y&&a.z==b.z;
}
void sameadd(){
int tot=1,last=n;
for (int i=n-1;i>=1;i--)
if (issame(a[i],a[last]))
a[i].res+=tot++;
else
last=i,tot=1;
}
int lowbit(int x){
return x&-x;
}
void add(int x,int y){
for (;x<=k;x+=lowbit(x))
tree[x]+=y;
}
int sum(int x){
int ans=0;
for (;x>0;x-=lowbit(x))
ans+=tree[x];
return ans;
}
void CDQ(int L,int R){
if (L==R)
return;
int mid=(L+R)>>1,cnt=L;
CDQ(L,mid),CDQ(mid+1,R);
for (int i=L,l=L,r=mid+1;i<=R;i++)
if (r>R||(l<=mid&&a[l].y<=a[r].y))
b[cnt++]=a[l++];
else
b[cnt++]=a[r++];
for (int i=L;i<=R;i++){
a[i]=b[i];
if (a[i].rank<=mid)
add(a[i].z,1);
else
a[i].res+=sum(a[i].z);
}
for (int i=L;i<=R;i++)
if (a[i].rank<=mid)
add(a[i].z,-1);
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
a[i].get();
sort(a+1,a+n+1,cmp);
sameadd();
for (int i=1;i<=n;i++)
a[i].rank=i;
memset(tree,0,sizeof tree);
CDQ(1,n);
memset(tot,0,sizeof tot);
for (int i=1;i<=n;i++)
tot[a[i].res]++;
for (int i=0;i<n;i++)
printf("%d\n",tot[i]);
return 0;
}

  

BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组的更多相关文章

  1. 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)

    洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...

  2. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  3. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

  4. 【题解】洛谷P1966 [NOIP2013TG] 火柴排队(树状数组+逆序对)

    次元传送门:洛谷P1966 思路 显然在两排中 每排第i小的分别对应就可取得最小值(对此不给予证明懒) 所以我们只在意两排的火柴是第几根 高度只需要用来进行排序(先把两个序列改成有序的方便离散化) 因 ...

  5. D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

    题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...

  6. 洛谷P3246 [HNOI2016]序列(离线 差分 树状数组)

    题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\ ...

  7. 洛谷 : P3374 【模板】树状数组 1 P3368 【模板】树状数组 2

    ******************************************************************************** 属于模板题了,一个单点修改区间询问,一 ...

  8. 洛谷P4054 [JSOI2009]计数问题(二维树状数组)

    题意 题目链接 Sol 很傻x的题.. c才100, n, m才300,直接开100个二维树状数组就做完了.. #include<bits/stdc++.h> using namespac ...

  9. 模板【洛谷P3368】 【模板】树状数组 2

    P3368 [模板]树状数组 2 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 树状数组区间加,单点查询. code: #include <i ...

随机推荐

  1. PYTHON- 操作系统和python程序

    操作系统基础 应用程序的启动:(重点!!!) python解释器安装,多版本共存 执行python程序的两种方式 运行一个python程序经历的三个阶段(重要) python 的内存管理 ====== ...

  2. liunx 安装redis 4.0

    liunx 上安装redis 4.0.1 第一步:将 redis-4.0.1.tar.gz 压缩问上传至/home目录下 第二步: 解压文件  tar -zxvf  redis-4.0.1.tar.g ...

  3. 分享一份非常强势的Android面试题

    马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考链接: https://blog.c ...

  4. iOS UIDatePicker设置为中文的方法

    UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 20, 200, 30)]; datePick ...

  5. Oracle数据库的状态查询

    本文来源:huang_xw 的<Oracle数据库的状态查询> 1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; ST ...

  6. Linux永久修改IP地址

    通常我们为了快速修改IP地址,会这么做 ifconfig eth0 192.168.0.2 netmask 255.255.255.0 这样修改IP地址后,你再运行ifconfig命令后,的确IP地址 ...

  7. Confluence 6 导入模板的定义

    模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...

  8. 中介模型以及优化查询以及CBV模式

    一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...

  9. MySQL5.7.20安装过程报错CMake Error at cmake/boost.cmake:81 (MESSAGE):

    MySQL在5.7版本及以后,都需要boots 库,所以需要先安装boots 步骤: 1.在/usr/local下创建 名为boots的目录 mkdir -p /usr/local/boots 2.进 ...

  10. Docker相关释义

    Docker相关释义 基础网站:http://www.runoob.com/docker/docker-tutorial.html Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上, ...