zoukankan      html  css  js  c++  java
  • 牛客-小石的妹子-单调栈

    链接: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
    ",ans[i]);
        return 0;
    }

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

  • 相关阅读:
    删除表空间 数据库备份 创建用户
    javax.persistence包
    JNDI
    J2EE中关于session 的生命周期
    多表关联
    归档程序错误。在释放之前仅限于内部连接
    spring集成jpa
    Tree.Panel各项属性
    eclipse调试以及step into step over step return区别
    wininet.dll函数库:不会过期的cookie
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/11398345.html
Copyright © 2011-2022 走看看