题目链接: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;
}