题目链接:https://vjudge.net/problem/HYSBZ-3262

3262: 陌上花开

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 3188  Solved: 1472
[Submit][Status][Discuss]

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

 

Source

题解:

单纯的三维偏序问题,上CDQ分治。

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 2e5+; struct node
{
int x, y, z, s, id;
bool operator<(const node& b)const{
if(x==b.x){
if(y==b.y) return z<b.z;
return y<b.y;
}
return x<b.x;
}
};
node a[MAXN], b[MAXN]; int n, k, c[MAXN];
int lowbit(int x) {return x&(-x);}
void add(int x, int val) {for(int i=x;i<=k;i+=lowbit(i)) c[i]+=val;}
int sum(int x) {int ret=; for(int i=x;i>;i-=lowbit(i))ret+=c[i]; return ret;} // 第一维排序,第二维CDQ,第三维树状数组
void CDQ(int l, int r)
{
if(l==r) return; int mid = (l+r)/;
CDQ(l, mid); CDQ(mid+, r);
int p1 = l, p2 = mid+;
for(int i = l; i<=r; i++) //按y排序,归并排序
{
//必须是:a[p1].y<=a[p2].y,不能少了==这个判断,因为当a[p1].y==a[p2].y时,必定p1排在前面,因为p1的z比p2小
if(p2>r||(p1<=mid&&a[p1].y<=a[p2].y)) b[i] = a[p1++];
else b[i] = a[p2++];
}
//此时y按从小到大排序,当y相等时,x小的排前面。
for(int i = l; i<=r; i++)
{
a[i] = b[i]; //b为a归并排序时的临时存储,应把值放回到a里
if(a[i].id<=mid) add(a[i].z, ); //当x小于等于mid,则把它的z加入到树状数组中,被别人统计
else a[i].s += sum(a[i].z); //当x大于mid时,拿自己的z到线段树中统计
}
for(int i = l; i<=r; i++) //撤回在线段树中的操作
if(a[i].id<=mid) add(a[i].z, -);
} int ans[MAXN];
int main()
{
while(scanf("%d%d", &n,&k)!=EOF)
{
for(int i = ; i<=n; i++)
{
scanf("%d%d%d", &a[i].x,&a[i].y,&a[i].z);
a[i].s = ;
}
sort(a+,a++n);
memset(c, , sizeof(c));
for(int i = ; i<=n; i++)
a[i].id = i;
CDQ(,n); memset(ans, , sizeof(ans));
for(int i = n-; i>=; i--) //一样的点,选值最大的
if(a[i].x==a[i+].x&&a[i].y==a[i+].y&&a[i].z==a[i+].z)
a[i].s = a[i+].s; for(int i = ; i<=n; i++)
ans[a[i].s]++;
for(int i = ; i<n; i++)
printf("%d\n", ans[i]);
}
}

最新文章

  1. 关于es5的一些新方法
  2. Json格式示意图
  3. C# RFID windows 服务 网络协议方式
  4. Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
  5. Bootstrap~表单Form
  6. jQuery源代码阅读之三——jQuery实例方法和属性
  7. eclipse 运行报java.lang.OutOfMemoryError: PermGen space解决方法
  8. 北京联想招聘-Android Framework高级工程师(7-10年) 加入qq 群:220486180 或者直接在此 留言咨询
  9. java基础类:Object类和Math类
  10. spring3+struts2+hibernate3整合出现的问题,No mapping found for dependency [type=java.lang.String, name=&#39;struts.objectFactory.spring.enableAopSupport&#39;]
  11. Lambda Expression In Java
  12. C++ 前置声明 和 包含头文件 如何选择
  13. oracle逗号字符串拼接小工具
  14. javascript于boolean类型转换,运营商&amp;amp;&amp;amp;和|| 返回值
  15. Python基础-week01
  16. python中OS模块方法
  17. vue中生成二维码
  18. Java 对象 引用,equal == string
  19. 3d打印机的软件系统组成部分
  20. Faiss教程:GPU

热门文章

  1. Maven项目如何将自定义文件添加到META-INF目录下
  2. [java面试]关于多态性的理解
  3. ThinkPHP 3.1、3.2一个通用的漏洞分析
  4. UNP学习笔记(第四章 基本TCP套接字编程)
  5. socket 、 udp 和 tcp
  6. DataTable行处理
  7. 处理字符串的一些C函数
  8. Content Security Policy
  9. 线性表的链式实现(C++)
  10. 为什么阿里巴巴不建议在for循环中使用&quot;+&quot;进行字符串拼接