Laptop(线段树+离散化)

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

题目描述

FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。

输入描述:

第一行一个正整数n,
表示笔记本的数量。接下来n行,每行两个正整数M
i
,S
i
表示这款笔记本的内存和速度。
n≤10
5
,M
i
,S
i
≤10
9

输出描述:

一行,一个正整数,表示被完虐的笔记本数。
示例1

输入

复制
4
100 700
200 500
50 100
300 400

输出

复制
1

备注:

M
i
和S
i
都是越大越优。
数据保证M
i
互不相同,S
i
也互不相同。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=2e5+5;
typedef long long ll;
using namespace std;

struct node
{
    int l,r;
    int num;
}tree[maxn<<2];
struct node1
{
    int a,b;
    bool friend operator <(node1 x,node1 y)
    {
        return x.a>y.a;
    }
}p[maxn];
vector<int>v;
void build(int m,int l,int r)
{
    tree[m].l=l;
    tree[m].r=r;
    tree[m].num=0;
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)>>1;
    build(m<<1,l,mid);
    build(m<<1|1,mid+1,r);
}
void update(int m,int pos,int val)
{
    if(tree[m].l==tree[m].r&&tree[m].l==pos)
    {
        tree[m].num=val;
        return ;
    }
    int mid=(tree[m].l+tree[m].r)>>1;
    if(pos<=mid)
    update(m<<1,pos,val);
    else
    {
        update(m<<1|1,pos,val);
    }
    tree[m].num=(tree[m<<1].num+tree[m<<1|1].num);
}
int query(int m,int l,int r)
{
    if(tree[m].l==l&&tree[m].r==r)
    {
        return tree[m].num;
    }
    int mid=(tree[m].l+tree[m].r)>>1;
    if(r<=mid)
    {
        return query(m<<1,l,r);
    }
    else if(l>mid)
    {
        return query(m<<1|1,l,r);
    }
    else 
    {
        return query(m<<1,l,mid)+query(m<<1|1,mid+1,r);
    }
} 
int getid(int x)
{
    return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
int main()
{
    int n;
    cin>>n;
    for(int t=0;t<n;t++)
    {
        scanf("%d%d",&p[t].a,&p[t].b);
        v.push_back(p[t].a);
        v.push_back(p[t].b);
        //p[t].pos=t;
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    sort(p,p+n);
    build(1,1,2*n);
    ll ans=0;
    for(int t=1;t<n;t++)
    {
       update(1,getid(p[t-1].b),1);
    
       if(query(1,getid(p[t].b),2*n))
       {
//           cout<<query(1,1,getid(p[t].b)-1)<<endl;
           ans++;
       }
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Staceyacm/p/11313950.html