Description
小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个,分为K种。简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上。 小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。
对于50%的数据, N≤10000;
对于80%的数据, N≤800000;
对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31
Solution
水题,一遍过
用60个set记录每种颜色珠子的位置,然后每次删掉位置最左的珠子同时更新答案即可
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <set>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
using std:: set;
using std:: min;
using std:: max;
const int INF=2000002;
set<int> pos[61];
int main(void) {
int n,m; scanf("%d%d",&n,&m);
rep(i,1,m) {
int cnt; scanf("%d",&cnt);
rep(j,1,cnt) {
int x; scanf("%d",&x);
pos[i].insert(x);
}
}
int ans=INF;
rep(j,1,n) {
int mx=0,mn=INF,rec=-1;
rep(i,1,m) {
if (*pos[i].begin()<mn) {
mn=*pos[i].begin();
rec=i;
}
mx=max(mx,*pos[i].begin());
}
if (rec!=-1) {
ans=min(ans,mx-mn);
pos[rec].erase(mn);
}
}
printf("%d\n",ans);
return 0;
}