题目链接

题目

题目描述

小石有 n 个妹子,每个妹子都有一个细心程度 \(a_i\)和一个热心程度 \(b_i\) ,

小石想给她们一个重要程度 \(t_i\)​(重要程度为 1 表示最重要,重要程度越小表示越重要)。

如果一个妹子 i 的细心程度和热心程度都比妹子 j 大,那么妹子 i 的重要程度要大于妹子 j 的重要程度,即妹子 i 比妹子 j 重要。

流程如下:

每次从所有没有重要程度的妹子中,找到若干妹子。对于这些妹子的任意一个,需要保证没有其他妹子比她更重要。然后把她们的重要程度标为 1 。下一次再从剩下没有重要程度的妹子中找到若干妹子,依然符合上述条件,然后把她们的重要程度标为 2,……,重复直到所有妹子都有自己的重要程度。

由于妹子太多,小石忙不过来,请你帮帮他。

输入描述

第一行输入一个正整数 n,表示妹子的数量。

接下来 n 行,每行两个正整数 \(a_i,b_i\) ,描述每个妹子的细心程度和热心程度。

保证所有的 \(a_i\) 两两不等,所有的 \(b_i\) 两两不等。

输出描述

共 n 行,第 i 行输出一个正整数 \(t_i\) 表示第 i 个妹子的重要程度。

示例1

输入

5
1 4
2 2
3 3
4 1
5 5

输出

2
3
2
2
1

说明

第一轮取第 5 个妹子(5 5),因为没有其他妹子比她重要,标记为 1;

第二轮取编号为 1,3,4 的妹子,因为对于其中的任意一个妹子,都没有其他妹子比她们重要,标记为 2;

第三轮把编号为 2 的妹子标记为 3 。

备注

\(1 \leq n \leq 10^5,1 \leq a_i,b_i \leq 10^9\)

题解

知识点:线段树,离散化,离线。

某点的排名可以转化为属性 \(a,b\) 都严格比自己大的点的排名的最大值加 \(1\) 。显然,可以离线后按序输入,用权值线段树维护最大值即可。

需要注意的细节是,这道题要求二维属性都必须严格大于才构成一个偏序关系。因此,不妨按 \(a\) 从大到小排序,若 \(a\) 相同则按 \(b\) 从小到大排序,线段树维护属性 \(b\) 。

那么,对于当前输入进来的点 \((x,y)\) ,线段树已经维护了 \(a > x\) 的全部点,以及 \(a = x\) 且 \(b<y\) 的点。这样保证了询问 \(b>y\) 的区间时,能得到的只有 \(a>x\) 且 \(b>y\) 的点的最大值,而 \(a = x\) 且 \(b > y\) 的点不会纳入其中。

另外,因为坐标值域很大,所以需要用到离散化。

