小石的妹子 线段树二维偏序

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小石有 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

说明

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

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

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

备注:

1≤n≤105,1≤ai,bi≤1091 \leq n \leq 10^5,1 \leq a_i,b_i \leq 10^91≤n≤105,1≤ai​,bi​≤109
解题思路:先对a,b数组进行离散化处理一下,然后再按b值从大到小排一下序,然后从前往后对于第i个妹子的等级为比她的a值大的妹子中等级最大值加1,然后再将这个妹子的等级更新到线段树中。

 

#include
#include
#include
#include
#define maxn 100005
#define lson 2*i,l,m
#define rson 2*i+1,m+1,r
#define inf 0x3f3f3f3f
using namespace std;
int maxv[maxn*4];
int n;
struct node
{
    int a,b,id,ra;
}p[maxn];
void pushup(int i)
{
    maxv[i]=max(maxv[i*2],maxv[i*2+1]);
}
void build(int i,int l,int r)
{
    if(l==r)
    {
        maxv[i]=0;
        return;
    }
    int m=(l+r)/2;
    build(lson);
    build(rson);
    pushup(i);
}
bool cmp1(node a,node b)
{
    return a.ab.b;
}

int query(int ql,int qr,int i,int l,int r)
{
    if(ql<=l&&r<=qr)
    return maxv[i];
    int m=(l+r)/2;
    int maxl=-inf;
    if(ql<=m)
    maxl=max(maxl,query(ql,qr,lson));
    if(m

 

你可能感兴趣的:(线段树)