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

解题思路:

CDQ分治很好的模板。

运用了线段树/树状数组扫描线的思想。

或者说是离线解题时的控制端点动态更新。

动态处理问题获得解还是非常神的思路。

相当于将解集拆分成若干份,每份使用动态统计。

换句话说,就是将一定范围内的数据配对时间复杂度降低。

注意要撤销操作。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct pnt{
int x,y,z,f,w;
bool friend operator == (pnt a,pnt b)
{
return a.x==b.x&&a.y==b.y&&a.z==b.z;
}
bool friend operator != (pnt a,pnt b)
{
return !(a.x==b.x&&a.y==b.y&&a.z==b.z);
}
}p[],q[];
int n,k;
int cnt;
int d[];
int line[];
int has[];
int lowbit(int x)
{
return x&(-x);
}
bool cmx(pnt a,pnt b)
{
if(a.x==b.x&&a.y==b.y)
return a.z<b.z;
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool cmy(pnt a,pnt b)
{
if(a.x==b.x&&a.y==b.y)
return a.z<b.z;
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
void add(int p,int v)
{
while(p<=k)
{
line[p]+=v;
p+=lowbit(p);
}
return ;
}
int ask(int p)
{
int ans=;
while(p)
{
ans+=line[p];
p-=lowbit(p);
}
return ans;
}
void wrk(int l,int r)
{
int m=(l+r)>>;
sort(p+l,p+m+,cmy);
sort(p+m+,p+r+,cmy);
int tmp=-;
for(int i=l,j=m+;j<=r;j++)
{
for(;i<=m&&p[i].y<=p[j].y;i++)
{
add(p[i].z,p[i].w);
tmp=i;
}
p[j].f+=ask(p[j].z);
}
for(int i=l;i<=tmp;i++)
add(p[i].z,-p[i].w);
}
void cdq(int l,int r)
{
if(l==r)
return ;
int m=(l+r)>>;
cdq(l,m);
cdq(m+,r);
wrk(l,r);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
sort(q+,q+n+,cmx);
int wgt=;
for(int i=;i<=n;i++)
{
wgt++;
if(q[i]!=q[i+])
{
p[++cnt]=q[i];
p[cnt].w=wgt;
wgt=;
}
}
swap(cnt,n);
cdq(,n);
for(int i=;i<=n;i++)
has[p[i].f+p[i].w-]+=p[i].w;
for(int i=;i<cnt;i++)
printf("%d\n",has[i]);
return ;
}

BZOJ3262: 陌上花开(三维偏序,CDQ分治)的更多相关文章

  1. BZOJ3262 陌上花开 —— 三维偏序 CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit ...

  2. bzoj3262: 陌上花开 三维偏序cdq分治

    三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...

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

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

  4. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  5. BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...

  6. BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...

  7. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  8. 三维偏序[cdq分治学习笔记]

    三维偏序 就是让第一维有序 然后归并+树状数组求两维 cdq+cdq不会 告辞 #include <bits/stdc++.h> // #define int long long #def ...

  9. BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)

    一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w; //for(; x <= n; ...

随机推荐

  1. uvalive 4730王国kingdom(并查集+线段树)

     题意:有T组測试数据.每组数据的N表示有N个城市,接下来的N行里每行给出每一个城市的坐标(0<=x,y<=1000000),然后有M(1<M<200000)个操作,操作有 ...

  2. 智课雅思短语---二、exert positive/ negative effects on…

    智课雅思短语---二.exert positive/ negative effects on… 一.总结 一句话总结:对…产生有利/不利的影响 1.the advantages far outweig ...

  3. SSH之IDEA2017整合Struts2+Spring+Hibernate

    转自:https://blog.csdn.net/sysushui/article/details/68937005

  4. 常见的C字符串处理函数的源代码

    #include <stdio.h> #include <assert.h> char *strcpy(char *strDest,const char *strSrc) // ...

  5. bean初始化、注销

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...

  6. Linux下CD/DVD刻录软件

    1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...

  7. Yeslab 华为安全HCIE七门之-防火墙基础(12篇)

    Yeslab 华为安全HCIE七门之-防火墙基础(12篇) Yeslab 全套华为安全HCIE七门之第二门防火墙基础(12篇),第一门课论坛很早就有了,可自行下载,后面的陆续分享给大家. 华为安全HC ...

  8. jQuery 判断是否包含在数组中 jQuery.inArray()

    var arr = [ "mysql", "php", "css", "js" ];   $.inArray(" ...

  9. JAVA 获取访问者IP

    * 获取访问者IP * * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效. * * 本方法先从Header中获取X-Real- ...

  10. nio实现文件读取写入数据库或文件

    1.nio实现读取大文件,之后分批读取写入数据库 2.nio实现读取大文件,之后分批写入指定文件 package com.ally; import java.io.File; import java. ...