[BZOJ 1293] 生日礼物

Link:

BZOJ 1293 传送门

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;
}

 

posted @ 2018-07-08 21:52  NewErA  阅读(194)  评论(0编辑  收藏  举报