1 条题解

  • 0
    @ 2025-12-17 19:12:53

    离散化+双指针版:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    int b[N],blen;vector<int>G[N],G1[100];int sum[100];
    int main()
    {
    	int n,m;cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int sum;cin>>sum;
    		for(int j=1,x;j<=sum;j++)cin>>x,b[++blen]=x,G1[i].push_back(x);
    	}
    	sort(b+1,b+blen+1);int k=unique(b+1,b+blen+1)-b-1;
    	for(int i=1;i<=m;i++)
    		for(int j:G1[i])
    		{
    			int x=lower_bound(b+1,b+k+1,j)-b;
    			G[x].push_back(i);
    		}
    	int l=1,r=0,s=0;
    	while(s!=m)
    	{
    		r++;
    		for(int y:G[r]){if(sum[y]==0)s++;sum[y]++;}
    	}
    	int ans=b[r]-b[l];
    	for(;r<=k;)
    	{
    		while(1)
    		{
    			if(l==r)break;
    			bool bk=1;
    			for(int i:G[l])if(sum[i]==1){bk=0;break;}
    			if(!bk)break;
    			for(int i:G[l])sum[i]--;l++;
    		}
    		ans=min(ans,b[r]-b[l]);
    		r++;
    		for(int i:G[r]){sum[i]++;}
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    2946
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者