牛客-小石的妹子-单调栈

时间:2019-08-23
本文章向大家介绍牛客-小石的妹子-单调栈,主要包括牛客-小石的妹子-单调栈使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

链接:https://ac.nowcoder.com/acm/contest/949/F
来源:牛客网

题目描述

小石有 n 个妹子,每个妹子都有一个细心程度 aia_iai 和一个热心程度 bib_ibi
小石想给她们一个重要程度 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 个妹子的重要程度。
示例1

输入

复制
5
1 4
2 2
3 3
4 1
5 5

输出

复制
2
3
2
2
1

 题意分析: 。。。首先对序列安装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\n",ans[i]);
    return 0;
}

// 关于妹子的题都做不好,头大;

原文地址:https://www.cnblogs.com/xidian-mao/p/11398345.html