3 条题解

  • 1

    离散化模版题。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll c[40004],f[40004];
    ll a[20002],b[20002];
    ll n,k=1,ans=0;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i]>>b[i];
    		c[k++]=a[i];
    		c[k++]=b[i];
    	}
    	sort(c+1,c+2*n+1);
    	//erase(unique(c+1,c+2*n+1),c+2*n+1);
    	for(int i=1;i<=n;i++){
    		a[i]=lower_bound(c+1,c+1+2*n,a[i])-c;
    		b[i]=lower_bound(c+1,c+1+2*n,b[i])-c;
    		for(int j=a[i];j<b[i];j++)	f[j]=1;
    	}
    	for(int i=1;i<=2*n;i++)
    		if(f[i]==1)	ans+=c[i+1]-c[i]; 
    	cout<<ans<<endl;  
    	return 0;
    }
    
    • 0
      @ 2025-8-29 2:05:22

      555

      • 0

        将起点与终点分别排序,依次相加,在比较前一项终点与后一项起点判断是否有重叠,若有则减去重叠部分:

        #include<bits/stdc++.h>
        using namespace std;
        int a[100010],b[100010];
        inline int read()
        {
        	int x=0,f=1;
        	char c=getchar();
        
        	while(c<'0'||c>'9')
        	{
        		if(c=='-')f=-1;
        		c=getchar();
        	}
        	while(c>='0'&&c<='9')
        	{
        		x=x*10+c-'0';
        		c=getchar();
        	}
        return x*f;
        }
        int main()
        {
        	int n;
        	long long m=0;
        	n=read();
        	for(int i=1;i<=n;i++)
        	{
        		a[i]=read();
        		b[i]=read();
        	}
        	sort(a+1,a+n+1);sort(b+1,b+n+1);
        	for(int i=1;i<=n;i++)
        	{
        		m+=b[i]-a[i];
        		if(i+1<=n)
        		{
        			if(b[i]>a[i+1])
        			{
        					m-=-a[i+1]+b[i];
        			}
        		
        		}
        	}
        	cout<<m;
        	return 0;
        }
        
        • 1

        信息

        ID
        824
        时间
        1000ms
        内存
        256MiB
        难度
        9
        标签
        递交数
        9
        已通过
        4
        上传者