Link:
Solution:
这题直接上尺取法就行了吧
先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置
每次取出第一个颜色,更新答案。将其下一个放入队列中去,更新$mx$
Tip:此题BZOJ无故TLE,本机和Luogu都能AC
Code:
#includeusing namespace std;typedef long long ll;typedef pair P;int n,k,cur[65];ll mx,res=1ll<<31,a[65][1000005];int main(){ priority_queue ,greater
> q; scanf("%d%d",&n,&k); for(int i=1;i<=k;i++) { scanf("%d",&a[i][0]); for(int j=1;j<=a[i][0];j++) scanf("%lld",&a[i][j]); q.push(P(a[i][1],i)); mx=max(mx,a[i][1]);cur[i]=1; } for(int i=1;i<=n-k+1;i++) { P t=q.top();ll now=t.second; res=min(res,mx-t.first); cur[now]++;if(cur[now]>a[now][0]) break; q.pop();q.push(P(a[now][cur[now]],now)); if(a[now][cur[now]]>mx) mx=a[now][cur[now]]; } printf("%lld",res); return 0;}