时间复杂度 \(O(n \log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; template<class T>
struct Discretization {
vector<T> uniq;
Discretization() {}
Discretization(const vector<T> &src) { init(src); }
void init(const vector<T> &src) {
uniq = src;
sort(uniq.begin() + 1, uniq.end());
uniq.erase(unique(uniq.begin() + 1, uniq.end()), uniq.end());
}
int get(T x) { return lower_bound(uniq.begin() + 1, uniq.end(), x) - uniq.begin(); }
}; struct T {
int mx;
static T e() { return { (int)0 }; }
friend T operator+(const T &a, const T &b) { return { max(a.mx, b.mx) }; }
};
struct F {
int mx;
T operator()(const T &x) { return { max(x.mx,mx) }; }
}; template<class T, class F>
class SegmentTree {
int n;
vector<T> node; void update(int rt, int l, int r, int x, F f) {
if (r < x || x < l) return;
if (l == r) return node[rt] = f(node[rt]), void();
int mid = l + r >> 1;
update(rt << 1, l, mid, x, f);
update(rt << 1 | 1, mid + 1, r, x, f);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
} T query(int rt, int l, int r, int x, int y) {
if (r < x || y < l) return T::e();
if (x <= l && r <= y) return node[rt];
int mid = l + r >> 1;
return query(rt << 1, l, mid, x, y) + query(rt << 1 | 1, mid + 1, r, x, y);
} public:
SegmentTree(int _n = 0) { init(_n); } void init(int _n) {
n = _n;
node.assign(n << 2, T::e());
} void update(int x, F f) { update(1, 1, n, x, f); } T query(int x, int y) { return query(1, 1, n, x, y); }
}; struct pk {
int a, b;
int id;
}p[100007];
int ans[100007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
vector<int> b_src(n + 1);
for (int i = 1;i <= n;i++) {
int a, b;
cin >> a >> b;
p[i] = { a,b,i };
b_src[i] = b;
} Discretization<int> dc(b_src);
sort(p + 1, p + n + 1, [&](const pk &a, const pk &b) { return a.a == b.a ? a.b < b.b : a.a > b.a; }); int rk_n = dc.uniq.size() - 1;
SegmentTree<T, F> sgt(rk_n);
for (int i = 1;i <= n;i++) {
int rk = dc.get(p[i].b);
ans[p[i].id] = sgt.query(rk + 1, rk_n).mx + 1;
sgt.update(rk, { ans[p[i].id] });
} for (int i = 1;i <= n;i++) cout << ans[i] << '\n';
return 0;
}

NC26253 小石的妹子的更多相关文章

  1. 牛客小白月赛16 F 小石的妹子 (线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  2. 牛客小白月赛16 小石的妹子 二分 or 线段树

    牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...

  3. 周末聊聊IT人员的人脉观:关于帮妹子找兼职有感

    背景: 前几天,有个认识了好几年的网友,现在是大学生,在厦门读大一,说和她同学要一起到广州找兼职,看我有没有介绍. 像我这么积极热心善良的人,就说帮她找找看,结果问了几次,没消息,只好诚实的回复人家, ...

  4. BZOJ 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1387  Solved: 400[Submit][Status][Di ...

  5. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  6. R语言-妹子被追后的选择分析

    前提假设 妹子们一生中可以遇到100个追求者,追求者的优秀程度符合正态分布: 每个妹子都具备判断并比较追求者优秀程度的能力: 接受或拒绝一个追求者后永远无法后悔. 那么,问题来了 当遇到追求者时,如何 ...

  7. BZOJ3809: Gty的二逼妹子序列

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题.   对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数.   为了方 ...

  8. 拥抱ARM妹子 序章!ARM妹子~~ 哥我来啦!

    一个负心汉即将移情别恋,从51转到ARM妹子啦?其实8是的,俺准备开后宫.哇——咔~咔~~.考虑功耗和成本等问题,只有51肯定是不够的,所以嘛~~(一脸坏笑)嘿嘿~~,ARM妹子俺追定了.出于对ARM ...

  9. [HZWER]藏妹子之处

    问题描述 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一 ...

  10. bzoj 3720: Gty的妹子树 块状树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 153[Submit][Status] Descr ...

随机推荐

  1. Linux系列之文件和目录权限

    前言 我们知道,root用户基本上可以在系统中做任何事.其他用户有更多的限制,并且通常被收集到组中.你把有类似需求的用户放入一个被授予相关权限的组,每个成员都继承组的权限. 让我们看一下: 查看权限( ...

  2. python3使用json、pickle和sqlite3持久化存储字典对象

    技术背景 在各种python的项目中,我们时常要持久化的在系统中存储各式各样的python的数据结构,常用的比如字典等.尤其是在云服务类型中的python项目中,要持久化或者临时的在缓存中储存一些用户 ...

  3. java - 对象装载数据传递到方法中

    1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...

  4. MyBatis04——使用注解开发

    使用注解开发 MyBatis3提供了新的基于注解的配置,但是MyBatis映射并不能用注解来构建. sql类型主要分成: @select @update @insert @delete 注意:利用注解 ...

  5. SpringMVC08——拦截器——2021-05-11

    拦截器概述 SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理. 例如:进行权限验证.记录请求信息的日志.判断用户 ...

  6. [转帖]Prometheus Shell Exporter

    Shell Exporter can execute Powershell or Bash scripts and transform its output to Prometheus metrics ...

  7. Rsync的一个高级应用

    Rsync的一个高级应用 背景 2019年刚开始接触linux时. 有一个很恶心的场景. 很多人为了简单起见, 提交数据库的修改(数据结果和预制数据) 都不是增量处理, 都是全量提交过来. 所以会造成 ...

  8. [转帖]从CPU指令集自主到信息技术产业自主

    https://zhuanlan.zhihu.com/p/365210753 现代信息技术的应用都是以计算机为基础,CPU是计算机中的信息处理中枢.CPU指令集是CPU逻辑电路与操作系统和应用程序交流 ...

  9. [转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)

    https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: ...

  10. ElementUI实现表格(table) 行上下移动的效果

    参考地址 https://blog.csdn.net/sunshine0508/article/details/88390155 看大佬的地址 <div id="app"&g ...