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

HINT

1 <= N <= 100,000, 1 <= K <= 200,000

/*
这个东西好像叫三维偏序,就是排序一维,cdq一维,树状数组一维。
自己尝试码了码,但是出现了很多问题,然后看了看网上的代码,感觉还是不怎么懂
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 500010
using namespace std;
int now,n,ans[N],k;
struct node{
int c,s,m,num,ans;
};node a[N],b[N],q[N];
struct Node{
int v,T;
};Node t[N*];
bool cmp(node a,node b){
if(a.s==b.s&&a.c==b.c)return a.m<b.m;
if(a.s==b.s)return a.c<b.c;
return a.s<b.s;
}
bool cmp2(node a,node b){
if(a.c==b.c&&a.s==b.s)return a.m<b.m;
if(a.c==b.c)return a.s<b.s;
return a.c<b.c;
}
void modify(int x,int v){
while(x<=k){
if(t[x].T==now) t[x].v+=v;
else t[x].T=now,t[x].v=v;
x+=x&(-x);
}
}
int query(int x){
int sum=;
while(x){
if(t[x].T==now)sum+=t[x].v;
x-=x&(-x);
}
return sum;
}
void cdq(int l,int r){
if(l==r){
a[l].ans+=(a[l].num-);
return;
}
int m=l+r>>;
int q1=l,q2=m+;
for(int i=l;i<=r;i++)
if(q1<=m&&a[i].s<=m)
q[q1++]=a[i];
else q[q2++]=a[i];
for(int i=l;i<=r;i++)
a[i]=q[i];
cdq(l,m);
now++;
int j=l;
for(int i=m+;i<=r;i++){
for(;j<=m;j++)
if(a[i].c>=a[j].c)modify(a[j].m,a[j].num);
else break;
a[i].ans+=query(a[i].m);
}
cdq(m+,r);
q1=l;q2=m+;
for(int i=l;i<=r;i++)
if((a[q1].c<=a[q2].c||q2>r)&&q1<=m)
q[i]=a[q1++];
else q[i]=a[q2++];
for(int i=l;i<=r;i++)
a[i]=q[i];
}
int main(){
now=;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d%d",&a[i].s,&a[i].c,&a[i].m);
a[i].num=;
}
sort(a+,a+n+,cmp);
int tot=;
for(int i=;i<=n;i++){
int k=(a[i].s==a[i-].s)&(a[i].c==a[i-].c)&(a [i].m==a[i-].m);
if(i==||!k)a[++tot]=a[i];
else a[tot].num++;
}
for(int i=;i<=tot;i++)a[i].s=i;
sort(a+,a+tot+,cmp2);
cdq(,tot);
for(int i=;i<=tot;i++)
ans[a[i].ans]+=a[i].num;
for(int i=;i<n;i++)
printf("%d\n",ans[i]);
return ; }

陌上花开(bzoj 3262)的更多相关文章

  1. 陌上花开 HYSBZ - 3262 (CDQ分治)

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

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

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

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

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

  4. 【BZOJ 3262】 3262: 陌上花开 (CDQ分治)

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

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

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

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

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

  7. bzoj 3262 陌上花开

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

  8. BZOJ 3262 陌上花开 CDQ分治

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

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

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

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

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

随机推荐

  1. 51nod 1283 最小周长

    一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为 ...

  2. ubuntu 14.04 安装mysql,并配置远程连接和中文乱码

    1. 安装MySQL的jar root@computer-PowerEdge-T30:~# sudo apt-get install mysql-server mysql-client在本次安装中,根 ...

  3. OpenCascade: 获取边的端点

    FirstV = TopExp::FirstVertex(aEdge1); LastV = TopExp::LastVertex(aEdge1);

  4. haproxy文件的增删改查

    在构建一个程序项目之前,首先需要设计程序的框架,从总体上构建一个项目中的一个个功能,之后对每一个功能进行补充,最终实现总体的功能. 1 程序的总体框架: 首先把所有的功能设计成相应的函数,用pass来 ...

  5. Mac如何让调整窗口大小更简单

    在使用Mac的时候,你能把鼠标的光标悬停在任何程序的边缘,当光标自动变成箭头样式后,按住鼠标左键你将能随意拖动来改变程序窗口的大小.但是,这里有个问题,我们有时候很难控制把鼠标光标移动在正确的窗口边缘 ...

  6. Codeforces Round #275(Div. 2)-C. Diverse Permutation

    http://codeforces.com/contest/483/problem/C C. Diverse Permutation time limit per test 1 second memo ...

  7. js采用正则表达式获取地址栏参数

    getQueryString:function(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*) ...

  8. ios之UIButoon

    第一.UIButton的定义 UIButton *button=[[UIButton buttonWithType:(UIButtonType); 能够定义的button类型有以下6种, typede ...

  9. Luogu P2664 树上游戏 dfs+树上统计

    题目: P2664 树上游戏 分析: 本来是练习点分治的时候看到了这道题.无意中发现题解中有一种方法可以O(N)解决这道题,就去膜拜了一下. 这个方法是,假如对于某一种颜色,将所有这种颜色的点全部删去 ...

  10. Java--容器/集合类(Collection)理解和使用

    .数组和集合的比较 数组:长度固定,用来存放基本类型的数据 集合:长度不固定,用来存放对象的引用 二.集合类的基本概念 1.java.util包中提供了一些集合类,这些集合类也被称为容器. 常用的集合 ...