UVALive 8374 Starting a Scenic Railroad Service 树状数组

版权声明:本博客内容基本为原创,如有问题欢迎联系,转载请注明出处 https://blog.csdn.net/qq_41955236/article/details/84404032

题目链接:https://vj.e949.cn/7d6132df29befa405680c7874e7d5524?v=1542286983

题意:

       很不想形容这道题的题意。。让我直接说翻译成人话之后的题意吧。。就是给了你n个区间,要你求两个值,一个是该区间重复覆盖了多少其他区间,求最大值,另一个就是求同一段区间被覆盖了最多数量的次数。

做法:

       求几个区间的,就是用树状数组进行维护,每一个r之前的开头减去每一个l之前的结尾,即这个区间所覆盖的区间个数,而第二问就是用O(1)的方法找一个最大值即可,代码其实比较简单。


#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxn=200005;

int fini[maxn],sta[maxn];
int lowbit(int x){
    return x&(-x);
}
void addfi(int pos){
    while(pos<=maxn){
        fini[pos]++;
        pos+=lowbit(pos);
    }
}
int queryfi(int pos){
    int ans=0;
    while(pos){
        ans+=fini[pos];
        pos-=lowbit(pos);
    }
    return ans;
}
void addsta(int pos){
    while(pos<=maxn){
        sta[pos]++;
        pos+=lowbit(pos);
    }
}
int querysta(int pos){
    int ans=0;
    while(pos){
        ans+=sta[pos];
        pos-=lowbit(pos);
    }
    return ans;
}
int sum[maxn>>1];
struct node{
    int st,fi;
}e[maxn];
int main(){
    int n;
    while(~scanf("%d",&n)){
        memset(sta,0,sizeof(sta));
        memset(fini,0,sizeof(fini));
        memset(sum,0,sizeof(sum));
        int x,y;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            sum[x]+=1;
            sum[y]-=1;
            addsta(x); addfi(y);
            e[i].st=x,e[i].fi=y;
        }
        int nowsum=0,ansse=0;
        for(int i=1;i<=100005;i++){
            nowsum+=sum[i];
            ansse=max(ansse,nowsum);
        }
        int ansfi=0;
        for(int i=1;i<=n;i++){
            x=e[i].st,y=e[i].fi;
            //cout<<querysta(y);
            //cout<<" "<<queryfi(x)<<endl;
            ansfi=max(ansfi,querysta(y-1)-queryfi(x));
        }
        printf("%d %d\n",ansfi,ansse);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41955236/article/details/84404032
今日推荐