CF1424G题解

思路

这个题意思很显然,是求 nn 个区间重叠最多的地方和值。

那么我们能想到用差分数组,在扫一遍的过程中维护最大值和 pospos

但是需要注意的是,区间最大会到 10910^9,直接差分是不行的,我们需要先对所有 bbdd 进行离散化,然后再去差分。

源码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int n,ans,sum,pos,cnt,tot,a[maxn],l[maxn],r[maxn],b[maxn],c[maxn];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>l[i]>>r[i];
        a[++cnt]=l[i];
        a[++cnt]=r[i];
    }
    sort(a+1,a+cnt+1);
    for(int i=1;i<=cnt;i++){
    	if(i==1||a[i]!=a[i-1]){
    		a[++tot]=a[i];
		}
	}  
    int t1,t2;
    for(int i=1;i<=n;i++){
        t1=lower_bound(a+1,a+tot+1,l[i])-a;
        t2=lower_bound(a+1,a+tot+1,r[i])-a;
        c[t1]=l[i];//记录本来的位置
		c[t2]=r[i];//记录本来的位置
        b[t1]++;
		b[t2]--;
    }
    for(int i=1;i<=tot;i++){
        sum+=b[i];
        if(sum>ans){
        	ans=sum,pos=c[i];
		}
    }
    cout<<pos<<' '<<ans;
    return 0;
}
posted @ 2023-08-27 21:05  KK_SpongeBob  阅读(7)  评论(0)    收藏  举报  来源