【BZOJ 1293】[SCOI2009]生日礼物

【链接】我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


显然的滑动窗口题。
(尺取法

如果l..i这一段已经有k种珍珠了。
那么就尝试把l++;
(即把l这个影响尝试去掉一下

如果不足k种珍珠了,那么就把l++撤销。
否则l++照常
(离散化一下数据

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};

const int N = 1e6;
const int K = 60;

int n,k,cnt[K+10];
vector<int> v[K+10],V,num[N+10];

int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    scanf("%d%d",&n,&k);
    rep1(i,1,k){
        int num;
        scanf("%d",&num);
        rep1(j,1,num){
            int x;
            scanf("%d",&x);
            v[i].pb(x);
            V.push_back(x);
        }
    }

    sort(all(V));
    n = unique(all(V))-V.begin();

    rep1(i,1,k){
        rep1(j,0,(int)v[i].size()-1){
            int x = v[i][j];
            x = lower_bound(all(V),x)-V.begin();
            num[x].pb(i);
        }
    }

    int l = 0,_count = 0,ans = -1;
    rep1(i,0,n-1){
        rep1(j,0,(int)num[i].size()-1){
            int x = num[i][j];
            cnt[x]++;
            if (cnt[x]==1) _count++;
        }
        while (_count==k){
            //尝试把l++
            rep1(j,0,(int)num[l].size()-1){
                int x = num[l][j];
                cnt[x]--;
                if (cnt[x]==0) _count--;
            }
            if (_count<k){
                rep1(j,0,(int)num[l].size()-1){
                    int x = num[l][j];
                    cnt[x]++;
                    if (cnt[x]==1) _count++;
                }
                break;
            }
            l++;
        }
        if (_count==k){
            if (ans==-1){
                ans = V[i]-V[l];
            }else{
                ans = min(ans,V[i]-V[l]);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

相关推荐