[BZOJ 1293] 生日礼物
Link:
Solution:
这题直接上尺取法就行了吧
先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置
每次取出第一个颜色,更新答案。将其下一个放入队列中去,更新$mx$
Tip:此题BZOJ无故TLE,本机和Luogu都能AC
Code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,int> P; int n,k,cur[65]; ll mx,res=1ll<<31,a[65][1000005]; int main() { priority_queue<P,vector<P>,greater<P> > 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; }