题目大意:数轴上有若干个彩色的点,求最短区间,使其包含所有颜色的点至少一个
题解:做法挺多的,例如说堆,二分……我写的大概是一个叫尺取法的东西,就是维护两个指针,表示区间的两个端点,然后移动……感觉跟莫队的维护方法差不多……
我的收获:get
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int M=1000005;
#define p first
#define c second
int n,k,t;
pair <int,int> a[M];
int map[65];
void move(int &x,int &tot){
x++;if(!map[a[x].c]) tot++;map[a[x].c]++;
}
void back(int &x,int &tot){
map[a[x].c]--;if(!map[a[x].c]) tot--;x++;
}
void work()
{
int l=1,r=0,now=0,ans=INF;
while(l<=n)
{
while(r<n&&now<k) move(r,now);
if(now>=k) ans=min(ans,a[r].p-a[l].p);
back(l,now);
}
cout<<ans<<endl;
}
void init()
{
cin>>n>>k;
for(int i=1,x;i<=k;i++){
scanf("%d",&x);
for(int j=1;j<=x;j++)
scanf("%d",&a[++t].p),a[t].c=i;
}
sort(a+1,a+1+t);
}
int main()
{
init();
work();
}