zoukankan      html  css  js  c++  java
  • D. Nested Segments(树状数组、离散化)

    题目链接

    参考博客

    题意:

      给n个线段,对于每个线段问它覆盖了多少个线段。

    思路:

      由于线段端点是在2e9范围内,所以要先离散化到2e5内(左右端点都离散化了,而且实际上离散化的范围是4e5),然后对右端点升序排序:

      例如 2 3

         5 6

         4 7

         1 8

      这样的话,如果对i<j,a[ i ].l >= a[ j ].l ,那么第 j 组一定包含了第 i 组,算完第一组sum(3)-sum(2-1),把a[1].l加入到树状数组中,再算第二组,以此类推算到第三组时,sum(7)=2(1~7的和是2,因为前面加了两个数  2和5),sum(4-3)=sum(3)=1(因为前面加入的数中只有一个2 是在范围1~3的) ,所以第三组的答案是2-1=1 。

    #include<iostream>
    #include<cstdio>
    #include <cctype>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    using namespace std;
    #define ll long long
    #define mem(a,x) memset(a,x,sizeof(a))
    #define se second
    #define fi first
    const ll mod=998244353;
    const int INF= 0x3f3f3f3f;
    const int N=4e5+5;
    
    int n,cnt=0;
    int c[N],ans[N],b[N*2];
    struct node
    {
        int l,r,id;
    }a[N];
    
    bool cmp1(node x,node y)
    {
        return x.r<y.r || x.r==y.r&&x.l<y.l;
    }
    
    
    int lowbit(int x){
        return x&-x;
    }
    
    void add(int x,int k)
    {
        for(int i=x;i<=n*2;i+=lowbit(i)) c[i]+=k;
    }
    int sum(int x)
    {
        int sum=0;
        for(int i=x;i>0;i-=lowbit(i)) sum+=c[i];
        return sum;
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i].l,&a[i].r);
            a[i].id=i;
            b[++cnt]=a[i].l;
            b[++cnt]=a[i].r;
        }
        sort(b+1,b+1+cnt);
        for(int i=1;i<=n;i++)
        {
            a[i].l=lower_bound(b+1,b+1+cnt,a[i].l)-b;
            a[i].r=lower_bound(b+1,b+1+cnt,a[i].r)-b;
        }
        sort(a+1,a+1+n,cmp1);
        
        for(int i=1;i<=n;i++)
        {
            ans[a[i].id]=sum(a[i].r)-sum(a[i].l -1);
            add(a[i].l, 1);
        }
        for(int i=1;i<=n;i++)
            cout<<ans[i]<<endl;
    }
  • 相关阅读:
    iscroll 子表左右滚动同时保持页面整体上下滚动
    mac xampp命令行调用mysql
    学习—ReentrantLock
    sychronized和lock的区别
    学习——常见垃圾回收器
    学习——java内存模型
    学习——哈夫曼编码
    数据库—Innodb中的MVVC
    学习-事务-事务特性
    学习——事务-事务隔离级别
  • 原文地址:https://www.cnblogs.com/thunder-110/p/10423252.html
Copyright © 2011-2022 走看看