题意:
有一个有n个彩珠、m种彩珠的彩带,使每一种彩珠都包含的最小长度是多少?
思路:
离散+尺取法
代码:
#include <bits/stdc++.h> typedef long long ll; using namespace std; const ll inf=998244353; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } map<int,int> ma; struct w { int k, w; } a[1000005]; int ji=0, mb[1000005]; bool cmp(struct w x,struct w y) { return x.w<y.w; } int main() { int n=read(), k=read(); for(int i=1; i<=k; i++) { int ki; ki=read(); for(int j=1; j<=ki; j++) { a[ji].w=read(); a[ji++].k=i; } } sort(a,a+ji,cmp); int l=0, shu=0, ans=inf; for(int i=0; i<ji; i++) { if(!mb[a[i].k]) { shu++; } mb[a[i].k]++; while(shu==k) { ans=min(a[i].w-a[l].w,ans); if(mb[a[l].k]==1) { shu--; } mb[a[l].k]--; l++; } } cout << ans << endl; return 0; }