链接:https://ac.nowcoder.com/acm/contest/949/F
来源:牛客网
题目描述
小石有 n 个妹子,每个妹子都有一个细心程度 aia_iai 和一个热心程度 bib_ibi,
小石想给她们一个重要程度 tit_iti(重要程度为 1 表示最重要,重要程度越小表示越重要)。
如果一个妹子 i 的细心程度和热心程度都比妹子 j 大,那么妹子 i 的重要程度要大于妹子 j 的重要程度,即妹子 i 比妹子 j 重要。
流程如下:
每次从所有没有重要程度的妹子中,找到若干妹子。对于这些妹子的任意一个,需要保证没有其他妹子比她更重要。然后把她们的重要程度标为 1 。下一次再从剩下没有重要程度的妹子中找到若干妹子,依然符合上述条件,然后把她们的重要程度标为 2,……,重复直到所有妹子都有自己的重要程度。
由于妹子太多,小石忙不过来,请你帮帮他。
小石想给她们一个重要程度 tit_iti(重要程度为 1 表示最重要,重要程度越小表示越重要)。
如果一个妹子 i 的细心程度和热心程度都比妹子 j 大,那么妹子 i 的重要程度要大于妹子 j 的重要程度,即妹子 i 比妹子 j 重要。
流程如下:
每次从所有没有重要程度的妹子中,找到若干妹子。对于这些妹子的任意一个,需要保证没有其他妹子比她更重要。然后把她们的重要程度标为 1 。下一次再从剩下没有重要程度的妹子中找到若干妹子,依然符合上述条件,然后把她们的重要程度标为 2,……,重复直到所有妹子都有自己的重要程度。
由于妹子太多,小石忙不过来,请你帮帮他。
输入描述:
第一行输入一个正整数 n,表示妹子的数量。
接下来 n 行,每行两个正整数 ai,bia_i,b_iai,bi,描述每个妹子的细心程度和热心程度。
保证所有的 aia_iai 两两不等,所有的 bib_ibi 两两不等。
输出描述:
共 n 行,第 i 行输出一个正整数 tit_iti 表示第 i 个妹子的重要程度。
题意分析: 。。。首先对序列安装a值大小排序, 然后从后往前遍历, 怎么知道我们当前bi属于第几类呢?
对于每一个类,我们保留其中一个,并用一个最大的 b值代表它们,这样就组成了一个关于b值的单调序列;
对于新来的bi, 我们二分其第一个可以插入的位置, 比如 5 插入 2,3,10; 3代表的类和5同类, 并且用5更新第二类的最大值
#include <bits/stdc++.h> using namespace std; const int N=1e5+7; struct node { int a,b; int id; bool operator<(const node& x)const { return a<x.a; } }; node t[N]; int val[N], ans[N]; int n; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d %d",&t[i].a,&t[i].b); t[i].b*=-1; t[i].id=i; } sort(t+1,t+1+n); for (int i=n;i>=1;i--) { int k=lower_bound(val+1,val+1+n,t[i].b)-val; val[k]=t[i].b; ans[t[i].id]=k; } for (int i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }
// 关于妹子的题都做不好,头大;