bzoj1293 [SCOI2009]生日礼物 set暴力

53 篇文章 0 订阅
25 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值