【bzoj1293】【SCOI2009】【生日礼物】

    xiaoxiao2025-08-16  2

    题目大意

    在坐标轴上有不同种类的一些点,求最短的区间包含所有种类的点。

    解题思路

    可以考虑找到第一个合法区间,当左指针右移时有可能是某一些种类没被包含,这时我们可以加入下一个当前种类的点,每个点只会被加入一次,因此O(n)。

    code

    #include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LF double #define LL long long #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=1000000,maxk=60,inf=2147483647; int n,k,t[maxk+10],p[maxk+10],a[maxn+1]; int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&k); fo(i,1,k){ scanf("%d",&t[i]);p[i]=a[0]+1; fo(j,1,t[i])scanf("%d",&a[++a[0]]); t[i]=a[0]; } int mi=inf,mx=-inf; fo(i,1,k)mi=min(mi,a[p[i]]),mx=max(mx,a[p[i]]); int ans=mx-mi; for(;1;){ int mi=inf,pos; fo(i,1,k) if(a[p[i]]<mi){ mi=a[p[i]]; pos=i; } if(p[pos]!=t[pos]){ p[pos]++; int mi=inf,mx=-inf; fo(i,1,k){ if(a[p[i]]<mi)mi=a[p[i]]; if(a[p[i]]>mx)mx=a[p[i]]; } if(mx-mi<ans)ans=mx-mi; }else{ printf("%d",ans); return 0; } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1301792.html
    最新回复(0)