【bzoj3262】陌上花开

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分治的裸题,三维偏序。

先对于一维排序,满足ai递增,然后在分成的两端区间中,左区间以bi排序,右区间以bi排序,处理左

区间对右区间的影响,因为左区间的ai一定<=右区间ai,然后类似归并操作,如果左bi<=右bi则将

ci放入树状数组中即可,然后bi查询一下,有多少个。

 #include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> #define ll long long
#define NN 2000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f*x;
} int n,m,tr[NN],ans[NN];
struct Node
{
int a,b,c,s,ans;
}a[NN],p[NN]; inline int lowbit(int x)
{
return x&(-x);
}
inline void updata(int x,int num)
{
for (int i=x;i<=m;i+=lowbit(i))
tr[i]+=num;
}
inline int query(int x)
{
int res=;
for (int i=x;i>=;i-=lowbit(i))
res+=tr[i];
return res;
}
inline bool cmp1(Node x,Node y)
{
if (x.a==y.a&&x.b==y.b) return x.c<y.c;
if (x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
inline bool cmp2(Node x,Node y)
{
if (x.b==y.b) return x.c<y.c;
return x.b<y.b;
}
void cdq(int l,int r)
{ if (l==r) return;
int mid=(l+r)>>;
cdq(l,mid),cdq(mid+,r);
sort(p+l,p+mid+,cmp2),sort(p+mid+,p+r+,cmp2);
int i=l,j=mid+;
while(j<=r)
{
while(i<=mid&&p[i].b<=p[j].b)
{
updata(p[i].c,p[i].s);
i++;
}
p[j].ans+=query(p[j].c);
j++;
}
for (int j=l;j<i;j++)//只能到i为止
updata(p[j].c,-p[j].s);
}
int main()
{
int N=read();m=read();
for (int i=;i<=N;i++)
a[i].a=read(),a[i].b=read(),a[i].c=read();
sort(a+,a+N+,cmp1);
int cnt=;
for (int i=;i<=N;i++)
{
cnt++;
if (a[i].a!=a[i+].a||a[i].b!=a[i+].b||a[i].c!=a[i+].c)
{
p[++n]=a[i];
p[n].s=cnt;
cnt=;
}
}
cdq(,n);
for (int i=;i<=n;i++)
ans[p[i].ans+p[i].s-]+=p[i].s;
for (int i=;i<N;i++)
printf("%d\n",ans[i]);
}

最新文章

  1. 解决PKIX:unable to find valid certification path to requested target 的问题
  2. tomcat实现ServletContext的addListener方法的源码解说(原创)
  3. SSIS 部署到SQL Job
  4. Groovy轻松入门——搭建Groovy开发环境
  5. spring XML格式
  6. python关于list的三个内置函数filter(), map(), reduce()
  7. 游戏安全有多重要?——GAME-TECH游戏开发者技术沙龙
  8. 我的第一本著作:Spark技术内幕上市!
  9. C#二维码与条形码的生成
  10. Linq中的Select与Select many
  11. Jenkins+PowerShell持续集成环境搭建(四)常用PowerShell命令
  12. java设计模式之单例模式以及实现的几种方法
  13. The missing package manager for macOS (or Linux)
  14. 用ActiveX 创建自己的comboBox 控件(二)
  15. Jenkins持续集成学习-Windows环境进行.Net开发4
  16. CentOS安装noVNC,以Web方式交付VNC远程连接
  17. [Python] 02 - String
  18. webpack执行命令参数
  19. 在ASP.NET Web API中使用OData的Action和Function
  20. FTP整站上传的批处理脚本

热门文章

  1. border-1px的实现(stylus)
  2. NSUserDefaults保存用户名和密码
  3. 持有对方的引用&amp;&amp;内部类
  4. AJPFX关于多态的应用
  5. 2017团体程序设计天梯赛大区赛 L3-3 球队“食物链”
  6. ES之值类型以及堆和栈
  7. Unity笔记(4)自学第六天
  8. java实现的单点登录
  9. 学生管理系统之Java+Mysql
  10. Java锁,真的有这么复杂吗?