• codeforces 652D Nested Segments 离散化+树状数组


    题意:给你若干个区间,询问每个区间包含几个其它区间

    分析:区间范围比较大,然后离散化,按右端点排序,每次更新树状数组中的区间左端点,查询区间和

    注:(都是套路)

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    const int N=2e5+5;
    const int INF=0x3f3f3f3f;
    int a[N<<1],n,d;
    struct pair{
      int l,r,id;
      bool operator<(const pair &e)const{
         return r<e.r;
      }
    }p[N];
    int c[N<<1];
    void change(int x){
       for(int i=x;i<=d;i+=i&(-i))
         ++c[i];
    }
    int query(int x){
      int ans=0;
      for(int i=x;i>0;i-=i&(-i))
        ans+=c[i];
      return ans;
    }
    int res[N];
    int main(){ 
        scanf("%d",&n);
        int tot=0;
        for(int i=1;i<=n;++i){
           scanf("%d%d",&p[i].l,&p[i].r),p[i].id=i;
           a[++tot]=p[i].l;
           a[++tot]=p[i].r;
        }
        sort(a+1,a+1+tot);
        d=1;
        for(int i=2;i<=tot;++i)
          if(a[i]!=a[i-1])a[++d]=a[i];
        sort(p+1,p+1+n);
        for(int i=1;i<=n;++i){
          int r=lower_bound(a+1,a+1+d,p[i].r)-a;
          int l=lower_bound(a+1,a+1+d,p[i].l)-a;
          res[p[i].id]=query(r)-query(l-1);
          change(l);
        }
        for(int i=1;i<=n;++i)
         printf("%d
    ",res[i]); 
        return 0;
    }
    View Code
  • 相关阅读:
    ios10 获取idfa的坑
    iOS 获取手机sim卡的运营商(移动,电信,联通) 相关信息
    iOS获取手机IP地址
    UIScrollView 与 touchesBegan 冲突解决方法
    32位与64位基础
    MySQL数据库基础_表&简单查询
    MySQL数据库基础
    Java_File、递归
    Java_lambda表达式
    Java线程锁,等待唤醒和线程池
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5326467.html
Copyright © 2020-2023  润新知