我只会打尺取法……怎么破
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 1e6 + 5;
int tong[60 + 5];
bool a[MAXN][60 + 5];
int n,k;
vector <int> lsh;
int where(int x)
{
return lower_bound(lsh.begin(),lsh.end(),x) - lsh.begin();
}
int cqf()
{
int l = 0,r = -1,minn = 2147483647;
int ans = 0;
while(true)
{
int maxn = lsh.size();
while(ans < k && r < maxn)
{
r++;
for(int i = 1;i <= k;i ++)
{
if(!a[r][i])
continue;
if(!tong[i])
ans++;
tong[i]++;
}
}
if(ans < k)
return minn;
minn = min(minn,lsh[r] - lsh[l]);
for(int i = 1;i <= k;i ++)
{
if(!a[l][i])
continue;
tong[i] --;
if(!tong[i])
ans--;
}
l++;
}
return 0;
}
vector <int> z[60 + 5];//x[i] 第i种珠子有这么多个
int m,x;
int main()
{
scanf("%d %d",&n,&k);
for(int i = 1;i <= k;i ++)
{
scanf("%d",&m);
for(int j = 1;j <= m;j ++)
{
scanf("%d",&x);
z[i].push_back(x);
lsh.push_back(x);
}
}
sort(lsh.begin(),lsh.end());
unique(lsh.begin(),lsh.end());
vector<int>::iterator it;
for(int i = 1;i <= k;i ++)
for(it = z[i].begin();it != z[i].end();it++)
a[where(*it)][i] = true;
printf("%d\n",cqf());
return 0;
}
看的黄学长博客里的单调队列好神啊……
大家去看吧,我也不敢转载……2333