Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 3627  Solved: 1705
[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分治和归并排序很像qwq。

第一维可以用排序搞掉

这样我们用cdq分治统计$(l,r)$这段区间的时候只需要考虑$b$和$c$的贡献,而且只需要考虑区间$(l, mid)$对$mid + 1, r$的贡献

用树状数组维护第三维的贡献

#include<cstdio>
#include<algorithm>
#define lowbit(x) ((x) & (-x))
using namespace std;
const int MAXN = 200001;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, Max;
struct Node {int a, b, c, f, w;bool operator < (const Node &rhs) const{return (a == rhs.a && b == rhs.b) ? (c < rhs.c) : (a == rhs.a ? b < rhs.b : a < rhs.a);}
}A[MAXN], tp[MAXN];
int num = 0, ans[MAXN];
int T[MAXN];
void Add(int pos, int val) {for(int i = pos; i <= Max; i += lowbit(i)) T[i] += val;
}
int Query(int pos) {int ans = 0;for(int i = pos; i; i -= lowbit(i)) ans += T[i];return ans;
}
void CDQ(int l, int r) {if(l == r) return;int mid = l + r >> 1;CDQ(l, mid); CDQ(mid + 1, r);int i = l, j = mid + 1, P = l;while(i <= mid || j <= r) {if(j > r || (i <= mid && A[i].b <= A[j].b)) Add(A[i].c, A[i].w), tp[P++] = A[i++];else A[j].f += Query(A[j].c), tp[P++] = A[j++];}for(int i = l; i <= mid; i++) Add(A[i].c, -A[i].w);for(int i = l; i <= r; i++) A[i] = tp[i];
}
int main() {
#ifdef WIN32freopen("a.in", "r", stdin);
#endifN = read(); Max = read();for(int i = 1; i <= N; i++) A[i].a = read(), A[i].b = read(), A[i].c = read(), A[i].w = 1;sort(A + 1, A + N + 1);num = 1;for(int i = 2; i <= N; i++)if(A[i].a == A[num].a && A[i].b == A[num].b && A[i].c == A[num].c) A[num].w++;else A[++num] = A[i];CDQ(1, num);for(int i = 1; i <= num; i++) ans[A[i].f + A[i].w - 1] += A[i].w;for(int i = 0; i <= N - 1; i++)printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/9282370.html

BZOJ3262: 陌上花开(cdq分治)相关推荐

  1. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1439  Solved: 648 [Submit][Status][Discu ...

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

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

  3. bzoj 3262: 陌上花开(cdq分治)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2433  Solved: 1087 [Submit][Status][Disc ...

  4. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

  5. CDQ分治[陌上花开 ]

    关于CDQ,是大神陈丹琦写出来的算法,具体的看这个连接 https://www.cnblogs.com/lck-lck/p/9657753.html https://blog.csdn.net/wu_ ...

  6. [BZOJ3262]陌上花开

    [BZOJ3262]陌上花开 题目大意: \(n(n\le10^5)\)个三元组\((x,y,z)(x,y,z\le2\times10^6)\),求三位偏序. 思路: CDQ分分治套树状数组.需要注意 ...

  7. [总结]CDQ分治整体二分

    从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...

  8. bzoj3262: 陌上花开

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

  9. 【教程】简易CDQ分治教程学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

最新文章

  1. Nginx HTTP 负载均衡和反向代理
  2. Xamarin XAML语言教程使用方法设置进度条进度
  3. Android入门(十二)SQLite事务、升级数据库
  4. mybitas oracle.sql.clob,Oracle使用简单函数
  5. 飞鸽传书2007程序语言的面向对象最后会成自然语言吗?
  6. JMeter记录篇2——性能测试基础(2)
  7. CUDA中并行规约(Parallel Reduction)的优化
  8. xrdp协议_XRDP与VNC的关系(转载)
  9. BI笔记之---BI通用流程zz
  10. 2 python包、模块相关
  11. 模式识别和机器学习--- 2.3高斯分布
  12. Visio使用技巧总结
  13. 设计模式-工厂模式(Factory)
  14. win10系统中“无法使用内置管理员账户打开,请使用其他账户登录再试一次“
  15. 详解如何在npmjs上上传和更新属于自己的组件库
  16. TypeError: object() takes no parameters
  17. WPF 元素裁剪 Clip 属性
  18. java金额三位一撇方法_Java数据格式化问题
  19. 机器学习-神经网络(Neural Network)算法
  20. linux malloc错误,如何规避GCC中“尝试使用中毒的malloc / calloc”错误?

热门文章

  1. 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
  2. c语言使用求余方式的转化为二进制程序,C语言第三讲 程序结构 (下).ppt
  3. css 样式三元运算_CSS扩展语言——Sass入门指南
  4. 深度讲解spring的循环依赖以及三级缓存
  5. Mysql(9)——排序的方法order by与limit的用法
  6. scikit-learn 朴素贝叶斯类库使用小结
  7. java中ftp删除文件,Java 实现ftp 文件上传、下载和删除
  8. 完全二叉树的结点个数
  9. C++ IO类(3) 文件流
  10. 计算机复试通知学校,提醒:部分学校复试通知已经出了!教育部关于21考研复试的规定!...