【题意】

给出n个女士的三位属性xi,yi,zi(注意此处是一行x给完再给y再给z)。若存在xi>xj && yi > yj  && zi>zj ,那么第 j 个人就会狗带,也就是说一个人只要存在一个三个属性都严格大于她的人,她就会选择狗带。

询问狗带的人数是多少。

https://codeforces.com/problemset/problem/12/D

【思路】

先按 y离散化,按照离散后的值作为下标建立线段树。

接着按照 x 属性从大到小排序,然后依次遍历

这时可以肯定的是当前正在处理到的人她的x值肯定小于之前被更新到线段树里的人的x值。

更新线段树时,每更新到一个人 i ,就在她对应的 yi 下标赋值 zi。

[yj+1,Size]的最大值,这个最大值和 zj 进行比较就可以啦。

相当于人是排队依次进来的,降低了1维后变成二维,再在y的位置上放置这个高度为z的人

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;struct nod {int B, I, R;
}k[maxn];int cmp(nod a, nod b) {if (a.B != b.B)return a.B > b.B;else if (a.I != b.I)return a.I > b.I;else return a.R > b.R;
}int h[maxn];struct node {int l, r, ma;
}tr[maxn << 2];void pushup(int p) {tr[p].ma = max(tr[p << 1].ma, tr[p << 1 | 1].ma);
}void build(int p, int l, int r) {tr[p].l = l;tr[p].r = r;if (l == r) {tr[p].ma = 0;return;}int mid = (l + r) >> 1;build(p << 1, l, mid);build(p << 1 | 1, mid + 1, r);pushup(p);
}void update(int p, int k, int v) {if (tr[p].l == tr[p].r) {tr[p].ma = max(tr[p].ma, v);return;}int mid = (tr[p].l + tr[p].r) >> 1;if (k <= mid)update(p << 1, k, v);else update(p << 1 | 1, k, v);pushup(p);
}int getmax(int p, int l, int r) {if (l <= tr[p].l&&tr[p].r <= r) {return tr[p].ma;}int mid = (tr[p].l + tr[p].r) >> 1;int ans = 0;if (l <= mid)ans = max(ans, getmax(p << 1, l, r));if (r > mid)ans = max(ans, getmax(p << 1 | 1, l, r));return ans;
}int main() {int n;while (~scanf("%d", &n)) {for (int i = 1; i <= n; i++)scanf("%d", &k[i].B);for (int i = 1; i <= n; i++)scanf("%d", &k[i].I), h[i] = k[i].I;for (int i = 1; i <= n; i++)scanf("%d", &k[i].R);sort(h + 1, h + 1 + n);int sz = unique(h + 1, h + 1 + n) - h - 1;build(1, 1, sz + 1);sort(k + 1, k + 1 + n, cmp);int prei, ans = 0;for (int i = 1; i <= n; ) {prei = i;for (; k[i].B == k[prei].B&&i<=n; i++) {//第一维相同,成批处理k[i].I = lower_bound(h + 1, h + 1 + sz, k[i].I) - h;//离散化int tmp = getmax(1, k[i].I + 1, sz + 1);//printf("***%d\n", tmp);if (tmp > k[i].R)ans++;}for (; prei < i; prei++) {update(1, k[prei].I, k[prei].R);}}printf("%d\n", ans);}
}

【codeforces 12D】【线段树】【降维】【离散化】【三元组比较大小】相关推荐

  1. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

  2. Sum of Medians CodeForces - 85D(线段树+离散化)

    Sum of Medians 题目链接:CodeForces - 85D 题意:对于一个集合set(有序的)有三个操作(集合是有序的,下标由1开始): 一:add x:在集合中加入x; 二:del  ...

  3. 线段树——区间离散化/压缩

    一.基本概念 线段树:线段树基本概念 离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率.通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小. 例如: 原数据 ...

  4. POJ1151-Atlantis【线段树,扫描线,离散化】

    正题 题目链接:http://poj.org/problem?id=1151 题目大意 有n个矩形,求所以矩形的覆盖面积. 解题思路 我们用离散化一个坐标,然后每次用线段树维护这个宽度内覆盖高度和,然 ...

  5. CodeForces - 786BLegacy——线段树建图+最短路

    [题目描述] CodeForces - 786BLegacy [题目分析] 题目大概意思就是有三种操作: 从某个点到另一个点 从某个点到另一个区间 从某个区间到另一个点 然后询问从其中一个点到其他所有 ...

  6. 贴海报 (线段树染色-离散化

    n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 虽然之前学过离散化,但用的时 ...

  7. hdu 5107 线段树+离散化+归并排序+极角排序

    首先这道题的数据范围极大,那么一定是要离散化的,离散化就是读入之后,记录id,分别按照x和y排序,排序之后重新记录成连续的坐标 然后数据量也挺大,而且没有重点,所以直接极角排序,然后将横坐标映射到一棵 ...

  8. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

  9. 线段树 + 扫描线 + 离散化:亚特兰蒂斯

    题目链接:https://www.acwing.com/problem/content/description/249/ 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包 ...

  10. 2019牛客多校第七场E Find the median 权值线段树+离散化

    Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...

最新文章

  1. mysql while 游标_mysql 游标 loop while 的使用
  2. 一条推文卖出 290 万美元天价?网友:我竟是隐藏的富翁
  3. Python基础-面向对象编程
  4. 数据结构:循环链表解决约瑟夫问题
  5. 【Python生成readme文件】——Markdown语法
  6. ASP.NET Core on K8S学习初探(2)
  7. 一个常用的Android工具库
  8. Android BLE新手进入
  9. [BuildRelease]Mozilla Build Tools(自动设置VC环境)
  10. 新概念_please send me a card.
  11. Windows与Linux比较:相似与不同
  12. Trapcode套装插件原创图文/视频安装教程
  13. CAN为什么会发送失败
  14. idea自动化部署Alibaba Cloud Toolkit
  15. 智能家居市场未来发展潜力巨大,未来可期!
  16. 手机硬件研发工程师的主要工作职责是什么?
  17. 企业办理icp许可证有没必要-icp许可证
  18. javaScript jquery完美判断图片是否加载完毕
  19. [发布] QQGame 连连看辅助工具(限制功能版)
  20. echarts瀑布图_Echarts自定义瀑布图开发

热门文章

  1. c++获取当前时间戳
  2. about:blank_Web浏览器中的About:空白页是做什么用的?
  3. wepy组件子父传值_wepy组件间传值
  4. linux(ubuntu 10.10) 64位系统 gcc编译(c)成32位(静态)可执行应用程序的方法
  5. 计算机网络 | 网络层ARP协议ICMP协议
  6. 家里安装两个无线路由器的设置方法【转】
  7. cad打开卡死_cad2010打开就卡死怎么办_教你解决cad2010打开就卡死的方法
  8. 麒麟处理器是基于arm的吗_麒麟处理器是华为自己研发制造的吗?
  9. c语言中free函数_free()函数与C ++中的示例
  10. 【小技巧】IDEA自动导包设置,提高开发效率