zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    平衡二叉树之RB树
    平衡二叉树之AVL树
    实现哈希表
    LeetCode Median of Two Sorted Arrays
    LeetCode Minimum Window Substring
    LeetCode Interleaving String
    LeetCode Regular Expression Matching
    PAT 1087 All Roads Lead to Rome
    PAT 1086 Tree Traversals Again
    LeetCode Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/11313950.html
Copyright © 2011-2022 走看看