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. hadoop ssh 问题WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    0.0.0.0: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0.0.0.0: @    WARNING: REMOTE HO ...

  2. 校内选拔I题题解 构造题 Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) ——D

    http://codeforces.com/contest/574/problem/D Bear and Blocks time limit per test 1 second memory limi ...

  3. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  4. pseudogene|鉴定功能基因|expressed se|quence tag

    基因 (鉴定DNA:可以直接利用DNA序列鉴别基因,但存在3个问题) 1.intron太长(使用用来连接的算法不可及) 2.因为通常功能基因的第一个oxen中有非编码区和启动子最后一个oxen中有终止 ...

  5. 基于PassThru的NDIS中间层驱动程序扩展

    基于PassThru的NDIS中间层驱动程序扩展                                  独孤求真 概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身 ...

  6. ios retain copy 以及copy协议

    阅读本文之前首先了解Copy与Retain的区别: Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1. Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的 ...

  7. bzoj5138 [Usaco2017 Dec]Push a Box

    题目描述: bz luogu 题解: 暴力可以记录$AB$位置转移,这个时候状态是$n^4$的,无法接受. 考虑只记录$A$在$B$旁边时的状态,这个时候状态时$n^2$的. 所以说转移有两种,一种是 ...

  8. golang 实现冒泡排序

    package main import ( "fmt" ) func main(){ a := [...] int{2,5,9,6,8} fmt.Println(a) num := ...

  9. Go统计键盘输入随机字母的个数

    package main import "fmt" //通过键盘输入20个小写字母,统计个数 func main(){ //通过键盘器获取字符 var arr [20]byte f ...

  10. 破解点触码的识别之第三方平台超级鹰的SDK(python3版本)

    import requestsfrom hashlib import md5 class Chaojiying(object): def __init__(self, username, passwo ...